【问题标题】:calling shell from emacs从 emacs 调用 shell
【发布时间】:2012-12-28 22:40:06
【问题描述】:

我有一个可以从终端命令行使用的可执行文件。

$ foo "bar" 返回单行文本

我希望能够在编辑文件时调用此函数。

我可以看到我可以做到以下几点

M-! ~/Library/yolo/bin/foo "bar" 我得到了我正在寻找的东西。

所以我正在尝试编写一个可以绑定到键的函数。但我被难住了。

(setq foobar-path "~/Library/yolo/bin/foo ")
(defun foo-bar (func)
  (shell-command (concat foobar-path func)))

(global-set-key (kbd "M-p") foo-bar)

但我知道(emacs 告诉我)我还有很长的路要走。

我最理想的结果是一个键绑定,它可以将一行代码(如评估最后一个表达式)发送到外部函数并在消息栏中的屏幕底部显示返回。

有什么提示吗?

【问题讨论】:

    标签: shell emacs elisp key-bindings


    【解决方案1】:

    您的代码有两个问题:

    • 您需要引用传递给global-set-key 的符号。
    • 函数必须是“命令”。这是通过包含顶级 interactive 表单标记为可交互调用的任何 emacs 函数。

    特别是,如果您想从 minibuffer 中传入 func 参数,您可以这样做:

    (setq foobar-path "~/Library/yolo/bin/foo ")
    (defun foo-bar (func)
      (interactive "sEnter func: ")
      (shell-command (concat foobar-path func)))
    
    (global-set-key (kbd "M-p") 'foo-bar)
    

    【讨论】:

    • 太棒了!只有两个问题......如果发送到 foo-bar 的第一个字符是 / 程序返回但没有值。有没有办法使输入的字符串成为“字符串”?所以`M-p bar -> "bar"。其次,是否有类似于交互的功能,它需要一行文本(如从文件中)?
    • 我认为您必须手动引用该字符串。我认为没有交互式的替代方法,请注意,您仍然需要不带参数的交互式以使函数可绑定到键。
    • 请注意,如果您在 elisp 中构建 shell 命令,您可能希望调用 shell-quote-argument
    • 我建议不要通过 shell,而是直接使用 call-process 运行命令,这样你就不需要引用任何东西了。
    猜你喜欢
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2015-11-06
    • 2010-11-23
    • 1970-01-01
    相关资源
    最近更新 更多