在emacs文件打开时执行shell命令

时间:2014-09-19 08:37:47

标签: emacs elisp

我目前正在使用终端终结者, 我有一个bash功能 set_title() { printf '\e]2;%s\a' "$*"; } 这允许我设置终结者窗口标题

所以我想知道是否可以执行这个特定的shell命令(如下所示): set_title ##filename 在emacs中每个打开(或重新打开)所述文件?

(顺便说一句,英语不是我的母语,请放纵!)

2 个答案:

答案 0 :(得分:1)

根据@Dan的建议,你可以做到

(add-hook find-file-hook
  (lambda ()
    (when (string= buffer-file-name "my-file")
      (shell-command "printf ...."))))

在您打开printf时致电"my-file"

但是,如果你想要的是设置帧标题(emacs调用“帧”窗口管理器称之为“窗口”), 你应该设置frame-title-format,例如:

(setq frame-title-format
      '(buffer-file-name "%b - %f" ; File buffer
        (dired-directory dired-directory ; Dired buffer
         (revert-buffer-function "%b" ; Buffer Menu
          ("%b - Dir: " default-directory)))) ; Plain buffer
      icon-title-format "%b")

答案 1 :(得分:1)

如果你的意思是你在终结者里面的bash中运行非GUI Emacs而你希望终结者的标题反映Emacs中的当前文件,那么bash位于其间的事实对你没用:Emacs是控制在这里。

但是你可以定义一个与set_title完成相同工作的Elisp函数:

(defun my-set-title (title)
  (send-string-to-terminal (format "\e]2;%s\a" title)))

然后你可以通过find-file-hook使用它:

(add-hook 'find-file-hook (lambda () (my-set-title buffer-file-name)))

请注意,这会将终端的标题设置为Emacs访问的最后一个文件,因此如果您通过C-x C-b切换回以前的文件缓冲区,标题将不会更新以反映当前缓冲区的文件名。如果你想这样做,你需要更多的东西:

(defvar my-last-file nil)

(defun my-keep-file-title ()
  (when (and buffer-file-name
             (not (equal buffer-file-name my-last-file)))
    (setq my-last-file buffer-file-name)
    (my-set-title buffer-file-name)))

(add-hook 'post-command-hook #'my-keep-file-title)