elisp:对当前文件的call命令

时间:2011-01-15 00:31:37

标签: emacs elisp

我想在emacs中设置一个键,对缓冲区中的文件执行shell命令,并在不提示的情况下还原缓冲区。 shell命令是:p4 edit 'currentfilename.ext'

(global-set-key [\C-E] (funcall 'revert-buffer 1 1 1)) 
;; my attempt above to call revert-buffer with a non-nil 
;; argument (ignoring the shell command for now) -- get an init error:
;; Error in init file: error: "Buffer does not seem to be associated with any file"

全新的elisp。从emacs manual开始,这里是revert-buffer的定义:

Command: revert-buffer &optional ignore-auto noconfirm preserve-modes

谢谢!

2 个答案:

答案 0 :(得分:8)

您看到的实际错误是因为您错误地指定了global-set-key,即函数调用。你想要的是:

(global-set-key (kbd "C-S-e") '(lambda () (revert-buffer t t t)))

您的.emacs加载时实际正在评估funcall,这是导致错误的原因。

然后,要获得整个事情,您可以创建一个命令,如:

(defun call-something-on-current-buffers-file ()
  "run a command on the current file and revert the buffer"
  (interactive)
  (shell-command 
   (format "/home/tjackson/bin/dummy.sh %s" 
       (shell-quote-argument (buffer-file-name))))
  (revert-buffer t t t))
(global-set-key (kbd "C-S-e") 'call-something-on-current-buffers-file)

显然可以自定义命令,并根据需要添加错误检查。

答案 1 :(得分:0)

也许使用次要模式“auto-revert-mode”是一个选项。 只需在当前缓冲区上启用它:

M-x "auto-revert-mode"

并始终确保在执行外部命令之前保存缓冲区。