Sugamo.css Vim分科会まとめ

/web/sugamo_css

Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。

略してSugamo.vim。
Twitterでほかむらさんと話してるときに「Vim勉強会したいよねー」ということになって、やってみた。

提唱者の片割れがほかむらさんなので、会場はカヤック。会議室をお借りして... とまあこの辺はごにょごにょあったので割愛。Sugamo.cssだと話題があっちこっち飛ぶんですが、今回はVimという明確なテーマがあるので、首尾一貫した感じ。15時〜19時でいろいろ話し合って、ネタが尽きたので解散! という解りやすいオチでもありました。

VimScriptのデバッグ

  • :h functions」で組み込み関数見れるよ!
  • :source %」でリロードすれば再起動しなくて良いよ!
  • <q-args>って何? → 「:h q-args

とにかくヘルプが便利ってことで、なんか迷ったら「:h ほにゃらら」でほぼ解決するよ! ...とのこと。あんまりヘルプ使わなかったからなー。猛省しております。「:h」も2週間に一回くらい見直すと新たな発見があるらしい。Kaoriya版のMacVimはヘルプも全て日本語なのでたいへん便利!こないだ呟いたら速攻で修正してくれたくらいメンテナーも気合い入ってます(その節はありがとうございました)。

んで、自前VimScript書いていたときは動作確認にいちいち再起動してたわけで、これVimScript-erはどうしてるのかなー、と思ったら、以下のようなマッピングしてるそうです。なるほど!

  1. nnoremap <silent> <Space>r :<C-u>execute "source " expand("%:p")<CR>

VimScript書いてみた

  1. function! ChangeUL() range
  2. let l:count = a:firstline
  3.  
  4. while l:count <= a:lastline
  5. let l:str = getline(l:count)
  6. let l:out1 = substitute(l:str, '^\s\+', '', 'g')
  7. let l:out2 = '<li>' . l:out1 . '</li>'
  8. call setline(l:count, l:out2)
  9. let l:count = l:count + 1
  10. endwhile
  11.  
  12. call append(a:lastline, '</ul>')
  13. call append(a:firstline - 1, '<ul>')
  14. endfunction

...というようなVimScriptを書いてみました。行選択して「:call ChangeUL()」とすれば、1行を<li>として、HTMLの番号無しリストとして整形してくれるスクリプトです。以下のような感じでマッピングしとくと良いですね。

  1. vnoremap \u :call ChangeUL()<CR>

rangeを取得できるといろいろできそうだなー。ただ、変数を書き換えるには再定義しないとダメなようでしたlet」付けないとダメみたい。Perlの「my $hoge = moge;」に慣れてると奇妙だけれど。上の例でいう「l:out2」の部分ですが。あ、「l:」はローカル変数の意です。このスクリプトを作るにあたって、以下のドキュメントを参考にしました。

追記: Vim神からの啓示を受けて、以下のように変更しました。

  1. function! ChangeUL() range
  2. let l:count = a:firstline
  3.  
  4. while l:count <= a:lastline
  5. let l:str = getline(l:count)
  6. let l:out = substitute(l:str, '^\s\+\(.\+\)', '<li>\1<\/li>', '')
  7. call setline(l:count, l:out)
  8. let l:count = l:count + 1
  9. endwhile
  10.  
  11. call append(a:lastline, '</ul>')
  12. call append(a:firstline - 1, '<ul>')
  13. endfunction

便利コマンド

!which perl Perlコマンドのフルパスを表示
q: 実行コマンドの履歴を表示
q/ 検索文字列の履歴を表示
:qa 全バッファをまとめて終了(:qall)
:nohlsearch 検索文字列のハイライトを消す。
:set nohlsearch」と違って、ハイライト設定そのものは消さない。
:mkvimrc ~/.vimrc 現在の設定でVim設定ファイルを書き出す。
GUIのVimでメニューからいろいろ変えた時、設定を記憶するために使うと便利。

おすすめ設定

set splitright ウィンドウを縦分割すると、新しいウィンドウが現在のウィンドウの右に開かれる。
set splitbelow ウィンドウを横分割すると、新しいウィンドウが現在のウィンドウの下に開かれる。
set visualbell ビープ音の代わりに、画面フラッシュを使用する
set wildmode=list:longest,full コマンドモードでの補完時、全てのマッチを羅列し、共通する最長の文字列まで補完し、次からマッチを完全に補完する。Sig.は「list:longest」だけのが好みです。

おすすめキーマッピング

