2014-09-19 243 views
1

我目前使用的终端终结者, 和我有一个bash函数 set_title() { printf '\e]2;%s\a' "$*"; } 至极允许我设定的终止窗口标题执行shell命令

所以,我想知道,如果它是可能执行这个特定的shell命令(像这样): set_title ##filename 在emacs中每次打开(或重新打开)上述文件?

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

+0

你可以使用['shell-command'](http://www.emacswiki.org/emacs/ExecuteExternalCommand)和['find-file-hook'](http://www.gnu.org/software/emacs/manual/html_node/elisp/Visiting-Functions.html#Visiting-Functions)来实现此功能。 – Dan 2014-09-19 11:28:57

回答

1

如果你的意思你在Terminator里面运行非GUI Emacs,你想让Terminator的标题反映Emacs中的当前文件,那么bash位于它们之间对你来说是没有用的:Emacs在这里控制着。

但是你可以定义一个elisp的功能,将做同样的工作,为您的SET_TITLE:

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

然后你可以通过查找文件钩使用它:

(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) 
+0

这太棒了!但我会问你最后一件事...目录中是否有相同的内容? – CollioTV 2014-09-19 13:47:14

+1

当然。而不是将'buffer-file-name'传递给'my-set-title',而是将它传递给'(file-name-directory buffer-file-name)'。要查看'file-name-directory'的功能,请尝试'M- :(文件名称目录“/ a/b/c”)RET'。 – Stefan 2014-09-19 13:51:07

1

至于建议由@丹,你可以做

(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")