如何在打开emacs中的每个缓冲区之前重新评估shell环境并重新评估frame-title-format

时间:2014-01-21 00:13:53

标签: git bash shell emacs ubuntu-12.04

我已将我的git source + repo名称集成到我的emacs框架标题中,因此我可以确定当前正在处理的分支/回购。我这样做是通过PROMPT_COMMAND在bash shell中设置此信息,然后通过init.el命令在.emacs(或getenv)的emacs启动时获取信息来设置变量frame-title-format

这是我在~/.bashrc中所做的事情:


PROMPT_COMMAND="export GIT_REPO_NAME=\$(git remote -v 2> /dev/null | grep \"origin.\*fetch\" | awk '{print \$2}' | sed 's,https://github.com/\(.\*\)/\(.\*\),\1,g'); export GIT_BRANCH=\$(git branch 2> /dev/null | grep \"^*\" | awk '{print \$2}')"

这就是我在~/.emacs.d/init.el中所做的事情:


;;; Rest of init.el code
(setq-default
  frame-title-format
  (concat 
   "%f"
   (if (getenv "GIT_BRANCH")
       (concat " in [ " (getenv "GIT_BRANCH") "/" (getenv "GIT_REPO_NAME") " ]"))))

;;; All the other goodies in init.el

这一切都很精彩,但不幸的是,这并不总是准确的,因为框架标题是由env命令设置的,当{emase是ecs}时,PROMPT_COMMAND命令在pwd中评估我的 gitRepoA (branch X) |-> buffer1.txt |-> buffer2.txt gitRepoB (branch Y) |-> buffer1.txt |-> buffer2.txt 开始。如果在同一个emacs会话中,我在属于另一个repo / branch的另一个目录中打开一个缓冲区,例如,我的帧标题不正确。

所以我的问题是,我可以通过任何方式让emacs在shell中重新运行git命令,以获取缓冲区所在目录的源/ repo名称,以便不同的缓冲区显示正确的git分支/ repo名称?

考虑以下目录结构:

buffer1.txt

我们假设我在(目录)gitRepoA中为文件buffer1.txt in branch X in repo gitRepoA启动了emacs。然后我看到一个框架标题buffer2.txt

如果我在同一个emacs会话中打开gitRepoB branch Y(目前已检出buffer2.txt in branch Y in repo gitRepoB),我希望看到buffer2.txt in branch X in repo gitRepoA。当然,目前,它会说git status。完全错了。

如果我们能够解决这个问题,我想解决在{{1}}级别更改后重新评估已经打开的缓冲区状态的更普遍的问题(例如提交,或结账等。)。

任何帮助/见解深深感激。另外,对我的问题更合适的标题表示赞赏 - 我无法在一个标题中阐述我的问题。感谢。

1 个答案:

答案 0 :(得分:0)

以下是设置frame-title的完整示例,目前仅适用于git repos

(defun my-get-frame-title ()
  "If inside a git repo return a string containing git repo, branch and file state else
return default frame title"
  (let* ((file (buffer-file-name))
         (git-directory (when file
                          (locate-dominating-file (file-truename default-directory) ".git"))))
    (if git-directory
        (concat (file-name-nondirectory (buffer-file-name))  
                " on " (vc-working-revision file) 
                " in " (file-name-nondirectory (directory-file-name git-directory))
                " current state is " (symbol-name (vc-state file)))
      (concat invocation-name "@" system-name))))

(setq-default
  frame-title-format
  '(:eval (my-get-frame-title)))

这会在git repos中以[{1}}格式设置框架标题,否则会回退到emacs的默认框架标题