如果我使用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}}。
终端缓冲区的SHELL
由PWD
设置。当defcustom multi-term-default-dir
中的PWD
更改时,它不会发生变化。
SHELL
如何在终端获得SHELL的PWD?
问候。
答案 0 :(得分:2)
AFAIK没有简单的方法可以从正在运行的进程中检索信息。
但是如果你想获得当前目录,你可以:
第一种方法在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)
这是第三种方法的简单实现,如果用户使用su
或ssh
,则无效。但是,我不知道是否可以使用第一种或第二种方法。
在您的情况下,您只需将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)))
)