3

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

这就是我的想法,但我不知道这是否是最流畅的方法:

  1. 创建一个临时缓冲区(通过with-temporary-buffer?)
  2. 使用一些默认文本为缓冲区播种
  3. 显示缓冲区
  4. 告诉用户,“编辑你认为合适的文本,然后点击 <some key sequence> 表示你完成了”(也许通过header-line-format
  5. 等待用户点击按键序列
  6. 收集缓冲区文本并将其放入变量中(通过buffer-string
  7. 销毁临时缓冲区并恢复以前的窗口布局
  8. 用文字做事
4

3 回答 3

3
(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' 块创建 minibuffer 的默认键盘映射的本地副本。接下来的两次“define-key”调用修改了键盘映射副本。之后,“read-from-minibuffer”将修改后的键映射传递给 minibuffer 以在提示用户时使用(而不是其默认键映射,“minibuffer-local-map”)。

FWIW,Cj 默认映射到“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): ")
于 2013-06-08T21:57:55.093 回答
2

我想这取决于确切的用例?

不乏您提出的方法运行良好的示例(例如,编写 VCS 提交消息),因此这当然没有错——它已经过尝试并且是真实的。此外,如果它确实是一大块(或根本不的)文本块,那么我怀疑提供一个正常的缓冲区进行编辑可能会为用户提供最好的体验。

如果您正在谈论收集多个输入字段,包括多行字段,那么基于小部件的方法(如 wvxvw 所建议)将使您能够将所有内容放在一个缓冲区中,这也可能是可取的。

或者您可以使用mail类似的方法,将单个缓冲区用于多个字段,然后解析结果。

于 2013-06-08T00:51:49.670 回答
2

首先,Emacs 23.4 已经很老了。你应该升级。

您描述的工作流程是 org-mode 用来编辑源块的。org-mode 包含在 Emacs 24 中。

查看org-edit-special其工作原理的来源。

它做的比你需要的多一点。

基本上,您想为创建的缓冲区设置一个次要模式,该缓冲区具有收集文本和恢复窗口配置的绑定。

我已经编写了ges来使用 org-mode 机器编辑新缓冲区中的任意块,但它比您需要的更复杂。

于 2013-06-09T06:07:10.650 回答