Vimのマッピングについて考え中
Vim使いから見てkey-chord.elがいかに役に立たないか - while (”im mirrored”);を見て.
Vimで自分用に新しくマッピングを定義するとき,これまで以下の順番で考えて,結局今のところはだいたい<Space>をプレフィックスにする方法をメインで使って,使えるところは<expr>使って柔軟な動作にする感じになっている.
- 自分の使わない既存のマッピングを殺して,それをプレフィックスにして定義する.
(例)f使わない人 nnoremap f <nop> nnoremap fa :some_command<CR> nnoremap fb :call some_func()<CR> ...
- 既存のマッピング殺すのが気持ち悪いので<Leader>をプレフィックスとして使う.
nnoremap <Leader>a :some_command<CR> nnoremap <Leader>b :call some_func()<CR> ...
- Leaderだとプラグインとかぶったり,デフォルトだと押しにくい.let leader=","とかも既存のマッピング殺しているので気持ち悪い.そこで,<Space>とか<CR>とかをプレフィックスにする.
nnoremap <Space>a :some_command<CR> nnoremap <Space>b :call some_func()<CR> ...
- 場合によっては<expr>使うと幸せ.
folding を h,l で閉じたり開いたりするマッピング - ns9logとか,
みたいなやつinoremap <silent> <expr> <CR> (pumvisible() ? "\<C-e>" : "") . "\
" inoremap <silent> <expr> <Tab> pumvisible() ? "\<C-y>" : "\<Tab>"
ところが,<Space>を使うマッピングは思ったほど押しやすくない,つまり親指→その他の指,というシーケンスがそんなに押しやすくない.そこで,たまたまkanaさんのarpeggio.vimを使ってみて,これはいいなと思った.例えば,
Arpeggionnoremap ra :some_command<CR>
とした場合,r→aと押したときはデフォルトの文字置換できて,a→rと押したときはデフォルトの文字挿入ができて,rとaをほぼ同時に押したときはsome_commandが発動する,といったようにデフォルトの動作を殺さないまま,かつ押しやすいところにマッピングを追加できる.
ところが,冒頭で挙げたkanaさんの記事では,arpeggio.vimは役に立たなくないとい結論で,自分は稀な人なのか,と思った.考えてみると,
自明なことだが、同時押しを採用する主な理由は割り当てたい機能に対してそれ以外に使えるキーシーケンスがないからだ(「使える」はタイプのし易さ等を含む)。モードレスな編集体系ならばそう余裕はないが、Vimはそうではない。
に関しては,デフォルトのマッピング殺すの気持ち悪いというどうでもいい理由で,使えるキーシーケンスをむやみに絞っている自分が悪い.次に,
key-chord.elが提供する機能を言い換えると、タイムアウトありの曖昧なキーバインド定義になる(space-chord.elは特にこれを意識したものになっている。当人にそういうつもりはないだろうけれど)。これはVimではデフォルトでできるし、ある程度以上Vimを使っていればその恩恵に預かっている。だからVim使いから見ればkey-chord.elは「タイミングを微調整して同時押しをエミュレートした」という点以外に真新しいものはないし、それを使わなくても普通にキーバインドを定義するだけで十分だ。
に関しては,自分にとっては,どんな場面でも通用する一定のtimeoutlenがない,またはこのへんの動作がよくわかってない.最後に,
(これは主観だが)同時押しにかかるコストはそう小さくはない。Vim使いのキーバインドは「いかにモディファイヤーを押さずに事を済ませるか」あるいは「いかにモディファイヤーを押しっぱなしで事を済ませられるか」となる傾向にあるので、上記の理由も合わせて、タイミングのシビアな同時押しを利用するよりも普通のキーバインドを定義した方が楽だ。
に関しては,デフォルトのマッピングを殺さない前提だと,個人的には<Space>プレフィックスよりarpeggio.vimによる同時押しの方がましだと思っているのでちょっと違う.
要するに,「デフォルトのマッピングを殺したくない」にこだわってみた結果,なんだかおかしなことになっているのだと思う.kanaさんの.vimrcとか見るとtとかqは殺されているので,自分も思いきって適当なキーを殺すとすっきりいくかも知れない.その他の案としては,デフォルトのマッピング殺すにしても影響少なそうなShiftキー押しながらに全部定義してしまう,どうにかしてtimeoutlenを動的に定義する,がある.前者は,
nnoremap F <nop>
nnoremap FA :some_command<CR>
nnoremap FB :call some_func()<CR>
とか.後者は突き詰めると結局arpeggio.vimになってしまうような気もするな.もう少し考えてみよう.
2009/01/18 19:24 | Vim | トラックバック(0) | コメント(0)
errormarker.vimでflymakeるために調べてやってみた
errormarker.vim で flymake(Emacsの) る - 8時40分が超えられない - subtechを見て自分もやってみようかと思ったけど,そもそもVimのmakeやcompilerの使い方が分かってなかったのでちょっとだけ調べてみた.あとflymakeがあんまりよく分かっていない.ファイル保存時にsyntaxエラーをハイライトしてくれたらflymakeできてることになってるのだろうか?
まず,errormarker.vimの中身をのぞいてみたところ,QuickFixCmdPost(makeのあと?),getqflist()して,その情報から:signしているみたい.要するに,QuickFixの情報を元にハイライトやらしてるということ.
で,:makeした後に出てくるQuickFixの内容は,makeprg,shellpipe,errorfileとかに設定されたコマンドの実行結果をerrorformatでパースした結果のようだ.
そして,Vimにはデフォルトでいくつかの言語についてはmakeprgやらerrorformatやらの設定が$VIMRUNTIME/compilerに用意されていて,.vim/compilerとかに追加することもできて,例えばPHPの場合は:compiler phpとかで設定できるようになっている.
というわけで,PHPでflymakeしようと思ったら,.vim/ftplugin/php/flyquickfixmake.vimに以下のように書いておけばよい.Rubyの場合は,
sudo gem install vim-ruby
ruby vim-ruby-install.rb
してから.JavaScriptは,
sudo port install javascript-lint
してから,やってみたらそれっぽくなった.
JavaScriptも.vim/compiler/javascript.vimあたりに設定を分離すれば,全て同じような感じになるので,もっと簡単に設定書けそうな気もする.というか,QuickFixの仕組みとerrormaker.vimがよくできているので,最終的にはVimはautocmd BufWritePost * silent make %と書けばflymakeになるよ!ということにならないだろうか?あんまりよく分かってないのであれだけど(^-^;)
2008/07/30 19:38 | Vim | トラックバック(0) | コメント(0)
MacのVimでシステムのクリップボードとやりとりする
.vimrc - 素人がプログラミングを勉強するブログというエントリで,pbcopyを使ったシステムのクリップボードとのやりとりについて書かれていたので,偉そうにコメントさせて頂いたのだが,気になったのでもう少し調べてみた.
さきほどのエントリのコメント欄に書いたのは,vim pbcopy - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtechにて紹介されていた方法なのだけど,再度確認してみると,__CF_USER_TEXT_ENCODINGをUTF-8に設定する方法が紹介されていた.さらに調べていくと,Mac OS X clipboard sharing - Vim Tips Wiki - a Wikia wikiというページを見つけて,最終的には以下のgistに置いたコードのようになった.単にgistを使ってみたかっただけです(^-^;)
:help :wとか:help :rとかしてはじめて知ったのだが,:w !{cmd}でコマンドの標準入力に渡す,:r !{cmd}でコマンドの標準出力を受け取ることができる.また,__CF_USER_TEXT_ENCODINGとVimのencを合わすことによって文字化けしなくなる.また,自分で確認したものでは,MacVimやらKaoriya版GVimでは,"+yおよび"+pでシステムのクリップボードとやりとりできるので,Macかつ非GUIのときにpbcopyを使ってそれ以外は"+yを使うようにしている.
ところで,gistでコードスニペットを共有しつつ,バージョン管理までできてしまうのはかなり便利だと思った.あとは,ブログパーツのような感じで自分のブログに貼り付けることができれば,面白いのになぁと思った.今後に期待! 追記(2008/7/26): と思ったら,貼り付けられるようになってる.それとも見落としてたかなぁ(^-^;)
2008/07/23 12:48 | Vim | トラックバック(0) | コメント(1)
Vimで無理矢理相対行番号を表示するプラグイン
ujihisaさんがrubyneko - vimに相対行番号を表示したい(2)という話をしていて,kanaさんによるとVim 7.2a向けに相対行番号を表示するパッチがあるみたいなのだが,空気を読まずにVimScriptで無理矢理やってみた.無駄にGitHubに置いてます.
まともにVimScript書いたことがなかったけど,とりあえず:sign使ったらそれっぽくなるんじゃないかと思って,他のプラグインを真似したり:help見ながら作ってみた.そのまま実装したら,行移動のたびにsignが消えたり出たりするせいで画面全体が左右にカクカクなったので,1行目には常に「00」と表示しておくことになってます.
とりあえず,デフォルトでは前後20行に番号をふるのだけど,行移動が頻発するとかなりもたつく.しかも,他のsign使うプラグインなどのことを全く考慮してなかったり,その他いろいろ怪しいです.でも,:set nonuすると相対行番号表示の雰囲気を感じることぐらいはできるかも知れません.
2008/07/02 03:17 | Vim | トラックバック(0) | コメント(0)
昨日のVim勉強会#2 に参加してきた
詳細は主催してくださったujihisaさんのところで.
ns9tksさんも書いてました.
追記(2008/6/2):
kanaさんも書いてました.
Vim勉強会#2に参加しました - while (”im mirrored”);
追記ここまで
個人的に気になったところをメモとして残しておきたいと思います.
読書会
eXtream Readingおもしろい.今回はほとんど発言できなかったけど,誰かの発言をきっかけに話が広がったりして普通に本読むよりも理解が深まったと思う.研究室の輪講とかでも取り入れられないかなぁ.
:h 結婚してくれ!!!!! by secondlifeさん
Emacsとか他のエディタのことをあまり知らないのでアレやけど,ヘルプが異様に充実しているのもVimのいいところだと思った.とにかく:hしとけばなんとかなる.ただ,そもそもどんな機能があるのかとか,どんなキーバインドが許されているのかを知らないと,:hしようがないので,逆引き的なものがあればいいなぁと思った.それで,そこから:hを辿っていけば良いみたいな感じ.そういう意味では上でも書いたeXtream Readingは今回の趣旨に合っていると思った.
GitHubが流行っている
分散型バージョン管理システムとしては最近Mercurialを使いはじめたばかりやけど,世間ではgitの方が使っている人多そう.勉強会の後の雑談タイム(?)でも少し話題になってたけど,Mercurialと比べて,gitはWindows環境だとネイティブで走らなくて少し使いづらいというのが一番のネックだと思う.個人的には普段はMacなのでどっちでもいいんだけど,研究室ではWindowsで,.vimrcとか共有する目的もあるのでMercurialの方を使っている.FirefoxやOpenSolaris,muttといった有名どころが使っているので,Mercurialが廃れていくことはなさそうやけど,GitHubはすごく魅力的なので,今後どうしようか迷うところ.Windowsで手軽にgitが使えるか,git-svnみたいな感じでhg-gitみたいなのがあればいいのになぁ.
Macのターミナルでのマルチバイト問題
Terminal.appやiTerm.app上のVimで「○」とか「■」とかの一部の文字幅が正しく認識されない問題があって,その場では言いそびれたけど,その問題を解決するパッチを含むiTermのPortfileがPrivatePortfile/iTerm - MacPortsWiki-JPにて配布されているので導入してみると良いと思う.って書こうと思ったらTerminal.app上でのVimでは直ってるっぽい?いつからやろ?10.5.3にしたからかなぁ.あとVim側では,:set ambiwidth=double ってしたら良かったと思う.
他の人がVim使ってるところを見るのがおもしろい
操作方法とか.vimrcとか自分は最適と思ってるのが人によってはいろいろ違って面白かった.set incsearchとかset wildmodeとか.あと,text objectsを全然使いこなしてないのでsurround.vimも含めて手になじませたいと思った.
GVim派が意外と少ない
GVimのいいところは,syntax colorに#rrggbb全てが使えるところと,ファイルのドラッグ&ドロップを受け付けるところ.逆にzshやscreenとの連携はできないのが欠点かなぁ.CUIをあんまり使いこなせてない自分は意外とGVimが良かったりしている.Mac環境で言えばMacVimがだいぶ使えるようになりつつあるので,ちょっと期待.MacVimはPrivatePortfile/MacVim - MacPortsWiki-JPよりPortfileをもらってきてインストールするのが簡単だと思う.最新版ではkaoriyaパッチが失敗するっぽいので,+rubyとかでインストールするのがよさそう.ちなみにiTermもMacVimもPortfileを作ってくれているのは同じ方(splhack)で,感謝です!
Vimperator
hogehogeのteramakoさんとDis Communication - 符号無しのTrapezoidさんとotsune's SnakeOil - subtechのotsuneさんがよくVimperator関連の記事を書いたりプラグインを作っていたりする.Vimperator - EthnaWikiにもあるように,CodoReposの/dotfiles/vimperatorrcと/lang/javascript/vimperator-pluginsあたりにいろいろアップされているのでいつも参考にさせてもらってます.Vimperatorは勉強会でYAAさんがおっしゃてったように先日1.0がリリースされたのでFirefox 3とあわせて導入するのは良いタイミングになりつつあると思った.
感想とか
この手の勉強会は初参加だったので,どんなもんかとちょっと不安だったけど,新しい技を知れたり,blog越しで一方的に知ってた人と話すことができたので,参加して本当によかった!主催してくださったujihisaさん,Talkしてくださったsecondlifeさん,Sixeightさん,YAAさんをはじめとして,参加者の皆さんありがとうございました!!
2008/06/01 17:29 | Vim | トラックバック(0) | コメント(0)