command! Utf8 e ++enc=utf-8 「:Utf8」でカレントファイルをUTF-8として再読込
cnoremap <C-p> <Up>
cnoremap <C-n> <Down>
挿入モード時と同じように、コマンドモードでも<C-p>/<C-n>で単語補完を行う
nnoremap <Esc><Esc> :nohlsearch <Esc>連打で、強調表示を一時的に消す。

おすすめプラグイン

ku.vimとfuzzyfinder.vimはだいたい同じような機能なんだけど、ku.vimはVim神が書いているとのことで、速度や拡張性に期待が持てるような話だった。比較記事も見つけた。

repeat.vimはsurround.vimの拡張として便利。たとえば「ysst」を連続で入力したい場合に「.」でタグ入力状態まで持ってける。<ul>マークアップではそれも面倒くさいってんで、先に挙げたスクリプトを書いちゃったんだけど、Blog記事の草稿で見出しだけさらっとマークアップしていくシーンなんかではやっぱり便利。

Snipmate.vimはテンプレを用意するのが面倒なんだけど、IFブロックとか言語ごとに用意しておくと確実に作業スピード上がりますね。ちょっとずつ動員していきたい。

Align.vim

よく使うAlign.vimだけど、意外と知られていない細かい整列制御を紹介。公式にちゃんと書いてあるので、裏技というほどでもないけど。例えば以下のようなソースがあるとする。

<th>\x</th><td>[0-9A-Fa-f]</td><td>16進数</td>
<th>\X</th><td>[^0-9A-Fa-f]</td><td>16進数でない文字</td>
<th>\o</th><td>[0-7]</td><td>8進数</td>
<th>\O</th><td>[^0-7]</td><td>8進数でない文字</td>

行選択して「:Align<td>」とすると、こうなる。

<th>\x</th> <td> [0-9A-Fa-f]</td>  <td> 16進数</td>
<th>\X</th> <td> [^0-9A-Fa-f]</td> <td> 16進数でない文字</td>
<th>\o</th> <td> [0-7]</td>        <td> 8進数</td>
<th>\O</th> <td> [^0-7]</td>       <td> 8進数でない文字</td>

デフォルトはセパレータ前後に空白1つ。
:AlignCtrl p4P0」としてから、行選択→「:Align<td>」とすると、以下のようになる。

<th>\x</th>    <td>[0-9A-Fa-f]</td>     <td>16進数</td>
<th>\X</th>    <td>[^0-9A-Fa-f]</td>    <td>16進数でない文字</td>
<th>\o</th>    <td>[0-7]</td>           <td>8進数</td>
<th>\O</th>    <td>[^0-7]</td>          <td>8進数でない文字</td>

セパレータの前に空白4つ。
AlignCtrlではセパレータも登録できるので、「:AlignCtrl p4P0 <td>」とすると、行選択→「:Align」だけでOK!

テキストオブジェクト便利!

"hogehoge"」にカーソルがあるとして...

di"""の内側を削除
vi"""の内側を選択
yi"""の内側をヤンク
da"""ごと削除
va"""ごと選択
ya"""ごとヤンク

di"」でなく「diw」とかすると、単語単位になるので「$hoge」とかでもいける。通常は「di(」で括弧の中とか。

Tips

他のユーザでログインしているとき、自分の.vimrcを使う
alias view='vim -u ~/.vimrc -R'
ftpluginに置くと、runtimeのプラグインを上書きしてしまう
「.vim/after/」フォルダに置く。
  • .vim/after/ftplugin/php.vim
  • .vim/after/syntax/
vimrcの読み込み順
  • 最初に見つかったファイルが設定され、他は無視される
  • ディレクトリの優先度は「$HOME/.vimrc > $VIM/.vimrc」
  • Linuxは「.vimrc > _vimrc」
  • Windowsは「.vimrc < _vimrc」
さらに...
  • gvimrcは常にvimrcの後に読み込まれる
  • vimrcとgvimrcでは動作が微妙に違うコマンドもある。GUI固有コマンドはgvimrcに書いておこう
  • CUI版とは異なった初期化をするためにgvimrcが用いられる
よく使う正規表現をコピペできれば...
たまに「:set expandtab」が無効になっているときがある。何故に?

参照: vimrc, runtime の優先順位を理解して Windows と Linux で Vim の設定を共有する

蛇足

長居してたら最中もらいました。

めっちゃ美味しかったです。さらにアイスの差し入れも...! 至れり尽くせり恐縮です! ありがとうございましたーっ!

Follow‐up

@soh335から山のように学ばせていただきました。ありがとうございます。おつかれさまでしたー!

Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。