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

标签 emacs elisp

如果我使用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?

问候。

最佳答案

据我所知,没有简单的方法可以从正在运行的进程中检索信息。

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

  1. 要求 shell 打印它
  2. 解析并跟踪 cd、pushd、popd 等函数的命令行...
  3. 轮询/proc/PID/cwd

第一个方法在 term.el 的 header 中描述(M-xfind-libraryRET术语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 命令替换为您想要的任何命令即可。

关于emacs - 根据 PWD 更新多项缓冲区名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13655782/

相关文章:

emacs - 在 emacs 中使用 gnus 从 microsoft exchange(2010) 访问邮件

Emacs 命令在光标上方插入和缩进行

emacs - Emacs 24 中变量作用域的新规则是什么?

emacs - 如何设置SPC在minibuffer模式下充当Enter?

emacs - Emacs,Windows,流浪汉,Plink仍然不起作用

Emacs 宏在 .emacs 文件中有效,但在源文件中无效?

linux - 使用 Emacs 编辑 GVFS 挂载文件

emacs - "Package-Requires"太长怎么办?

emacs - 修补菜单,出现 "Wow, indirect keymap entry"错误

emacs - 使用 org-element-map 获取 org-mode 元素的文本