【问题标题】:How to prompt the user for a block of text in elisp?如何在 elisp 中提示用户输入一段文本?
【发布时间】:2013-06-09 14:07:10
【问题描述】:

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

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

  1. 创建一个临时缓冲区(通过with-temporary-buffer?)
  2. 为缓冲区添加一些默认文本
  3. 显示缓冲区
  4. 告诉用户,“编辑你认为合适的文本,然后点击 表示你完成了”(可能通过header-line-format
  5. 等待用户点击按键序列
  6. 收集缓冲区文本并将其放入变量中(通过buffer-string
  7. 销毁临时缓冲区并恢复原来的窗口布局
  8. 处理文本

【问题讨论】:

  • 你真正想做什么? IE。您收集的“文本块”的总体目标是什么?
  • @event_jr:我想写一些我可以在各种情况下重用的库代码

标签: emacs elisp


【解决方案1】:
(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,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): ")

【讨论】:

  • Richard - 在 emacs 24.2 版中,有一个名为“resize-mini-windows”的变量可能会为您设置不同的值。默认值为 'grow-only,但如果将其设置为 true,则可能会获得更好的行为:(let ((keymap (copy-keymap minibuffer-local-map)) (resize-mini-windows t)) 等...
  • 使用“max-mini-window-height”变量可能也会让你到达那里,但它相对较新。
  • 我正在运行 23.4。 max-mini-window-height 设置为 0.25 和 resize-mini-windows 设置为 t,它仍然只显示一行。也许这在 v24 中已修复?
  • 我不这么认为——我只是在 v23.2 的一个裸会话中测试了上面的代码并且它工作正常。它可能是您的自定义/配置设置之一或您调用该功能的方式。如果您使用 -q 标志启动 emacs 并评估暂存缓冲区中的上述代码,您将能够排除您的配置是否是原因。
  • 你是对的:问题是(custom-set-variables '(truncate-lines t))
【解决方案2】:

我想这取决于具体的用例?

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    它比你需要的多一点。

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

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

    【讨论】:

    • 你能提供一个如何使用generic-edit-special的例子吗?
    • 您可以按照 HTMl 的安装说明,在任何 JS 或 CSS 块中点击 C-c '
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多