Currently in mg, if the cursor is in a region and the 'delete' or
'backspace' keys are pressed mg will not behave any differently than
if the cursor wasn't in a region. The diff below makes mg behave
like emacs and kills the region and places it into the kill buffer.

ok?

Mark

Index: mg.1
===================================================================
RCS file: /cvs/src/usr.bin/mg/mg.1,v
retrieving revision 1.109
diff -u -p -u -p -r1.109 mg.1
--- mg.1        13 Dec 2018 14:59:16 -0000      1.109
+++ mg.1        17 Dec 2018 16:34:41 -0000
@@ -475,6 +475,8 @@ Delete backwards
 characters.
 Like delete-char, this actually does a kill if presented
 with an argument.
+If the cursor is in a region, the region is removed and placed
+in to the kill buffer.
 .It delete-blank-lines
 Delete blank lines around dot.
 If dot is sitting on a blank line, this command
@@ -486,6 +488,8 @@ Delete
 characters forward.
 If any argument is present, it kills rather than deletes,
 saving the result in the kill buffer.
+If the cursor is in a region, the region is removed and placed
+in to the kill buffer.
 .It delete-horizontal-space
 Delete any whitespace around the dot.
 .It delete-leading-space
Index: util.c
===================================================================
RCS file: /cvs/src/usr.bin/mg/util.c,v
retrieving revision 1.38
diff -u -p -u -p -r1.38 util.c
--- util.c      18 Nov 2015 18:21:06 -0000      1.38
+++ util.c      17 Dec 2018 16:34:41 -0000
@@ -411,7 +411,8 @@ indent(int f, int n)
  * Delete forward.  This is real easy, because the basic delete routine does
  * all of the work.  Watches for negative arguments, and does the right thing.
  * If any argument is present, it kills rather than deletes, to prevent loss
- * of text if typed with a big argument.  Normally bound to "C-D".
+ * of text if typed with a big argument.  Normally bound to "C-d".
+ * If the cursor is in a region, kill the region.
  */
 /* ARGSUSED */
 int
@@ -420,6 +421,9 @@ forwdel(int f, int n)
        if (n < 0)
                return (backdel(f | FFRAND, -n));

+       if (curwp->w_markp != NULL)
+               return(killregion(FFRAND, 1));
+
        /* really a kill */
        if (f & FFARG) {
                if ((lastflag & CFKILL) == 0)
@@ -434,6 +438,7 @@ forwdel(int f, int n)
  * Delete backwards.  This is quite easy too, because it's all done with
  * other functions.  Just move the cursor back, and delete forwards.  Like
  * delete forward, this actually does a kill if presented with an argument.
+ * If the cursor is in a region, kill the region.
  */
 /* ARGSUSED */
 int
@@ -443,6 +448,9 @@ backdel(int f, int n)

        if (n < 0)
                return (forwdel(f | FFRAND, -n));
+
+       if (curwp->w_markp != NULL)
+               return (killregion(FFRAND, 1));

        /* really a kill */
        if (f & FFARG) {

Reply via email to