Eshell を使い倒すための Tips いろいろ

    はじめに

    以前から, Emacs の shell 環境として eshell をつかいつづけてきた.

    だいたい, ノウハウがまとまりつつあるので, ここらでスナップショットと して設定をメモしておこうと思う.

    Eshell 固有

    prompt のフォーマット

    prompt のフォーマットを自分独自のものにする.

    (setq eshell-prompt-function
          (lambda ()
            (concat "[tsu-nera"
                    (eshell/pwd)
                    (if (= (user-uid) 0) "]\n# " "]\n$ "))))

    eshell alias

    eshell の alias 設定

    eshell 上では eshell/hoge というコマンドは hoge に置き換えられる.

    (setq eshell-command-aliases-list
          (append
           (list
            (list "ll" "ls -ltr")
            (list "la" "ls -a")
            (list "o" "xdg-open")
            (list "emacs" "find-file $1")
            (list "m" "find-file $1")
            (list "mc" "find-file $1")
            (list "d" "dired .")
            (list "l" "eshell/less $1"))))

    eshell からファイルを開く.

    find-file を利用すると, emacs [ファイル名] というかたちでファイル を開くことができる.

    (list "emacs" "find-file $1")
    (list "m" "find-file $1")
    (list "mc" "find-file $1")

    eshell から dired を開く.

    (list "d" "dired .")

    eshell から less を開く

    独自巻数を追加.

    ;; written by Stefan Reichoer <reichoer@web.de>
    (defun eshell/less (&rest args)
      "Invoke `view-file' on the file.
    \"less +42 foo\" also goes to line 42 in the buffer."
      (interactive)
      (while args
        (if (string-match "\\`\\+\\([0-9]+\\)\\'" (car args))
        (let* ((line (string-to-number (match-string 1 (pop args))))
               (file (pop args)))
          (view-file file)
          (goto-line line))
          (view-file (pop args)))))

    新しいシェルを開く

    Eshell を複数起動するためには, 一工夫必要.

    (defun eshell/make-new-eshell (name)
      "Create a shell buffer named NAME."
      (interactive "sName: ")
      (setq name (concat "$" name))
      (eshell)
      (rename-buffer name))

    eshell with helm

    Eshell と helm を組合せ.

    つかいかた

    (use-package helm-eshell
      :init
      (add-hook 'eshell-mode-hook
            #'(lambda ()
            (define-key eshell-mode-map [remap eshell-pcomplete] 'helm-esh-pcomplete)))
      (add-hook 'eshell-mode-hook
            #'(lambda ()
                    (define-key eshell-mode-map (kbd "M-p") 'helm-eshell-history))))

    shell 共通

    ここからは, eshell 以外でも利用できるものを.

    shell-toggle

    現在ページに移動してでシェルを起動する.

    (require 'shell-toggle)
    ;; eshell をつかう.
    (setq shell-toggle-launch-shell 'shell-toggle-eshell)
    
    ;; フルスクリーンで切り替え
    (setq shell-toggle-full-screen-window-only t)
    
    (global-set-key [M-f1] 'shell-toggle)
    (global-set-key [C-f1] 'shell-toggle-cd)

    shell-pop

    シェルをポップアップ.

    設定すると, 下からピョコットシェルがでてくるので便利.

    (require 'shell-pop)'
    
    (custom-set-variables
     '(shell-pop-default-directory "~/")
     '(shell-pop-shell-type (quote ("eshell" "*eshell*"
                                    (lambda nil (eshell shell-pop-term-shell)))))
     '(shell-pop-term-shell "/usr/bin/zsh")
     '(shell-pop-universal-key "C-t")
     '(shell-pop-window-height 30)
     '(shell-pop-full-span t)
     '(shell-pop-window-position "bottom"))

    exec-path-from-shell

    環境変数 PATH を引き継ぐ.

    (require 'exec-path-from-shell)
    (exec-path-from-shell-initialize)

    Emacs の起動フォルダを変更する.

    C-x C-f で開くディレクトリがデフォルト. Windows だと, Emacs の起動ディレクトリになってしまう.

    default-directory を利用する

    (when windows-p
      (setq default-directory "C:/cygwin64/home/tsu-nera"))

    term-run

    interactive なターミナルアプリを動かす.

    これで, ますます Emacs に引きこもれる.

    (require 'term-run)
    
    (defun term-run-alsamixer ()
      (interactive)
      (term-run-shell-command "alsamixer"))