From 400e7e87a61c43f86a225e7bb4cb6df5a90c667b Mon Sep 17 00:00:00 2001
From: David Hedbor <david@hedbor.org>
Date: Sun, 25 Apr 1999 01:29:28 -0700
Subject: [PATCH] Added lowercase, uppercase and capitalize. Fixed backward
 word.

Rev: lib/modules/Stdio.pmod/Readline.pike:1.12
---
 lib/modules/Stdio.pmod/Readline.pike | 63 ++++++++++++++++++++++++----
 1 file changed, 55 insertions(+), 8 deletions(-)

diff --git a/lib/modules/Stdio.pmod/Readline.pike b/lib/modules/Stdio.pmod/Readline.pike
index 4809bab901..3760d01880 100644
--- a/lib/modules/Stdio.pmod/Readline.pike
+++ b/lib/modules/Stdio.pmod/Readline.pike
@@ -1,4 +1,4 @@
-// $Id: Readline.pike,v 1.11 1999/04/12 02:23:12 hubbe Exp $
+// $Id: Readline.pike,v 1.12 1999/04/25 08:29:28 neotron Exp $
 
 class OutputController
 {
@@ -545,7 +545,7 @@ class InputController
 
 class DefaultEditKeys
 {
-  static private multiset word_break_chars = mkmultiset("\t \n\r/*?_-.[]~&;\!#$%^(){}<>"/"");
+  static private multiset word_break_chars = mkmultiset("\t \n\r/*?_-.[]~&;\!#$%^(){}<>\""/"");
   static object _readline;
 
   void self_insert_command(string str)
@@ -618,6 +618,43 @@ class DefaultEditKeys
     _readline->insert(reverse(c), p-1);
   }
 
+  array find_word_to_manipulate()
+  {
+    int p = _readline->getcursorpos();
+    int ep;
+    string line = _readline->gettext();
+    while(word_break_chars[ line[p..p] ] && p < strlen(line))
+      p++;
+    if(p >= strlen(line)) {
+      _readline->setcursorpos(p);
+      return ({ 0, 0 });
+    }
+    ep = forward_find_word();
+    _readline->delete(p, ep);
+    return ({ line[p..ep-1], p });
+  }
+
+  void capitalize_word()
+  {
+    [string word, string pos]= find_word_to_manipulate();
+    if(word)
+      _readline->insert(String.capitalize(lower_case(word)), pos);
+  }
+
+  void upper_case_word()
+  {
+    [string word, string pos]= find_word_to_manipulate();
+    if(word)
+      _readline->insert(upper_case(word), pos);
+  }
+
+  void lower_case_word()
+  {
+    [string word, string pos]= find_word_to_manipulate();
+    if(word)
+      _readline->insert(lower_case(word), pos);
+  }
+  
   int forward_find_word()
   {
     int p, n;
@@ -632,14 +669,17 @@ class DefaultEditKeys
 
   int backward_find_word()
   {
-    int p = _readline->getcursorpos() , n;
+    int p = _readline->getcursorpos()-1;
     string line = _readline->gettext();
     if(p >= strlen(line)) p = strlen(line) - 1;
-    for(; p >= 0; p--) {
+    while(word_break_chars[ line[p..p] ] && p >= 0)
+      // find first "non break char"
+      p--;
+    for(;p >= 0; p--) 
       if(word_break_chars[ line[p..p] ]) {
-	if(n) break;
-      } else n = 1;
-    }
+	p++; // We want to be one char before the break char.
+	break;
+      }
     return p;
   }
   
@@ -657,9 +697,10 @@ class DefaultEditKeys
   {
     _readline->delete(_readline->getcursorpos(), forward_find_word());
   }
+  
   void backward_delete_word()
   {
-    int sp = backward_find_word() + 1;
+    int sp = backward_find_word();
     int ep = _readline->getcursorpos();
     if((ep - sp) == 0)
       sp--;
@@ -712,6 +753,12 @@ class DefaultEditKeys
     ({ "\\!kd", down_history }),
     ({ "\\!kr", forward_char }),
     ({ "\\!kl", backward_char }),
+    ({ "^[C", capitalize_word }),
+    ({ "^[c", capitalize_word }),
+    ({ "^[U", upper_case_word }),
+    ({ "^[u", upper_case_word }),
+    ({ "^[L", lower_case_word }),
+    ({ "^[l", lower_case_word }),
     ({ "^[D", forward_delete_word }),
     ({ "^[^H", backward_delete_word }),
     ({ "^[^?", backward_delete_word }),
-- 
GitLab