将 shell 命令的输出插入到 Emacs 缓冲区中。

47

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

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

当我使用其他命令(例如'next-line)时,键绑定运行良好,但是在读取.emacs文件时,shell-command会将其放入*scratch*缓冲区,并保持在那里。

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


1
(current-buffer) 在你的 .emacs 运行时被评估。你想使用 (shell-command "date" t) 将其插入到调用命令时的当前缓冲区中,或者将其封装在 defun 中,以便在执行函数时进行评估。 - tripleee
2个回答

102

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

C-u M-! <shell-command>

这个函数运行相同的shell-command功能,并将输出插入到当前缓冲区中的对应位置。

整个按键过程可以保存为宏(并可能分配给快捷键),以便更轻松地调用常见的shell命令。


1
很棒,尽管有些情况最好在末尾删除换行符(例如,在ERC、rcirc等中),这时候可以到达行/输出的末尾(C-e),然后删除隐藏字符的换行符:C-d(这个技巧来自Mickery Petersen的Mastering Emacs网站)。 - Ben
3
最好的。哇塞。这立刻让我的生活更加精彩。 - uchuugaka

15

我的一个同事帮助了我。

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

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

9
不需要调用 shell 来获取在 Emacs 中可以获得的内容:(insert (format-time-string "%Y-%m-%d %H:%M:%S") - pmielke
7
谢谢,但我只是举例说明一个输出某种字符串的shell脚本...实际上也可以是"echo hi"或者"ls"... - huwr
5
(global-set-key (kbd "C-c C-d") (lambda () (interactive) (insert (shell-command-to-string "date"))))使用了匿名函数,更加简洁。 - sjas
2
对于那些使用evil-mode的人:(define-key evil-normal-state-map (kbd "SPC f d") (lambda () (interactive) (insert (shell-command-to-string "date +%F_%T")))) - sjas
3
@sjas,尽管会稍微增加一点长度,但我更喜欢拥有单独的命令和键绑定。原因如下:1)这是内置函数和大多数软件包使用的模式。2)浏览按键映射(例如 C-h m)将显示一个有用的概述,而不是一个匿名函数。3)在浏览可用函数时,例如在 M-x 下使用制表符完成时,可以找到新命令。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接