根据PWD更新多项缓冲区名称

时间:2012-12-01 02:28:54

标签: emacs elisp term

如果我使用konsole或其他终端,终端标签名称可以根据PWD进行更改。但在多学期中,缓冲区名称为*terminal<number>*。这不是很好。因为当我在它们之间切换时,名称不是很有用。所以我想根据PWD重命名它。

我发现 Enter键绑定到term-send-raw,所以我写了一个函数

(defadvice term-send-raw (around rename-term-name activate)
  (progn
    (rename-buffer 
     (concat "⇒ " 
             (shell-command-to-string "pwd | xargs basename |  tr -d '\n'") 
             (format-time-string " [%M ∞ %S]")))
    ad-do-it))

但问题是pwd命令返回终端缓冲区的PWD,而不是该终端中PWD的{​​{1}}。

终端缓冲区的SHELLPWD设置。当defcustom multi-term-default-dir中的PWD更改时,它不会发生变化。

SHELL

如何在终端获得SHELL的PWD?

问候。

2 个答案:

答案 0 :(得分:2)

AFAIK没有简单的方法可以从正在运行的进程中检索信息。

但是如果你想获得当前目录,你可以:

  1. 要求shell打印它
  2. 解析并跟踪cd,pushd,popd等函数的命令行。
  3. poll / proc / PID / cwd
  4. 第一种方法在term.el的标题中描述( Mx find-library RET term RET )。

    现在,谢谢你的提问,你给了我这样做的机会:

    (defadvice term-send-input (after update-current-directory)
      (let* ((pid (process-id (get-buffer-process (current-buffer))))
             (cwd (file-truename (format "/proc/%d/cwd" pid))))
        (cd cwd)))
    
    (ad-activate 'term-send-input)
    

    这是第三种方法的简单实现,如果用户使用sussh,则无效。但是,我不知道是否可以使用第一种或第二种方法。

    在您的情况下,您只需将cd命令替换为您想要的任何内容。

答案 1 :(得分:0)

基于Daimrod对polling / proc / PID / cwd的回答,我找到了解决问题的方法,Reed指出了建议没有立即获取更新的CWD并且你必须按两次Enter键。 / p>

如果您将CWD更新代码移动到其自己的函数并使用运行时间稍后从建议中调用它,它将正确地获取更新的CWD。不幸的是,我对Emacs的日程安排知之甚少,无法解释为什么会有效(任何启示都会受到赞赏)。

这是我基于Daimrod的代码。注意我为char-mode建议了line-mode和term-send-return的term-send-input。我在Emacs 24.3.1上使用多项测试了这个:

(defadvice term-send-input (after update-current-directory)
  (run-at-time "0.1 sec" nil 'term-update-dir)
  )

(ad-activate 'term-send-input)

(defadvice term-send-return (after update-current-directory)
  (run-at-time "0.1 sec" nil 'term-update-dir)
  )

(ad-activate 'term-send-return)

(defun term-update-dir ()
  (let* ((pid (process-id (get-buffer-process (current-buffer))))
         (cwd (file-truename (format "/proc/%d/cwd" pid))))
    (unless (equal (file-name-as-directory cwd) default-directory)
      (message (concat "Switching dir to " cwd))
      (cd cwd)))
  )