haskell / haskeline

A Haskell library for line input in command-line programs.
https://hackage.haskell.org/package/haskeline
BSD 3-Clause "New" or "Revised" License
221 stars 75 forks source link

[Feature request] Alternatives to Esc/Alt + key for vi mode #27

Open ghost opened 9 years ago

ghost commented 9 years ago

Hi,

I'm used to using vi mode for pretty much anything I can. The thing is, the way I use vi is by entering Alt+key combinations to go into normal mode instead using the –in my opinion– burdensome Esc key. This works in quite a few terminal emulators including Linux's non-graphical TTYs (usually accessed with Alt+Ctrl+Fn).

However, this trick does not work with haskeline since it interprets Esc instantly followed by a key k as metaKey k. This makes haskeline based UIs (in my case, mainly ghci) very cumbersome to use for me, and if I had to guess, a few others too.

I'm currently going around this issue by simply commenting out the part of the code responsible for this behaviour like so:

diff -ur System.orig/Console/Haskeline/Backend/Posix.hsc System/Console/Haskeline/Backend/Posix.hsc
--- System.orig/Console/Haskeline/Backend/Posix.hsc 2014-12-23 03:32:27.000000000 +0100
+++ System/Console/Haskeline/Backend/Posix.hsc  2015-09-20 20:04:31.849770372 +0200
@@ -193,10 +193,10 @@
 lexKeys baseMap cs
     | Just (k,ds) <- lookupChars baseMap cs
             = k : lexKeys baseMap ds
-lexKeys baseMap ('\ESC':cs)
--- TODO: what's the right thing ' to do here?
-    | k:ks <- lexKeys baseMap cs
-            = metaKey k : ks
+-- lexKeys baseMap ('\ESC':cs)
+-- -- TODO: what's the right thing ' to do here?
+--     | k:ks <- lexKeys baseMap cs
+--             = metaKey k : ks
 lexKeys baseMap (c:cs) = simpleChar c : lexKeys baseMap cs

 lookupChars :: TreeMap Char Key -> [Char] -> Maybe (Key,[Char])

I then recompile GHC, and, since I don't use any Alt shortcuts anyway, all is fine for me.

Still, I feel it would be nice if there was an option to change this behaviour at runtime, perhaps by letting the user enter a sequence like Ctrl-v + Alt-k while in insert mode, which would be interpreted "verbatim" as Alt-k.

Would you be interested in implementing such a functionality, or at least would you be prepared to accept a pull request providing it? Please let me know. In the latter case, I will see what I can do but might have to ask you a few questions for guidance.