read-from-minibuffer
是提示用户输入单行文本的好方法。如何在 elisp 中提示用户输入一大块多行文本?
这是我的想法,但我不知道这是不是最顺利的做法:
- 创建一个临时缓冲区(通过
with-temporary-buffer
?) - 用一些默认文本作为缓冲区的种子
- 显示缓冲区
- 告诉用户,“根据您的需要编辑文本,然后点击
表示您已完成”(可能通过 header-line-format
) - 等待用户按下按键序列
- 收集缓冲区文本并将其放入变量中(通过
buffer-string
) - 销毁临时缓冲区并恢复之前的窗口布局
- 对文本进行处理
最佳答案
(defun my-read-mb-lines (prompt some-keyseq)
(let ((keymap (copy-keymap minibuffer-local-map)))
(define-key keymap (kbd "RET") 'newline)
(define-key keymap some-keyseq 'exit-minibuffer)
(read-from-minibuffer prompt nil keymap)))
调用示例:
(my-read-mb-lines "Insert text (C-s to submit): " (kbd "C-s"))
'let' block 创建迷你缓冲区默认键盘映射的本地副本。接下来的两次调用“define-key”修改键映射副本。之后,“read-from-minibuffer”传递修改后的键盘映射供迷你缓冲区使用,同时提示用户(而不是其默认键盘映射“minibuffer-local-map”)。
FWIW,C-j 默认映射到“exit-minibuffer”,可以写一个简化版本:
(defun my-simplified-read-mb-lines (prompt)
(let ((keymap (copy-keymap minibuffer-local-map)))
(define-key keymap (kbd "RET") 'newline)
(read-from-minibuffer prompt nil keymap)))
调用示例:
(my-simplified-read-mb-lines "Insert text (C-j to submit): ")
关于emacs - 如何在 elisp 中提示用户输入一段文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16992726/