eshellを使ってみよう
何故か突如大人気?のeshellを使ってみようと思った。
家ではMac、会社でWin。
cdしてlsして・・・dir使えって怒られてという日々なので
同じ環境で使えたら便利じゃんということで試してみた。
設定は偉大な先人方のツギハギでとりあえず動かしています。
;;==================== ;; Eshell ;;==================== ;; Emacs 起動時に Eshell を起動 ;;(add-hook 'after-init-hook (lambda() (eshell))) ;; emacs 起動時に eshell バッファも一つ用意する (add-hook 'after-init-hook (lambda() (eshell) (switch-to-buffer "*scratch*"))) ;; 補完時に大文字小文字を区別しない (setq eshell-cmpl-ignore-case t) ;; 確認なしでヒストリ保存 (setq eshell-ask-to-save-history (quote always)) ;; 補完時にサイクルする ;(setq eshell-cmpl-cycle-completions t) (setq eshell-cmpl-cycle-completions nil) ;;補完候補がこの数値以下だとサイクルせずに候補表示 ;(setq eshell-cmpl-cycle-cutoff-length 5) ;; 履歴で重複を無視する (setq eshell-hist-ignoredups t) ;; prompt 文字列の変更 (defun my-eshell-prompt () (concat (eshell/pwd) "\n→ " )) (setq eshell-prompt-function 'my-eshell-prompt) (setq eshell-prompt-regexp "^[^#$\n]*[#→] ") ;; sudoのあとも補完可能に (defun pcomplete/sudo () "Completion rules for the `sudo' command." (let ((pcomplete-help "complete after sudo")) (pcomplete-here (pcomplete-here (eshell-complete-commands-list))))) ;; トグルする設定 (defun my-toggle-term () "eshell と直前のバッファを行き来する。C-u 付きで呼ぶと 今いるバッファと同じディレクトリに cd して開く" (interactive) (let ((ignore-list '("*Help*" "*Minibuf-1*" "*Messages*" "*Completions*" "*terminal<1>*" "*terminal<2>*" "*terminal<3>*")) (dir default-directory)) (labels ((_my-toggle-term (target) (if (null (member (buffer-name (second target)) ignore-list)) (if (equal "*eshell*" (buffer-name (window-buffer))) (switch-to-buffer (second target)) (switch-to-buffer "*eshell*") (when current-prefix-arg (cd dir) (eshell-interactive-print (concat "cd " dir "\n")) (eshell-emit-prompt))) (_my-toggle-term (cdr target))))) (_my-toggle-term (buffer-list))))) (global-set-key (kbd "C-t") 'my-toggle-term) ;; eshell での補完に auto-complete.el を使う (require 'pcomplete) (add-to-list 'ac-modes 'eshell-mode) (ac-define-source pcomplete '((candidates . pcomplete-completions))) (defun my-ac-eshell-mode () (setq ac-sources '(ac-source-pcomplete ac-source-words-in-buffer ac-source-dictionary))) (add-hook 'eshell-mode-hook (lambda () (my-ac-eshell-mode) (define-key eshell-mode-map (kbd "C-i") 'auto-complete))) ;; キーバインドの変更 (add-hook 'eshell-mode-hook '(lambda () (progn (define-key eshell-mode-map (kbd "C-a") 'eshell-bol) (define-key eshell-mode-map [up] 'eshell-previous-matching-input-from-input) (define-key eshell-mode-map [down] 'eshell-next-matching-input-from-input) (define-key eshell-mode-map (kbd "C-p") 'previous-line) (define-key eshell-mode-map (kbd "C-n") 'next-line) ) )) ;; エスケープシーケンスを処理 ;; http://d.hatena.ne.jp/hiboma/20061031/1162277851 (autoload 'ansi-color-for-comint-mode-on "ansi-color" "Set `ansi-color-for-comint-mode' to t." t) (add-hook 'eshell-load-hook 'ansi-color-for-comint-mode-on) ;; http://www.emacswiki.org/emacs-ja/EshellColor (require 'ansi-color) (require 'eshell) (defun eshell-handle-ansi-color () (ansi-color-apply-on-region eshell-last-output-start eshell-last-output-end)) (add-to-list 'eshell-output-filter-functions 'eshell-handle-ansi-color)
寄せ集めた設定は下記のとおりだと思います。
- プロンプトが"→"なのはなんだか好きで採用させていただいてます
- カーソル上下で自由にeshellバッファ上を行き来できるように
- C-p,C-nでも履歴を前後できるように
- 色はansi-colorで表示できるように
- C-tでeshellと元いたバッファを行ったり来たり
- auto-complete.elを使ってshell上で補完できるように
auto-complete.elでのキーをC-iより他に使いやすいキーを考え中です。
あとは↑↓とC-p/C-nを履歴補完と移動のどちらに振るか悩みます。
ScalaやPythonのREPLで補完や履歴が効かないのは今のところ気合で何とかします。