Imported from ../bash-2.05b.tar.gz.
[platform/upstream/bash.git] / lib / readline / kill.c
index 90ce6e4..a616b92 100644 (file)
@@ -201,18 +201,21 @@ int
 rl_kill_word (count, key)
      int count, key;
 {
-  int orig_point = rl_point;
+  int orig_point;
 
   if (count < 0)
     return (rl_backward_kill_word (-count, key));
   else
     {
+      orig_point = rl_point;
       rl_forward_word (count, key);
 
       if (rl_point != orig_point)
        rl_kill_text (orig_point, rl_point);
 
       rl_point = orig_point;
+      if (rl_editing_mode == emacs_mode)
+       rl_mark = rl_point;
     }
   return 0;
 }
@@ -222,16 +225,20 @@ int
 rl_backward_kill_word (count, ignore)
      int count, ignore;
 {
-  int orig_point = rl_point;
+  int orig_point;
 
   if (count < 0)
     return (rl_kill_word (-count, ignore));
   else
     {
+      orig_point = rl_point;
       rl_backward_word (count, ignore);
 
       if (rl_point != orig_point)
        rl_kill_text (orig_point, rl_point);
+
+      if (rl_editing_mode == emacs_mode)
+       rl_mark = rl_point;
     }
   return 0;
 }
@@ -242,16 +249,19 @@ int
 rl_kill_line (direction, ignore)
      int direction, ignore;
 {
-  int orig_point = rl_point;
+  int orig_point;
 
   if (direction < 0)
     return (rl_backward_kill_line (1, ignore));
   else
     {
+      orig_point = rl_point;
       rl_end_of_line (1, ignore);
       if (orig_point != rl_point)
        rl_kill_text (orig_point, rl_point);
       rl_point = orig_point;
+      if (rl_editing_mode == emacs_mode)
+       rl_mark = rl_point;
     }
   return 0;
 }
@@ -262,7 +272,7 @@ int
 rl_backward_kill_line (direction, ignore)
      int direction, ignore;
 {
-  int orig_point = rl_point;
+  int orig_point;
 
   if (direction < 0)
     return (rl_kill_line (1, ignore));
@@ -272,8 +282,12 @@ rl_backward_kill_line (direction, ignore)
        rl_ding ();
       else
        {
+         orig_point = rl_point;
          rl_beg_of_line (1, ignore);
-         rl_kill_text (orig_point, rl_point);
+         if (rl_point != orig_point)
+           rl_kill_text (orig_point, rl_point);
+         if (rl_editing_mode == emacs_mode)
+           rl_mark = rl_point;
        }
     }
   return 0;
@@ -287,6 +301,7 @@ rl_kill_full_line (count, ignore)
   rl_begin_undo_group ();
   rl_point = 0;
   rl_kill_text (rl_point, rl_end);
+  rl_mark = 0;
   rl_end_undo_group ();
   return 0;
 }
@@ -321,6 +336,8 @@ rl_unix_word_rubout (count, key)
        }
 
       rl_kill_text (orig_point, rl_point);
+      if (rl_editing_mode == emacs_mode)
+       rl_mark = rl_point;
     }
   return 0;
 }
@@ -341,6 +358,8 @@ rl_unix_line_discard (count, key)
     {
       rl_kill_text (rl_point, 0);
       rl_point = 0;
+      if (rl_editing_mode == emacs_mode)
+       rl_mark = rl_point;
     }
   return 0;
 }
@@ -353,17 +372,14 @@ region_kill_internal (delete)
 {
   char *text;
 
-  if (rl_mark == rl_point)
+  if (rl_mark != rl_point)
     {
-      _rl_last_command_was_kill++;
-      return 0;
+      text = rl_copy_text (rl_point, rl_mark);
+      if (delete)
+       rl_delete_text (rl_point, rl_mark);
+      _rl_copy_to_kill_ring (text, rl_point < rl_mark);
     }
 
-  text = rl_copy_text (rl_point, rl_mark);
-  if (delete)
-    rl_delete_text (rl_point, rl_mark);
-  _rl_copy_to_kill_ring (text, rl_point < rl_mark);
-
   _rl_last_command_was_kill++;
   return 0;
 }
@@ -530,6 +546,8 @@ rl_yank_nth_arg_internal (count, ignore, history_skip)
 
   rl_begin_undo_group ();
 
+  _rl_set_mark_at_pos (rl_point);
+
 #if defined (VI_MODE)
   /* Vi mode always inserts a space before yanking the argument, and it
      inserts it right *after* rl_point. */
@@ -623,6 +641,7 @@ rl_paste_from_clipboard (count, key)
        }
       else
         ptr = data;
+      _rl_set_mark_at_pos (rl_point);
       rl_insert_text (ptr);
       if (ptr != data)
        free (ptr);