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
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
输入两个 ( )
并将光标置于其间。