【问题标题】:Get the content as string of a region in a buffer by elisp program通过elisp程序将内容作为缓冲区中的区域字符串获取
【发布时间】:2018-12-21 00:42:40
【问题描述】:

这是我要解决的问题: 将一段文本转换成字符串数据结构,供elisp程序进行后续处理。挑战在于

  1. 我想在不影响区域选择的情况下交互式地执行一个 elisp 程序
  2. 将字符串值存储到一个变量中,以便我可以进一步操作它。

据我了解,区域由标记和随后的光标位置定义。我通常在 *scratch* 缓冲区中执行 elisp 程序。此外,该区域也在 *scratch* 缓冲区中。

但是要编写函数调用并在缓冲区中执行它,我需要将光标从文本选择(区域)的末尾移开,以便编写

的程序

(setq grabbed (buffer-substring-no-properties (region-beginning) (region-end)))

但随后选择区域会因光标移动而改变。

所以我想知道如何在保持选择不变的同时执行 elisp 程序,并且仍然可以访问返回值。

【问题讨论】:

  • 我认为你应该根据你想要发生的事情来重写你的问题(用户执行的确切步骤以及你想要发生的响应)而不是你的想法如何你需要实现它。正如所写,我只是不明白。
  • 感谢您的反馈!我已经简化了我的问题陈述。
  • 目前还不清楚,对我来说你想做什么。您显示的代码中没有“光标移动”,也不清楚为什么光标移动“为了编写程序”,甚至您如何尝试“编写程序”。也许试着给出你正在尝试的一步一步的食谱,从emacs -Q(没有初始化文件)开始,然后说出你在每一步看到的内容以及你期望看到的内容。

标签: emacs region


【解决方案1】:

如果您想从一些 Elisp 代码运行该函数,但就像用户通过键绑定调用它一样,您可以使用 call-interactively:

(setq variable-to-keep-the-value (call-interactively 'lines-to-list))

但在大多数情况下,您需要自己负责选择函数应应用于文本的哪一部分:

(setq variable-to-keep-the-value 
      (lines-to-list (region-beginning) (region-end)))

请注意,该区域的边界并没有什么神奇之处,无论它们是由鼠标还是什么设置的。

【讨论】:

  • 感谢您的帮助。请参阅我添加的关于无法将我想要的选择保留在同一个缓冲区中以按照您的建议编写函数调用并执行它的讨论。
【解决方案2】:

最后,我找到了一个理想的解决方案!它使用ielm 缓冲区,这是elisp 的真正repl。 在ielm 缓冲区中,我可以将工作缓冲区(由C-c C-b)设置为一个缓冲区,我可以在其中处理要操作的文本,例如*scratch*

然后我可以选择要处理的工作缓冲区的区域,然后我可以在ielm 缓冲区中键入并执行 elisp 代码以提取工作缓冲区中所选区域中的文本,例如,

ELISP> (setq grabbed (buffer-substring-no-properties (region-beginning) (region-end)))
"One\nTwo\nThre"
ELISP> grabbed
"One\nTwo\nThre"
ELISP> (split-string grabbed)
("One" "Two" "Thre")

然后我可以使用设置变量 grabbed 保存的值。

这是对ielm 的非常有用的描述: https://www.masteringemacs.org/article/evaluating-elisp-emacs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多