Pages

2013年10月24日木曜日

Emacsでキーバインド不足を解消するmine.elの紹介

mine.el -> mykie.el に改名しました。 (後日記事を書く予定です)
自分用に作ったキーバインド定義を簡単に行なうelisp拡張です。
Emacsを使っていると拡張elispを入れるたびにキーバインドがたりなくなる思
いをしてないでしょうか?
mine.elは通常使うキーバインドの他にC-uを押したときやregionを選択中などの
コマンドを簡単に登録できます。

書き方

結局elispを書くんですが、こんな感じになります。

(defun mine:C-t ()
(interactive)
(mine
:default '(message "普通におしたらよばれるよ")
:C-u '(message "C-uをおしたらよばれるよ")
:region '(message "region選択してるときよばれるよ")))

これを普通にelispでかくと

(defun mine:C-t ()
(interactive)
(if (region-active-p)
(region-function)
(if current-prefix-arg
(do-default)
(C-u-function))))

こんな感じであんまりかわりません。(だめじゃん)

さすがにこれだけじゃあれなのでこんなかんじにもかけます。
※ 2013/10/25 :region&prefix-arg -> :region&C-uに変わりました。ご注意を

(defun mine:example ()
(interactive)
(mine
:default '(message "普通におしたらよばれるよ")
:C-u '(message "C-uをおしたらよばれるよ")
:region-handle-flag 'copy ; you can specify 'kill too.
:region&C-u '(message "region選択+C-u押したらよばれるよ")
:region '(message "region選択してるときよばれるよ")))

リージョン選択してなおかつC-uを押してた場合の関数を追加できます。

さらに(まだあるのかよ)以下のようによびだすこともできます。

(defun mine:example2 ()
(interactive)
(mine
:default '(message "普通におしたらよばれるよ")
:default&bolp '(message "beginning-of-lineでよばれるよ")
:default&eolp '(message "end-of-lineでよばれるよ")
:repeat '(message "同じポイントで呼び出したらよばれるよ")
:C-u&bolp '(message "C-u+beginning-of-lineでよばれるよ")
:C-u&eolp '(message "C-u+end-of-lineでよばれるよ")
:region '(message "region選択してるときよばれるよ")))

リピートは同じ位置で呼び出したときにdefaultのかわりに呼び出される関数です。
default,C-u&bolp,eolpはそれぞれメッセージ文にあるとおりです。

これらの条件を普通に書くのはめんどくさいというか、条件分岐が多くなって
大変なのでこのような拡張を書きました。

インストール

まだ開発段階というかもうちょっと機能を増やそうと思っているので
MELPAには登録していません。(上で紹介した機能は たぶんかわりません
キーワード引数の:region&prefix-argが:region&C-uにかわりました。)
興味がある方は GitHub からダウンロードしてください。
el-getからダウンロードしたい場合は以下のようにするといいと思います。

(push '(:name mine-el
:type git
:url "https://github.com/yuutayamada/mine-el.git")
el-get-sources)

簡単な例です。Emacsの標準の機能の組み合わせなので
mine.elをインストールすればそのままコピペで使えると思います。
注意点として、関数はリストで渡す必要があります。

(defun mine:C-j ()
"This is example function for C-j, but you can use this function"
(interactive)
(mine
:default '(progn
(delete-trailing-whitespace)
(case major-mode
(org-mode (org-return-indent))
(t (newline-and-indent))))
:C-u&eolp '(fill-region (point-at-bol) (point-at-eol))
:region-handle-flag 'copy
:region&C-u '(mine:query-replace-regexp)
:region '(mine:browse-url)))

まとめ

  • メリット
    簡単にひとうのキーに複数のキーバインドが登録できる。
  • デメリット
    内容をあらわす関数名をつけるのが難しい。
    機能が多いと忘れる(えっ意味な..)

おわり

よかったらつかってください。


0 件のコメント:

コメントを投稿