eshell 便利

eshell でリモートサーバに入って作業をしていると

/

からディレクトリを辿りたくなることがあります。 深い作業ディレクトリから /etc 下のファイルを見に行きたい時などです。

ここで

cd /

としてしまうと、リモートの / ではなくて 当然、自マシンの / へ移動してしまいます。

かといって相対パスで ../../../ なんてやるのも面倒なので リモートサーバの / まで移動する eshell 用コマンド "cd/"を 適当 に作っておきました。

;; リモートホスト / へ移動
(defun eshell/cd\/ ()
  (interactive)
  (let* ( (host-name (concat
                     (car (split-string (eshell/pwd) ":/"))
                     ":/")))
    (eshell/cd host-name)
    ))

// ( を2つ続けると、はてなの markdown で注釈になるのか。。

ちなみに eshell で helm を使うととても便利です。

helm-eshell-history を使うと eshell のコマンド履歴を helm で絞り込み → 入力できます。

コマンドを一部入力した状態で実行すると、 入力した部分に一致する候補が絞り込まれた状態で helm が起動するので便利です。 eshell 標準の eshell-previous-matching-input-from-input と同じような機能ですが、 helm で絞り込みが効くのでより便利だと思います。

helm-esh-pcomplete を使うと pcomplete の補完を helm で選択して入力することができます。 pcomplete をそのまま使うよりもはるかに便利だと思います。 pcomplete を使っているので、リモートサーバの上でも補完が可能です。

ちなみに helm-esh-pcomplete で補完を行うと相対パス絶対パスに変換されて入力されます。 これにより、 eshell の cd を使った移動履歴を helm-eshell-history で絞り込む際に 履歴が全て絶対パスで記録されているため カレントディレクトリを意識せずに cd の履歴を再利用することができます。

"cd " と入力して helm-eshell-history を実行することで、 eshell は autojump 無しで移動したことのあるディレクトリに どんどん移動することができます!!

よく使うので eshell-mode-hook で

(define-key eshell-mode-map (kbd "M-p") 'helm-eshell-history)
(define-key eshell-mode-map [(tab)] 'helm-esh-pcomplete)

と割り当てて使っています。

auto-complete での eshell 補完も設定しているので 簡単な移動は auto-complete で、 リモートなどへの遠い移動や履歴からの補完は helm でと使い分けています。

eshell 便利です。

// とは言うものの、素直に zsh 使った方が良いことが多いですが……