2

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

我发现Enter key绑定到 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。并且它不会PWDSHELL.

(defcustom multi-term-default-dir "~/"
  "The default directory for terms if current directory doesn't exist."
  :type 'string
  :group 'multi-term)

如何在终端中获取 SHELL 的 PWD?

问候。

4

3 回答 3

2

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

但是,如果您想获取当前目录,您可以:

  1. 要求外壳打印它
  2. 解析和跟踪 cd、pushd、popd 等函数的命令行......</li>
  3. 轮询 /proc/PID/cwd

第一种方法在term.el( M-xfind-libraryRETtermRET) 的标题中描述。

现在,谢谢你的问题,你给了我这个机会:

(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这是第三种方法的幼稚实现,如果用户使用or ,它就不起作用ssh。但是,我不知道是否可以不使用第一种或第二种方法。

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

于 2012-12-01T11:00:01.033 回答
0

基于 Daimrod 对轮询 /proc/PID/cwd 的回答,我找到了一种解决问题的方法,即 Reed 指出建议不会立即获取更新的 CWD 并且您必须按两次 Enter 键。

如果您将 CWD 更新代码移动到它自己的函数中,并在以后使用 run-at-time 从通知中调用它,它将正确获取更新的 CWD。不幸的是,我对 Emacs 的调度了解不足,无法解释为什么会这样(任何启发都将不胜感激)。

这是我基于 Daimrod 的代码。注意我建议 line-mode 使用 term-send-input,char-mode 使用 term-send-return。我在 Emacs 24.3.1 上使用 multi-term 对此进行了测试:

(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)))
  )
于 2016-06-03T17:08:05.597 回答
0

大多数终端从命令中获取它们的窗口名称echo -en。你zsh可以把它放在你的~/.zshenv

precmd() { echo -en "\e]0;`basename ${PWD}`\a" }

这将获得您的PWD环境变量的基本名称。理想情况下multi-term会做类似的事情并将其放入multi-term-buffer-name,这是保存其缓冲区名称的变量。

是的,这不是一个完整的解决方案。我也希望有一个!

于 2022-02-02T23:14:04.743 回答