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はどうしてるのかなー、と思ったら、以下のようなマッピングしてるそうです。なるほど!
nnoremap <silent> <Space>r :<C-u>execute "source " expand("%:p")<CR>
VimScript書いてみた
function! ChangeUL() range
let l:count = a:firstline
while l:count <= a:lastline
let l:str = getline(l:count)
let l:out1 = substitute(l:str, '^\s\+', '', 'g')
let l:out2 = '<li>' . l:out1 . '</li>'
call setline(l:count, l:out2)
let l:count = l:count + 1
endwhile
call append(a:lastline, '</ul>')
call append(a:firstline - 1, '<ul>')
endfunction
...というようなVimScriptを書いてみました。行選択して「:call ChangeUL()」とすれば、1行を<li>として、HTMLの番号無しリストとして整形してくれるスクリプトです。以下のような感じでマッピングしとくと良いですね。
vnoremap \u :call ChangeUL()<CR>
rangeを取得できるといろいろできそうだなー。ただ、変数を書き換えるには再定義しないとダメなようでした「let
」付けないとダメみたい。Perlの「my $hoge = moge;
」に慣れてると奇妙だけれど。上の例でいう「l:out2
」の部分ですが。あ、「l:
」はローカル変数の意です。このスクリプトを作るにあたって、以下のドキュメントを参考にしました。
- Vim エディターのスクリプトの作成: 第 1 回 変数、値、式
:h functions
追記: Vim神からの啓示を受けて、以下のように変更しました。
function! ChangeUL() range
let l:count = a:firstline
while l:count <= a:lastline
let l:str = getline(l:count)
let l:out = substitute(l:str, '^\s\+\(.\+\)', '<li>\1<\/li>', '')
call setline(l:count, l:out)
let l:count = l:count + 1
endwhile
call append(a:lastline, '</ul>')
call append(a:firstline - 1, '<ul>')
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> | 挿入モード時と同じように、コマンドモードでも<C-p>/<C-n>で単語補完を行う |
nnoremap <Esc><Esc> :nohlsearch | <Esc>連打で、強調表示を一時的に消す。 |
おすすめプラグイン
- ku.vim / fuzzyfinder.vim
- mru.vim
- quickrun.vim
- errormaker.vim
- css_color.vim
- surround.vim + repeat.vim
- Align.vim
- Snipmate.vim
- sudo.vim
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から山のように学ばせていただきました。ありがとうございます。おつかれさまでしたー!
- vim勉強会してきたー, sugarbabe335
- vim勉強会を開催しました, Webtech Walker
Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。