[Emacs]既存の関数をちょこっと拡張して自作関数を作る方法

既存の関数の挙動をちょこっとだけ変えたい!
そう思ったことありませんか?

今日はその方法を、Emacs初心者にもわかりやすく解説します。

お題:revert-bufferしたときに、いちいち"yes/no"聞かないでよ!

私はrevert-bufferコマンドをよく使います。
revert-bufferを実行すると毎回"yes/no"を聞かれるのですが、「"はい"に決まっとるわい」という気持ちになります。
そこで、yes/noを聞かない版のrevert-buffer、名付けて"revert-buffer-force"関数を自作してみましょう。

既存の関数の挙動を調べる

まずは敵を知れ。
revert-bufferについて調べてみましょう。
関数の説明を見るのはdescribe-functionコマンドです。
(お使いの環境によって、キーバインド"F1-f" や" C-h f" などに割り当てられているかもしれません。)
M-x describe-function
Describe function:revert-buffer
関数名を聞かれるので、"revert-buffer"と入力しましょう。

関数の説明が出てきます。
It is bound to <menu-bar> <file> <revert-buffer>.

(revert-buffer &optional IGNORE-AUTO NOCONFIRM PRESERVE-MODES)
ごちゃごちゃと書いてますが、"NOCONFIRM"というのが、何かそれっぽいですね。
下の方に説明があります。
Optional second argument NOCONFIRM means don't ask for confirmation
at all.  
おお!まさにこれですね。
revert-bufferの第二引数がNONCONFIRMオプションで、それを真(1とかtとか)にすれば、確認を聞かない( don't ask confirmation)っぽいです。

さっそくやってみましょう。

自作関数を定義する

.emacsファイルに次のように書きます。
;; revert-buffer without asking
(defun revert-buffer-force()
  (interactive)
  (revert-buffer nil t)
)
1行目のdefun revert-buffer-force() は、関数の定義です。名前はご自由に。
2行目の(interactive)は、M-x で呼び出せるようにするための決まり文句です。

3行目の(revert-buffer nil t)が関数の本体です。
revert-bufferに第一引数 "nil", 第二引数 "t" を渡して呼び出しています。
第二引数の"t"がNONCONFIRMつまり「yes/no聞くな」ということですね。
第一引数は、IGNORE-AUTOとかいうやつで・・・・よくわかりません(笑) デフォルトがnilらしいのでnilにしました。

細かいことは気にしないのがコツです!

書いた関数を評価(eval)する

さて、関数を書いただけでは有効にならないので、eval(評価)してあげる必要があります。
関数定義文の最後のかっこの後ろにカーソルをおいて、C-x C-e と打ってください。
(defun revert-buffer-force()
   ...
)  ←ここで C-x C-e 
これで、書いた関数が有効になります。
(このテクニックを知らずにEmacsを再起動してる人がいたら、教えてあげてくださいね。)

自作関数を実行する

いよいよ呼び出してみましょう。
M-x revert-buffer-force
おぉ!yes/no聞かれずにrevert-bufferできました!
これは感動ものです。

おまけ:キーバインドを割り当てる

ついでにキーバインドを割り当てます。
.emacsで、
(global-set-key "\C-cv" 'revert-buffer-force)
最後のかっこの後ろで C-x C-e するのをお忘れなく!

これで、C-cv でrevert-buffer-forceを起動できるようになりました。

ざっとこんな感じです。
いかがでしたか?

「こんな便利な関数を作った」などがあれば、コメントやtwitterで教えていただるとうれしいです。

Enjoy!
カテゴリ:

人気記事