emacs - 如何在 elisp 中提示用户输入一段文本?

标签 emacs elisp

read-from-minibuffer 是提示用户输入单行文本的好方法。如何在 elisp 中提示用户输入一大块多行文本?

这是我的想法,但我不知道这是不是最顺利的做法:

  1. 创建一个临时缓冲区(通过 with-temporary-buffer?)
  2. 用一些默认文本作为缓冲区的种子
  3. 显示缓冲区
  4. 告诉用户,“根据您的需要编辑文本,然后点击 表示您已完成”(可能通过 header-line-format)
  5. 等待用户按下按键序列
  6. 收集缓冲区文本并将其放入变量中(通过buffer-string)
  7. 销毁临时缓冲区并恢复之前的窗口布局
  8. 对文本进行处理

最佳答案

(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/

相关文章:

emacs - 在 repl 中重新加载一个 ns

emacs - 如何在 Emacs Prelude 中创建与现有文件相匹配的新文件?

regex - emacs:突出平衡表达式(例如 LaTeX 标签)

javascript - 在 Emacs 中编辑文件后 ReactJS 本地服务器崩溃,即使没有保存

javascript - 如何在 emacs 的 js2 模式下 trim 尾随空格

emacs - 评估 emacs 缓冲区中的 mit-scheme 代码?

emacs - 将函数传递给elisp中的参数

emacs - 如何在自动配对模式下插入 $$ 并将光标放在它们之间

emacs - 如何转换为美元和美分——四舍五入,并使用逗号分隔符

emacs - 取消 emacs 中的键绑定(bind)