如何使用 cl-readline 将光标移动到编辑行上

问题描述 投票:0回答:1

我正在尝试学习如何使用

cl-readline
。我想做的一件事是将“(”键绑定到一个函数,该函数插入“()”并在两个字符之间移动光标。我实际上知道如何使用 bash 的
bind
命令来做到这一点:

    bind '"(": "\C-q(\C-q)\C-b"'

但我不知道如何用

cl-readline
做到这一点。到目前为止我已经尝试过类似的事情:

(defun insert-paren (arg key)
  (declare (ignore arg key))
  (rl:insert-text "()")
  (rl:insert-text (format nil "~C[1D" #\Esc)))

(rl:bind-keyseq "(" #'insert-paren)

根据https://tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html,“[1D”是向后移动光标的转义序列。

但这不起作用。它将插入如下所示的文本,而不是向后移动光标:

()^[[1D
terminal common-lisp readline
1个回答
0
投票

cl-readline
没有向前和向后的字符函数,这些函数在readline中定义。

我推送了添加它们的提交(文档更新和示例用法将在未来几天内发布)。

这是一个示例,改编自 cl-readline-example。一旦我们收到 readline 提示,我们就绑定一个键来插入文本并移动光标。


(defun insert-and-move (arg key)
  (rl:insert-text "()")
  (rl:backward-char 1 1))

(defun run-example ()
  (rl:bind-keyseq "\\C-o" #'insert-and-move)
  (rl:bind-keyseq "(" #'insert-and-move)
  (rl:bind-keyseq "\\C-\(" #'insert-and-move)

  (handler-case
      (progn
        (rl:readline :prompt "my readline > ")

    … )

(run-example)

运行示例:

$ sbcl --script example.lisp

现在您可以使用

(
C-(
C-o
输入两个
( )
并将光标置于其间。

© www.soinside.com 2019 - 2024. All rights reserved.