将 shell 命令的输出插入 emacs 缓冲区

Posted

技术标签:

【中文标题】将 shell 命令的输出插入 emacs 缓冲区【英文标题】:Insert the output of shell command into emacs buffer 【发布时间】:2012-09-06 02:37:36 【问题描述】:

我想设置一个键绑定来将日期插入缓冲区。我在.emacs 文件中编写了以下 lisp。以date为例:

;;put the date                                                                  
(global-set-key
 (kbd "C-c C-d")
 (shell-command "date" (current-buffer))
)

当我使用'next-line 等其他命令时,键绑定可以正常工作,但shell-command 会在读取.emacs 时将其放入*scratch* 缓冲区并保留它。

也许我需要使用shell-command-on-region

【问题讨论】:

(current-buffer) 在您的 .emacs 运行时得到评估。您希望使用(shell-command "date" t) 将其插入到调用命令时的当前缓冲区中,或者将其封装在defun 中,以便在执行函数时对其进行评估。 【参考方案1】:

对于将 shell 命令的任何输出插入到当前缓冲区的一般情况,您可以使用内置键盘和弦:

C-u M-! <shell-command>

它运行相同的shell-command 函数,并将输出插入回当前缓冲区中的点。

整个按键本身可以保存为一个宏(也可能分配给一个快捷方式),以便于调用常用的 shell 命令。

【讨论】:

太棒了,尽管在某些情况下最好通过删除末尾的换行符来解决(例如在 ERC、rcirc 等中),在这种情况下转到行/输出的末尾(C-e)然后删除换行隐藏字符:C-d(此添加来自 Mickery Petersen 的 Mastering Emacs 站点)。 有史以来最好的。我的天啊。这立即让我的生活变得更加精彩。【参考方案2】:

我的一个朋友在工作中帮助了我。

(defun put-the-date ()
  (interactive)
  (insert (shell-command-to-string "date")))

(global-set-key
 (kbd "C-c C-d")
 'put-the-date
 )

【讨论】:

不需要调用shell来获取可以在emacs中获取的东西:(insert (format-time-string "%Y-%m-%d %H:%M:%S ")) 谢谢,但我只是将它用作输出某种字符串的 shell 脚本的示例......可能是“echo hi”或“ls”真的......跨度> (global-set-key (kbd "C-c C-d") (lambda () (interactive) (insert (shell-command-to-string "date")))) 使用匿名函数,更简洁。 对于那些邪恶模式的人:(define-key evil-normal-state-map (kbd "SPC f d") (lambda () (interactive) (insert (shell-command-to-string "date +%F_%T")))) @sjas 我实际上更喜欢单独的命令和键绑定,尽管额外的长度很小。 1) 这是内置函数和大多数包使用的模式。 2) 浏览键盘映射(C-h m 或类似)将显示有用的概述,而不是匿名函数。 3)您可以在浏览可用功能时找到新命令,例如在M-x下使用制表符补全时。

以上是关于将 shell 命令的输出插入 emacs 缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

emacs elisp切换到缓冲区并关注

如何在 Emacs 中运行 sudo 命令?

Emacs shell 模式在缓冲区中打开文件

让 Emacs shell 命令发送桌面通知 | Linux 中国

Emacs文件命令

将 Emacs 用于 $PAGER?