make edlin understand a few important control keys

Stefan Zegenhagen <[email protected]>
Newsgroups gmane.comp.lang.erlang.patches
Organization arcutronix GmbH
Message-ID <1367844839.31752.73.camel@ax-sze>
Dear all,

the patch attached to this e-mail teaches edlin.erl a few more important
control keys that many users might have become *VERY* accustomed to. The
control keys are:

 - <CTRL>+W	: backward kill word
 - <CTRL>+U	: backward kill line
 - <HOME>	: goto start of line
 - <END>	: goto end of line
 - <CTRL>+<LEFT>  : backward word
 - <CTRL>+<RIGHT> : forward word

With this patch in place, command line editing in erlang's own shell as
well as in any input using io:get_line() comes a little closer to that
in many contemporary shells.


Kind regards,

-- 
Dr. Stefan Zegenhagen

arcutronix GmbH
Garbsener Landstr. 10
30419 Hannover
Germany

Tel:   +49 511 277-2734
Fax:   +49 511 277-2709
Email: [email protected]
Web:   www.arcutronix.com

*Synchronize the Ethernet*

General Managers: Dipl. Ing. Juergen Schroeder, Dr. Josef Gfrerer -
Legal Form: GmbH, Registered office: Hannover, HRB 202442, Amtsgericht
Hannover; Ust-Id: DE257551767.

Please consider the environment before printing this message.

_______________________________________________
erlang-patches mailing list
[email protected]
http://erlang.org/mailman/listinfo/erlang-patches
edlin.patch (text/x-patch, 3.4 KB)
From 39f497adec90fc397f366da275fd5a7ca748cc5f Mon Sep 17 00:00:00 2001
From: Stefan Zegenhagen <[email protected]>
Date: Mon, 6 May 2013 14:39:07 +0200
Subject: [PATCH] [EDLIN] support a few more control keys

Add support for the following control keys that many users have become
accustomed to:
 - <CTRL>+W         : backward kill word
 - <CTRL>+U         : backward kill line
 - <HOME>           : goto start of line
 - <END>            : goto end of line
 - <CTRL>+<LEFT>    : backward word
 - <CTRL>+<RIGHT>   : forward word

It seems that the <CTRL>+<LEFT|RIGHT> control key sequences are
different between terminal emulators, therefore a few possible
combinations were added (similar to how libreadline is configured).
---
 lib/stdlib/src/edlin.erl |   30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/lib/stdlib/src/edlin.erl b/lib/stdlib/src/edlin.erl
index 3192879..f5998c5 100644
--- a/lib/stdlib/src/edlin.erl
+++ b/lib/stdlib/src/edlin.erl
@@ -79,6 +79,14 @@ edit([C|Cs], P, {Bef,Aft}, Prefix, Rs0) ->
     case key_map(C, Prefix) of
 	meta ->
 	    edit(Cs, P, {Bef,Aft}, meta, Rs0);
+    meta_o ->
+        edit(Cs, P, {Bef,Aft}, meta_o, Rs0);
+    meta_csi ->
+        edit(Cs, P, {Bef,Aft}, meta_csi, Rs0);
+    meta_meta ->
+        edit(Cs, P, {Bef,Aft}, meta_meta, Rs0);
+    {csi, _} = Csi ->
+        edit(Cs, P, {Bef,Aft}, Csi, Rs0);
 	meta_left_sq_bracket ->
 	    edit(Cs, P, {Bef,Aft}, meta_left_sq_bracket, Rs0);
 	search_meta ->
@@ -178,6 +186,7 @@ key_map($\^U, none) -> ctlu;
 key_map($\^], none) -> auto_blink;
 key_map($\^X, none) -> ctlx;
 key_map($\^Y, none) -> yank;
+key_map($\^W, none) -> backward_kill_word;
 key_map($\e, none) -> meta;
 key_map($), Prefix) when Prefix =/= meta,
                          Prefix =/= search,
@@ -198,11 +207,29 @@ key_map($d, meta) -> kill_word;
 key_map($f, meta) -> forward_word;
 key_map($t, meta) -> transpose_word;
 key_map($y, meta) -> yank_pop;
+key_map($O, meta) -> meta_o;
+key_map($H, meta_o) -> beginning_of_line;
+key_map($F, meta_o) -> end_of_line;
 key_map($\177, none) -> backward_delete_char;
 key_map($\177, meta) -> backward_kill_word;
 key_map($[, meta) -> meta_left_sq_bracket;
 key_map($D, meta_left_sq_bracket) -> backward_char;
 key_map($C, meta_left_sq_bracket) -> forward_char;
+% support a few <CTRL>+<CURSOR LEFT|RIGHT> combinations...
+%  - forward:  \e\e[C, \e[5C, \e[1;5C
+%  - backward: \e\e[D, \e[5D, \e[1;5D
+key_map($\e, meta) -> meta_meta;
+key_map($[, meta_meta) -> meta_csi;
+key_map($C, meta_csi) -> forward_word;
+key_map($D, meta_csi) -> backward_word;
+key_map($1, meta_left_sq_bracket) -> {csi, "1"};
+key_map($5, meta_left_sq_bracket) -> {csi, "5"};
+key_map($5, {csi, "1;"}) -> {csi, "1;5"};
+key_map($C, {csi, "5"}) -> forward_word;
+key_map($C, {csi, "1;5"}) -> forward_word;
+key_map($D, {csi, "5"})  -> backward_word;
+key_map($D, {csi, "1;5"}) -> backward_word;
+key_map($;, {csi, "1"}) -> {csi, "1;"};
 key_map(C, none) when C >= $\s ->
     {insert,C};
 %% for search, we need smarter line handling and so
@@ -363,6 +390,9 @@ do_op(end_of_line, Bef, [C|Aft], Rs) ->
     {{reverse(Aft, [C|Bef]),[]},[{move_rel,length(Aft)+1}|Rs]};
 do_op(end_of_line, Bef, [], Rs) ->
     {{Bef,[]},Rs};
+do_op(ctlu, Bef, Aft, Rs) ->
+    put(kill_buffer, Bef),
+    {{[], Aft}, [{delete_chars, -length(Bef)} | Rs]};
 do_op(beep, Bef, Aft, Rs) ->
     {{Bef,Aft},[beep|Rs]};
 do_op(_, Bef, Aft, Rs) ->
-- 
1.7.9.5
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.