While I am 'paragraph' mode, here is the useful 'transpose-paragraph'
command. Comments/ok?

mark

Index: def.h
===================================================================
RCS file: /cvs/src/usr.bin/mg/def.h,v
retrieving revision 1.148
diff -u -p -u -p -r1.148 def.h
--- def.h       24 Sep 2015 07:07:59 -0000      1.148
+++ def.h       24 Sep 2015 18:15:38 -0000
@@ -588,6 +588,7 @@ int          killpara(int, int);
 int             fillword(int, int);
 int             setfillcol(int, int);
 int             markpara(int, int);
+int             transposepara(int, int);
 
 /* word.c X */
 int             backword(int, int);
Index: funmap.c
===================================================================
RCS file: /cvs/src/usr.bin/mg/funmap.c,v
retrieving revision 1.50
diff -u -p -u -p -r1.50 funmap.c
--- funmap.c    24 Sep 2015 07:07:59 -0000      1.50
+++ funmap.c    24 Sep 2015 18:15:38 -0000
@@ -200,6 +200,7 @@ static struct funmap functnames[] = {
        {poptobuffer, "switch-to-buffer-other-window",},
        {togglereadonly, "toggle-read-only" },
        {twiddle, "transpose-chars",},
+       {transposepara, "transpose-paragraph",},
        {undo, "undo",},
        {undo_add_boundary, "undo-boundary",},
        {undo_boundary_enable, "undo-boundary-toggle",},
Index: mg.1
===================================================================
RCS file: /cvs/src/usr.bin/mg/mg.1,v
retrieving revision 1.92
diff -u -p -u -p -r1.92 mg.1
--- mg.1        24 Sep 2015 07:07:59 -0000      1.92
+++ mg.1        24 Sep 2015 18:15:38 -0000
@@ -874,6 +874,10 @@ Toggle the read-only flag on the current
 Transpose the two characters in front of and under dot,
 then move forward one character.
 Treat newline characters the same as any other.
+.It transpose-paragraph
+Transpose adjacent paragraphs.
+If multiple iterations are requested, the current paragraph will
+be moved n paragraphs forward.
 .It undo
 Undo the most recent action.
 If invoked again without an intervening command,
Index: paragraph.c
===================================================================
RCS file: /cvs/src/usr.bin/mg/paragraph.c,v
retrieving revision 1.39
diff -u -p -u -p -r1.39 paragraph.c
--- paragraph.c 24 Sep 2015 07:20:12 -0000      1.39
+++ paragraph.c 24 Sep 2015 18:15:38 -0000
@@ -314,6 +314,50 @@ markpara(int f, int n)
        return (TRUE);
 }
 
+
+/*
+ * Transpose the current paragraph with the following paragraph. If invoked
+ * multiple times, transpose to the n'th paragraph. If invoked between 
+ * paragraphs, move to the previous paragraph, then continue.
+ */
+/* ARGSUSED */
+int
+transposepara(int f, int n)
+{
+       int     i = 0, status;
+       char    flg;
+
+       /* find a paragraph, set mark, then goto the end */
+       gotobop(FFRAND, 1);
+       curwp->w_markp = curwp->w_dotp;
+       curwp->w_marko = curwp->w_doto;
+       (void)gotoeop(FFRAND, 1);
+
+       /* take a note of buffer flags - we may need them */
+       flg = curbp->b_flag;    
+
+       /* clean out kill buffer then kill region */
+       kdelete();
+       if ((status = killregion(FFRAND, 1)) != TRUE)
+               return (status);
+
+       /* 
+        * Now step through n paragraphs. If we reach the end of buffer,
+        * stop and paste the killed region back, then display a message.
+        */
+       if (do_gotoeop(FFRAND, n, &i) == FALSE) {
+               ewprintf("Cannot transpose paragraph, end of buffer reached.");
+               (void)gotobop(FFRAND, i);
+               (void)yank(FFRAND, 1);
+               curbp->b_flag = flg;    
+               return (FALSE);
+       }
+       (void)yank(FFRAND, 1);
+
+       return (TRUE);
+}
+
+
 /*
  * Go down the buffer until we find a line with non-space characters.
  */

Reply via email to