如何在elisp中提示用户输入文本块?

时间:2013-06-07 20:50:16

标签: emacs elisp

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

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

  1. 创建一个临时缓冲区(通过with-temporary-buffer?)
  2. 使用一些默认文本
  3. 播种缓冲区
  4. 显示缓冲区
  5. 告诉用户,"根据需要编辑文本,然后点击<某些键序列>表明你已经完成了#34; (也许是通过header-line-format
  6. 等待用户按键序列
  7. 收集缓冲区文本并将其放入变量(通过buffer-string
  8. 销毁临时缓冲区并恢复之前的窗口布局
  9. 用文字做

3 个答案:

答案 0 :(得分: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'块创建迷你缓冲区默认键映射的本地副本。接下来两次调用“define-key”会修改keymap副本。之后,“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): ")

答案 1 :(得分:2)

我认为这取决于确切的用例?

您提出的方法的示例并不缺乏(例如编写VCS提交消息),所以当然没有任何问题 - 它是经过验证的。另外,如果它确实是一个大的(或根本不是)文本块,那么我怀疑提供一个正常的缓冲区来编辑可能会为用户提供最好的体验。

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

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

答案 2 :(得分:2)

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

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

请参阅org-edit-special的来源了解其工作原理。

它比你需要的多一点。

基本上,您希望为创建的缓冲区设置一个次模式 绑定以收集文本和恢复窗口配置。

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