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コマンドリターンですが、そのターミナルのではありません。PWDPWDSHELL

PWD端末バッファの は によって設定されますdefcustom multi-term-default-dirPWDで変更しても変わりませんSHELL

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

ターミナルでシェルの PWD を取得するにはどうすればよいですか?

よろしく。

4

3 に答える 3

2

私の知る限り、実行中のプロセスから情報を取得する簡単な方法はありません。

ただし、現在のディレクトリを取得したい場合は、次のことができます。

  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これは 3 番目の方法の単純な実装であり、ユーザーがorを使用すると機能しませんssh。ただし、最初または2番目の方法を使用せずに可能かどうかはわかりません。

あなたの場合、cdコマンドを必要なものに置き換えるだけです。

于 2012-12-01T11:00:01.033 に答える
0

/proc/PID/cwd のポーリングに対する Daimrod の回答に基づいて、アドバイスが更新された CWD をすぐに取得せず、Enter キーを 2 回押さなければならないという Reed の指摘の問題を回避する方法を見つけました。

CWD 更新コードを独自の関数に移動し、run-at-time を使用して後でアドバイスから呼び出すと、更新された CWD が正しく取得されます。残念ながら、Emacs のスケジューリングについて、これが機能する理由を説明するのに十分な知識はありません (どんな啓発も歓迎します)。

これがダイムロッドのコードに基づく私のコードです。注: line-mode には term-send-input を、char-mode には term-send-return を使用することをお勧めします。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)))
  )
于 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、バッファ名を保持する変数である に入れます。

はい、これは完全な解決策ではありません。私も1部希望です!

于 2022-02-02T23:14:04.743 に答える