2014-09-19 252 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")