read-from-minibuffer
是一种提示用户输入单行文字的好方法。如何在elisp中提示用户输入大块多行文本?
这就是我的想法,但我不知道它是否是最顺畅的方法:
with-temporary-buffer
?)header-line-format
)buffer-string
)答案 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编辑新缓冲区中的任意块 机器,但它比你需要的更复杂。