mykie-v0.2.1リリースしました。というかしてましたというか、野放しというか。。。
英語のREADME.mdのほうはなおしてたのですが、日本語の情報はとくになにも
してなかったので紹介記事を書きたいとおもいます。
mykie.elとは
カーソルのポイントやflycheckのエラーの状態などに応じて
呼び出す関数を柔軟に変えることができるEmacs用の拡張です。
またユーザーの独自の条件も簡単に追加できます。
0.1.x系から変わったところ
- キーを登録するときのクオートがいらなくなりました
- 括弧つきの記法ができるようになりました
- :C-u! :fileキーワードがつかえるようになりました
- lazy order -> fuzzy orderになまえがかわりました
- デフォルトでfuzzy orderを利用するようになりました
- デフォルトキーワードとして"t"を利用できるようになりました。
- multiple-cursors.elからmykieを利用できない問題があったのですが、
mykie.elをロード前のキーバインドを利用するようにしました - helm-show-mykie-keywordsでmykieで利用できるキーワードがみれるように
なりました - キーワードを追加するときの方法がかわりました
キーを登録するときのクオートがいらなくなりました。
以下は例ですが、mykie:set-keysでwith-self-keyを利用する場合も
クオートがいらなくなっているので注意してください。
;; 旧バージョン
(mykie:global-set-key "C-j" :default '(message "クオート書いちゃダメ絶対"))
;; 新バージョン
(mykie:global-set-key "C-j" :default (message "hello"))
(mykie:set-keys with-self-key ; <- これもクオートいらなくなりました
"a" :C-u (message "pushed a after pushed C-u"))
括弧つきの記法ができるようになりました。
prognを指定したくないときに便利かもしれません。
(mykie:global-set-key "C-j"
(:default (message "default")
(message "default2行目"))
(:C-u (message "default")))
追加されたキーワード:C-u! And :file
- :C-u!は:C-uとおなじですが、関数を呼び出す前にcurrent-prefix-arg変数を
nilに設定します。移動系関数でcurrent-prefix-argの数値によって挙動を変える
関数の場合設定すると便利かもしれません。 - :fileは`ffap-file-at-point'関数を呼び出します。
結果はmykie:current-file変数に保存されます。
lazy orderからfuzzy orderに名前がかわりました
適当に名前考えてあとからちょっと違うなと思って変えました。
どういう機能かというと、以下のような設定で
(mykie:global-set-key "C-j"
:default (message "default")
:C-u&url (message "ポイントがURLだったらよばれる")
:C-u&eolp (message "ポイントがend of lineだったらよばれる")
:C-u (message "default"))
:C-u&urlと:C-u&eolpが同時に条件をみたしていた場合、上にあるキーワードを
優先して実行する機能です。(ユーザーが設定するまでどちらを優先するかわ
からないのでfuzzyとしました)
旧バージョンでは、C-u*2がしたの方に設定されていると呼ばれないなどのめ
んどくさい仕様だったのですが、現在は:C-u&somethingより:C-u*2や:M-3など
のcurrent-prefix-argの数字を意図的に変えたものを優先するようにしている
のでとくに意識しなくても意図したものがよばれないなどの不具合は出ないの
ではと思います。
デフォルトでfuzzy orderを利用するようになりました
上記のとおりそこそこ便利に設定できる機能だと思うので、デフォルトでこの
機能がオンとなるようにしました。
もし無効化したい場合はmykie:use-fuzzy-order変数にnilを設定してください。
:defaultキーワードとして"t"を利用できるようになりました。
case or cond文のようにすべての条件にマッチしなかった場合は、
:defaultのかわりにtを設定できるようにしました。
(mykie:global-set-key "C-j"
t (message "default"))
multiple-cursors.elからmykieを利用できない問題について
これは解決したわけではないのですが、mykieをロードする前のキーバインド
を利用するようにしました。(pull-requestはウェルカムです)
helm-show-mykie-keywordsでmykieで利用できるキーワードがみれるようになりました
helmがロードできる状態であれば利用できます。
キーワードを追加するときの方法がかわりました。
もしmykieの過去のバージョンを使っている場合は、そのままでは利用できません。
すいません。ただ新しい設定方法のほうがEmacsっぽいので気に入っていただ
けるのではと思います。。。
以下はいくつかの条件(キーワード)を追加する例ですが追加するのがひとつの
場合はpush関数を利用してもいいと思います。
(setq mykie:normal-conditions
(append mykie:normal-conditions
'((:org-src . (or (org-in-src-block-p)
(org-src-edit-buffer-p)
(string-match "^\\*Org Src .*\\*" (buffer-name))))
(:org-mobile . (org-mobile-dir-p))
(:org-header . (and (eq 'org-mode major-mode)
(org-on-heading-p)))
("^:skk-\\(on\\|active\\)$" . (mykie:get-skk-state)))))
例の一番下の:skk…の部分だけ異質ですが、このmykie:get-skk-stateという
関数は条件をみたしていた場合、:skk-onか:skk-activeというキーワードをか
えします。
条件をチェックして複数のキーワードを返す可能性がある場合に利用してください。
(mykie.elの中ではmajor-mode変数にあわせてキーワードを作ったりしています)
追加できる条件変数には
- mykie:region-conditions
- mykie:prefix-arg-conditions*
- mykie:prefix-arg-conditions
- mykie:normal-conditions
があります。region-conditionsに新たに追加する場合は、use-region-pなど
のリージョンがアクティブかどうかを確認する条件を含める必要はありません。
同様にprefix-arg-conditionsの方もcurrent-prefix-argがnilでないことを確
認する条件を追加する必要はありません。
(上の変数に応じてチェックする条件が決まっています)
余談ですが、上記の変数のリストを含むmykie:group-conidtions変数が新たに
追加されたのですが、このなかの変数の順番で条件を評価します。
なのでこの変数のなかの順番を変更することでC-u*2などの優先度を変更できます。
インストール、その他の機能(過去記事のほぼコピー)
インストール
MELPA に登録したのでM-x package-install RET mykieでインストールできる
と思います。もし MELPA をpackage-archivesに登録してなければ以下を
スクラッチバッファなどで評価してから試してください。
(add-to-list 'package-archives
'("melpa" . "http://melpa.milkbox.net/packages/"))
(package-initialize)
el-getをつかっているなら以下のコードを評価して、M-x el-get-install RET
mykie でインストールできると思います。
(push '(:name mykie-el
:type git
:url "https://github.com/yuutayamada/mykie-el.git"
:load-path ("./lisp"))
el-get-sources)
使い方
インストールができたら、init.el などで設定します。
下は簡単な設定例
(require 'mykie) ; <- これはmykie.elを読み込む必須の設定
;; major-modeのキーをglobal-mapのmykieの同じキーで上書きするかどうか
;; の設定。上書きしますが元のメジャーモードキーは:default用の関数に
;; 登録されるのでそのまま使用できます。
;; defaultではnilとなっています。
(setq mykie:use-major-mode-key-override t)
;; 上のメジャーモードの上書き設定の変更や条件の変更をおこなった場合は
;; ↓これを呼び出してください。
(mykie:initialize)
;; mykie:set-keysの第一引数にnilを指定するとグローバルマップに登録され
;; ます。emacs-lisp-mode-mapと指定して特定のメジャーモードを指定することも
;; できます。
(mykie:set-keys nil
"C-a"
:default (beginning-of-line)
:C-u mark-whole-buffer
"C-e"
:default (end-of-line)
:C-u (message "Hello")
;; ... You can add more keybinds
)
上の例はC-a, C-eキーにC-uを押した時の設定を追加します。
関数の指定方法についてですが、上の例のようにリスト形式で渡す方法のほかに
query-replace-regexpのようにシンボルで渡すこともできます。
この場合そのシンボルがインタラクティブだった場合、call-interactively
関数からそのシンボルを呼び出します。(コマンドとして実行する)
指定できるキーワード引数
以下は現在の指定できるキーワード引数です。
最新の情報は GitHubのmykieのページ に書くつもりなので、そのうち情報が古
くなるかもしれません。
helmが利用できればhelm-show-mykie-keywords関数がつかえるので現在利用で
きるキーワードをみることができます。
KEYWORD | DESCRIPTION |
---|---|
:default | デフォルトで呼ばれる |
:C-u | C-uをそのキーを押す前に押すと呼ばれる |
:C-u! | C-uと同じだけど、current-prefix-argをnilにする |
:C-u*N | C-uをN回押したとき呼ばれる |
:M-N | メタ(alt)キー + [0-9] の数字を押した時に呼ばれる |
:region | リージョン選択中に呼ばれる |
:region&C-u | :regionと:C-u条件をみたすとよばれる |
:repeat | 同じコマンドを同じポイントで行うと呼ばれる |
:bolp | beginning of line で呼ばれる |
:eolp | end of line で呼ばれる |
:bobp | beginning of buffer でよばれる |
:eobp | end of buffer で呼ばれる |
:C-u&bolp | :C-uと:bolpの条件をみたすとよばれる |
:C-u&eolp | :C-uと:eolpの条件をみたすとよばれる |
:C-u&bobp | :C-uと:bobpの条件をみたすとよばれる |
:C-u&eobp | :C-uと:eobpの条件をみたすとよばれる |
現在のポイントが e-mail だと呼ばれる | |
:C-u&email | :C-uと:emailの条件をみたすとよばれる |
:url | 現在のポイントが URL だと呼ばれる |
:C-u&url | :C-uと:urlの条件をみたすとよばれる |
:MAJOR-MODE | emacs-lisp-mode などの 現在の major-modeに マッチ |
:C-u&MAJOR-MODE | :C-uと:MAJOR-MODEの条件をみたすとよばれる |
:region&MAJOR-MODE | :regionと:MAJOR-MODEの条件をみたすとよばれる |
:prog | プログラミングモードに関連したバッファだと呼ばれる |
:C-u&prog | :C-uと:progの条件をみたすとよばれる |
:region&prog | :regionと:progの条件をみたすとよばれる |
:err | flymakeかflycheckのエラーがあるときよばれる |
:C-u&err | :C-uと:errの条件をみたすとよばれる |
:region&err | :regionと:errの条件をみたすとよばれる |
:minibuff | ミニバッファでよばれる |
:readonly | read only だとよばれる |
:comment | コメントか文字列だとよばれる |
以下は関数の指定ではなく、違う効果を持ったキーワード引数
KEYWORD | value | DESCRIPTION |
---|---|---|
(example) | <30> | |
:clone | KEY as string | Clone mykie's functions to other KEY. this function is convenient if you use Emacs either situation terminal and GUI. Because terminal Emacs can't use partial keybind such as C-;, this keyword can clone same functions to another key without :default function. For example: :clone ";" (<- if you want to clone origin key to ";") |
"a" | ||
:deactivate-region | symbol | deactivate selecting region after mykie executed command. You can specify this t, 'region, 'region&C-u. |
t | ||
:region-handle-flag | symbol | Do copying or killing before command executing. This function is convenience if you want to use kill-ring's variable. But there is mykie:region-str variable that always store region's strings. |
'copy or 'kill |
:cloneはself-insert-commandに:default以外のコマンドを引き継ぐ設定です。
どういう時に便利かというと、ターミナルではC-;は使えないので";"キーで
リージョンに指定した関数を使いたいというときに便利です。
ユーザー側からすると同じキーバインドが使えてると錯覚できます。
(:defaultの設定は使えないですが)
(mykie:set-keys nil
"C-;"
:default 'newline-and-indent
:region 'comment-dwim
:clone ";")
メジャーモードのキーの上書き
最近のmykie.elに実装された機能ですので不具合があるかもしれません。
(setq mykie:use-major-mode-key-override t)
(mykie:initialize)
のようにしないと設定されないので、つかいたくなければ上記の設定をしない
でください。
mykie:use-major-mode-key-overrideには 'both, 'global, 'self or t が設
定できます。'bothはself-insert-commandとglobal-mapのC-jなどのprefix付
きのコマンド両方、'globalは C-j などのprefix付きのglobal-mapのコマンド、
'self と t は self-insert-command(a-z0-9など) を意味します。
目的: major-modeのキーバインドにmykieのglobal-mapのキーを埋め込もうというの
が目的です。
例
;; You can specify 'both or 'global 'self or t to
;; mykie:use-major-mode-key-override.
;; 'both means use overriding major-mode keys both case.
;; 'global means use overriding major-mode keys by global-map's keys
;; without self-insert-command keys.
;; 'self means use overriding major-mode keys by self-insert-command keys.
;; if you set nil, then don't overriding major-mode key.
;; `mykie:use-major-mode-key-override' is nil by default.
(setq mykie:use-major-mode-key-override 'both)
(mykie:initialize)
(mykie:set-keys nil ; <- nil means registering global-map
"C-w" :default 'tetris :C-u (message "C-u+C-w"))
;; self-insert-commandはこの方法で登録する
(mykie:set-keys with-self-key
"1" :region sort-lines
"2" :region align
"3" :region query-replace
"c" :C-u (message "C-u+c"))
この機能を使うとき、self-insert-commandとそれ以外を意識する必要があります。
a-zや0-9などがself-insert-commandです。
それ以外というのは、global-mapのC-jやC-wなどprefix付きのコマンドです。
上の例はどちらの場合でも上書きする例です。
-Magitなど一部のパッケージでは、自動で上書きしてくれません。
僕のコードがバグってました。最新のmykie.elではmagitでも上書きしてくれ
ます。ごめんなさい
もしそういう場合どうしても上書きしたい場合、以下のようにしてください。
シンボル名でモード名を指定してください。
個別のモードごとに上書きの設定をしたい場合:
;; specify major-mode name as symbol.
(mykie:attach-mykie-func-to 'emacs-lisp-mode)
逆に MagitのようにC-uを押すと動作を変えるので上書きしてほしくない場合
以下のようにできます。
(setq mykie:major-mode-ignore-list '(magit-status-mode))
特定のキーだけに指定したい場合以下の指定方法もあります。
;; You can use below configuration. This way can specify specific keybind
;; only. you enjoy playing tetris.
(mykie:set-keys nil ; <- nil means registering global-map
"C-t"
:default tetris
:C-u (message "C-u+C-t")
:ignore-major-modes (emacs-lisp-mode)
:ignore-major-modes (diff-minor-mode))
おわり
region系の関数を開いてるキーにいれるだけでもまぁまぁ便利なのでよかった
らつかってください。
0 件のコメント:
コメントを投稿