eshell (Emacs のシェルモード) その2

Emacs の eshell の説明の続きです。
  • http://yohshiy.blog.fc2.com/blog-entry-41.html
今回は eshell のカスタマイズとコマンドを自作する方法の紹介です。

終了時の履歴確認

eshell を開いたままで emacs を終了しようとするととデフォルトでは、 毎回履歴を保存するかどうか聞かれて面倒です。
これを変更するには Customize の機能を使用します。
M-x customize-group などで eshell-hist のカスタマイズページを開き、 Eshell Ask To Save History の値を設定します。

emacs_eshell_hist.png

Ask がデフォルトの尋ねてくるタイプで、Never, Always save がそれぞれ聞かずに、履歴を保存しないタイプとするタイプです。

また、カスタマイズを使わずに .emacs.el で設定する場合には以下の行を追加します。
(setq eshell-ask-to-save-history 'always) 

コマンドの作成(簡易版)

eshell のコマンドを自分で作ることもできます。
これでショートカットキーで実行していた関数などを eshel 上のコマンドとして実行することができます。 簡単な方法は alias を使用することです。
C-h k などでキーに設定されている lisp の関数名を調べ、 ~/.eshell/alias に記述します。
例えば以下のように記述すると "exit-emacs" で Emacs を終了し、 "1" で他のウィンドウを閉じるようになります。
alias exit-emacs save-buffers-kill-emacs
alias 1 delete-other-windows
ただし、この alias を使った方法では、前回のコマンドのエイリアスと違い、引数をとるコマンドは指定できません。
("$*" を使って引数を指定できるようにしていても、エラーとなります。)

コマンドの作成

前項の方法では find-file などの引数をとる関数には使えません。 また、 grep などはそのまま通常のコマンドのようにかけるのに、 コンパイルはコマンドを "" で囲まないといけないので、面倒です。
こういった場合には emacs-lisp でコマンドを作成する必要があります。
こったものを作ろうとすると lisp の知識が結構必要になりますが、 例にあげたのような簡単なものであれば、 .emacs.el に設定を書く程度の知識で作成できるのではないかと思います。

作成コマンド記述ファイル

eshell のコマンドは el ファイルに記述し、 eshell ロード時にホックで呼び出すようにします。
例えば、 ~/elisp/ex-eshell.el に記述する場合は以下のコードを .emacs.el に記述します。
(setq load-path (append (list
                         "~/elisp"
                         )
                        load-path))
(add-hook 'eshell-load-hook '(lambda ()
                               (load "ex-eshell")
                               ))

引数固定のコマンド

eshell 用のコマンドの lisp 関数の名前は eshell/xxxx の形式にします。
実際にコマンド名として使用されるのは xxxx の部分です。

引数を固定した場合は簡単です。 関数の引数を呼び出したい関数に渡します。
次のコードはファイルを比較する ediff-files の関数を eshell コマンドにしたものです。
(defun eshell/ediff (fileA fileB)
  "差分を表示する"
  (ediff-files fileA fileB))

省略可能な引数を持つコマンド

引数を省略可能にするには &optional を関数の引数定義の前に記述します。
引数が省略された場合には引数に nil が入るので if 文を使って、処理を分けます。
  (if 判定条件
      (真の場合の処理)
    (偽の場合の処理))
以下の関数は find-file を使ってファイルをオープンし、 引数が省略されていた場合は直前に表示していたバッファを表示するコマンドです。
(defun eshell/open (&optional file)
  "ファイルのオープン。引数を省略した場合は直前のバッファを開く。"
  (if file
      ;; 引数あり
      (find-file file)
    ;; 引数なし
    (switch-to-buffer nil)
    ))

引数を結合して実行するコマンド

渡された引数をスペースで結合して関数を実行するコマンドの作成方法です。 これを使うと compile のような "" で囲んで引数を渡さなければいけない関数をコマンド化できます。

lisp の関数定義で可変引数を使う場合には &rest を使用します。
これを使うと渡された引数の残りがリストとして引数に格納されます。

以下は compile をコマンド化した例です。
(defun ex-eshell-join-args (args)
  (let (cmd)
    (while args
      (if cmd
          (setq cmd (concat cmd " " (car args)))
        (setq cmd (car args)))
      (setq args (cdr args)))
    cmd))

(defun eshell/c (&rest args)
  "指定したコマンドでコンパイルを実行する。
引数を省略した場合は前のコマンドで実行する"
  (if args
      ;; 引数あり
      (compile (ex-eshell-join-args args))
    ;; 引数なし
    (compile compile-command)
    ))
これで c のコマンドで、コンパイルが実行されます。 また、引数を省略すると直前に実行したコンパイルを再度実行します。
$ c   # 一番最初は compile-command のデフォルト値 (make -k など) が実行される
$ c gcc -o foo.exe main.c bar.c
$ c  # 前のコマンド (gcc -o foo.exe main.c bar.c) が実行される)

やさしいEmacs‐Lisp講座やさしいEmacs‐Lisp講座
(2011/06)
広瀬 雄二

商品詳細を見る
関連記事
スポンサーサイト



Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
31位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
5位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

08月 | 2023年09月 | 10月
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。