[Lldb-commits] [lldb] f2e6544 - [lldb][Editline] Support ctrl+left/right arrow word navigation.

Jordan Rupprecht via lldb-commits lldb-commits at lists.llvm.org
Thu Nov 14 11:43:53 PST 2019


Author: Jordan Rupprecht
Date: 2019-11-14T11:41:11-08:00
New Revision: f2e65447b3cb6340883957e033e77095a025ebdc

URL: https://github.com/llvm/llvm-project/commit/f2e65447b3cb6340883957e033e77095a025ebdc
DIFF: https://github.com/llvm/llvm-project/commit/f2e65447b3cb6340883957e033e77095a025ebdc.diff

LOG: [lldb][Editline] Support ctrl+left/right arrow word navigation.

Summary:
This adds several 5C/5D escape codes that allow moving forward/backward words similar to bash command line navigation.

On my terminal, `ctrl+v ctrl+<left arrow>` prints `^[[1;5D`. However, it seems inputrc also maps other escape variants of this to forward/backward word, so I've included those too. Similar for 5C = ctrl+right arrow.

Reviewers: JDevlieghere, labath

Reviewed By: JDevlieghere, labath

Subscribers: merge_guards_bot, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D70137

Added: 
    lldb/packages/Python/lldbsuite/test/terminal/TestEditline.py

Modified: 
    lldb/source/Host/common/Editline.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/packages/Python/lldbsuite/test/terminal/TestEditline.py b/lldb/packages/Python/lldbsuite/test/terminal/TestEditline.py
new file mode 100644
index 000000000000..49a46f2de539
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/terminal/TestEditline.py
@@ -0,0 +1,49 @@
+"""
+Test that the lldb editline handling is configured correctly.
+"""
+
+from __future__ import print_function
+
+
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+from lldbsuite.test.lldbpexpect import PExpectTest
+
+
+class EditlineTest(PExpectTest):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    def test_left_right_arrow(self):
+        """Test that ctrl+left/right arrow navigates words correctly.
+
+        Note: just sending escape characters to pexpect and checking the buffer
+        doesn't work well, so we run real commands. We want to type
+        "help command" while exercising word-navigation, so type it as below,
+        where [] indicates cursor position.
+
+        1. Send "el ommand" -> "el ommand[]"
+        2. Ctrl+left once   -> "el []ommand"
+        3. Send "c"         -> "el c[]ommand"
+        4. Ctrl+left twice  -> "[]el command"
+        5. Send "h"         -> "h[]el command"
+        6. Ctrl+right       -> "hel[] command"
+        7. Send "p"         -> "help command"
+        """
+        self.launch()
+
+        # Run help for 
diff erent commands for escape variants to make sure each
+        # one matches uniquely (the buffer isn't cleared in between matches).
+        cases = [
+            ("print", "\x1b[1;5D", "\x1b[1;5C"),
+            ("step", "\x1b[5D", "\x1b[5C"),
+            ("exit", "\x1b\x1b[D", "\x1b\x1b[C"),
+        ]
+        for (cmd, l_escape, r_escape) in cases:
+            self.expect("el {cmd_tail}{L}{cmd_head}{L}{L}h{R}p".format(
+                cmd_head=cmd[0], cmd_tail=cmd[1:], L=l_escape, R=r_escape),
+                substrs=["Syntax: %s" % cmd])
+
+        self.quit()

diff  --git a/lldb/source/Host/common/Editline.cpp b/lldb/source/Host/common/Editline.cpp
index 3e655244b107..3ae837866faf 100644
--- a/lldb/source/Host/common/Editline.cpp
+++ b/lldb/source/Host/common/Editline.cpp
@@ -1105,6 +1105,15 @@ void Editline::ConfigureEditor(bool multiline) {
   el_set(m_editline, EL_BIND, "\t", "lldb-complete",
          NULL); // Bind TAB to auto complete
 
+  // Allow ctrl-left-arrow and ctrl-right-arrow for navigation, behave like
+  // bash in emacs mode.
+  el_set(m_editline, EL_BIND, ESCAPE "[1;5C", "em-next-word", NULL);
+  el_set(m_editline, EL_BIND, ESCAPE "[1;5D", "ed-prev-word", NULL);
+  el_set(m_editline, EL_BIND, ESCAPE "[5C", "em-next-word", NULL);
+  el_set(m_editline, EL_BIND, ESCAPE "[5D", "ed-prev-word", NULL);
+  el_set(m_editline, EL_BIND, ESCAPE ESCAPE "[C", "em-next-word", NULL);
+  el_set(m_editline, EL_BIND, ESCAPE ESCAPE "[D", "ed-prev-word", NULL);
+
   // Allow user-specific customization prior to registering bindings we
   // absolutely require
   el_source(m_editline, nullptr);


        


More information about the lldb-commits mailing list