如果我使用konsole或其他终端,终端标签名称可以根据PWD更改。但在多项中,缓冲区名称是 *terminal<number>*
。这不太好。因为当我在它们之间切换时,名称的信息量不是很大。所以我想根据PWD重命名它。
我发现Enter键绑定(bind)到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
SHELL
的在那个终端。
PWD
终端缓冲区的大小由 defcustom multi-term-default-dir
设置。当 PWD
时它不会改变。更改SHELL
.
(defcustom multi-term-default-dir "~/"
"The default directory for terms if current directory doesn't exist."
:type 'string
:group 'multi-term)
如何在终端中获取SHELL的PWD?
问候。
最佳答案
据我所知,没有简单的方法可以从正在运行的进程中检索信息。
但是如果你想获取当前目录,你可以:
- 要求 shell 打印它
- 解析并跟踪 cd、pushd、popd 等函数的命令行...
- 轮询/proc/PID/cwd
第一个方法在 term.el
的 header 中描述(M-xfind-library
RET术语
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
命令替换为您想要的任何命令即可。
关于emacs - 根据 PWD 更新多项缓冲区名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13655782/