Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Vim script と vimrc の正しい書き方@nagoya.vim #1

33,044 views

Published on

  • Be the first to comment

Vim script と vimrc の正しい書き方@nagoya.vim #1

  1. 1. Vim script と vimrc の正しい書き方 2013/9/7 Nagoya.vim cohama / @c0hama
  2. 2. もくじ 1. Vim script とは? 2. 文法、変数、式 3. 制御構文 4. 関数、コマンド、autocmd 5. vimrc について 6. vimrc の正しい書き方
  3. 3. 1. Vim script とは?
  4. 4. さっきの復習 ● :から始まるコマンドをExコマンドと呼ぶ ● :write とか :quit とか :split とか
  5. 5. Vim script とは? ● Ex コマンドの : をとって適当なファイルに縦に 並べて書きます ● これが Vim script です ● vimrc は Vim が起動時に自動で実行する Vim script ファイル
  6. 6. Vim script が何故重要か? ● みんなプラグイン書きましょう ● vimrc は Vim script で書く ● つまり、Vim script を知っているとより凝った設 定を書くことができる ○ Ruby の時はインデント幅 2、JavaScript は 4 ○ 保存時に行末スペースをすべて削除 ○ 全角スペースを可視化する ○ etc
  7. 7. 注意 ❖ Vim script は vi からの後方互換性をひたすら 守りながら進化してきた言語です ❖ Vim の進化とともにいろいろな機能が後付けさ れてきました ❖ という理由があるので言語仕様に文句を言わな い(あきらめが肝心)
  8. 8. 2. 文法、変数、式
  9. 9. Vim script の文法 ❖ Vim script は全て Ex コマンド ❖ 大半は Ex コマンド + その引数という構文に なっている ❖ コマンドの引数がどのように解釈されるかは Ex コマンドによって異なる : echo "hello, world"vimrc に書くと きは : は不要 Ex コマンド 引数
  10. 10. Vim script の例 ❖ echo a b ➢ 変数 a と b の内容を出力する ❖ map a b ➢ a というキー入力を b というコマンドに割り当てる ❖ set foldmethod=marker ➢ foldmethod というオプションに文字列 "marker" を設 定する ➢ = の両側にスペースを入れることはできない ❖ let msg = "marker" ➢ msg という変数に文字列 "marker" を設定する
  11. 11. Vim script を書く上で重要なこと ● :help を引く ● どの Ex コマンドがどういう引数をとるかは全て :help に書いてある ● あと、引数を省略した場合とか ! を付けた場合 とか
  12. 12. 変数 ❖ let {変数名} = {式} ➢ 例) let name = "cohama" ➢ let x = 1 ➢ let x += 1 注意 ➢ x += 1 のようには書けません。 ➢ これは :x というコマンドに += と 1 という引数を渡すと いう意味 = Vim が終了する
  13. 13. データ型 ❖ 数値 ➢ 1 -3 0x2A 0777 ❖ 浮動小数点 ➢ 1.5 1.0e3 ❖ 文字列 ➢ "hoge" 'fuga' "u0061" ❖ リスト ➢ [1, 2, "hoge", [0.5, 1.2]] ❖ 辞書(連想配列) ➢ {"xyz": 123, "abc": [1, 2]}
  14. 14. 変数のスコープ ❖ トップレベルに書くとグローバル変数になる ❖ 関数の中に書くとローカル変数 ❖ その他は明示的に指定する ➢ g:hoge => グローバル ➢ l:fuga => ローカル ➢ s:piyo => スクリプトローカル ➢ a:abcd => 関数の引数 ➢ b:xxxx => バッファローカル ➢ w:yyyy => ウィンドウローカル ❖ プラグインの設定でよくグローバル変数を使う ❖ バッファローカルもたまに使う
  15. 15. 式 ❖ 式が必要とされている場所では、式が使える ❖ 数値計算 ➢ 1 + 1.5 a * 2 (3/2 + 1) % 4 ❖ 文字列連結 ➢ "hoge" . "fuga" ❖ リスト連結 ➢ [1, 1, 3] + [4, 5] ❖ 比較 ➢ 3 > 2 "hoge" =~# "^ho.*" ❖ 条件演算子 ➢ (a == 42) ? "correct" : "wrong"
  16. 16. コメント ❖ Vim script におけるコメントは " ❖ ただし、コメントを書けない場合があるので注意 " これはコメント let a = 1 " これもコメント map a b " これはコメントではない!
  17. 17. 3. 制御構文
  18. 18. if {condition} {statement} endif if {condition} {statement1} elseif {condition} {statement2} else {statement} endif 条件分岐 if g:is_windows colorscheme molokai else colorscheme desert endif 例) Windows とそれ以外でカ ラースキームを変える
  19. 19. ループ for {var} in {list} endfor while {cond} {statement} endwhile for i in range(1, 10) echo i endfor 例) 1 から 10 までを出力する
  20. 20. 例外 try {try-block} catch /{pattern} {catch-clause} finally {finally-clause} endtry throw {expr} Vim script で正しく例外処理を行 うのは結構難しい
  21. 21. 4. 関数、command、 autocmd
  22. 22. 関数 ❖ もちろん Vim script にも関数はある ❖ 組み込み関数 ➢ str2nr() : 文字列から数値を返す ➢ sin() : sin 関数 ➢ len() : リストまたは辞書の要素数を返す ➢ getpos() : カーソルの位置を返す ➢ rename() : ファイルの名前を変更する
  23. 23. ユーザ定義関数 ❖ 自分で関数を作る " 引数を2倍して返す関数 function! Double(x) return 2 * a:x endfunction " 保存してウィンドウを閉じるユーザ定義関数 function! WriteQuit() write quit endfunction
  24. 24. ユーザ定義コマンド ❖ :コマンドもユーザで定義できる " 1行目を削除するExコマンド command! DeleteFirstLine 1delete " 複雑なことを行うExコマンド command! DoSomething call DoSomething() " 引数を取る場合 command! -nargs=* Hoge call Hoge(<f-args>)
  25. 25. autocmd 特定のイベントが発生した際に自動的にコマンドを 実行させる autocmd [group] {event} {pat} {cmd} " 保存時に行末スペースを取り除く autocmd myvimrc BufWritePre * %s/s+$//e
  26. 26. イベント autocmd に指定できるイベントの例 ❖ BufWritePre ➢ バッファ全体が保存される直前 ❖ BufWritePost ➢ バッファ全体が保存された後 ❖ WinEnter ➢ 別のウィンドウに入った後 ❖ WinLeave ➢ ウィンドウから離れる前 ❖ FileType ➢ filetype が設定された時
  27. 27. 5. vimrc について
  28. 28. vimrc とは Vim の設定ファイル Vim を Vim として使うために(ほぼ)必須 vimrc があると Vim は自動的に 'compatible' オプションをオフにする (Vim が Vim として動作するようになる)
  29. 29. vimrc の配置 ❖ Unix 系の場合 ➢ $HOME/.vimrc ➢ $HOME/.vim/vimrc (Vim 7.4 から) ❖ Windows の場合 ➢ $HOME/_vimrc ➢ $HOME/vimfiles/vimrc (Vim 7.4 から) ❖ .vim (または vimfiles) で全てを管理するのがおすすめ ❖ ちょっと Vim script を書くだけで、Unix 系と Windows の設 定を共有することも可能 ('runtimepath' を設定)
  30. 30. vimrc には何を書くの? ❖ オプション ❖ マッピング 他には ➢ ユーザ定義コマンド ➢ プラグインの設定 などなど
  31. 31. オプション ❖ Vim の設定といえばオプション ❖ 数えたら 350 くらいありました " オン(オフ)にする set number set nonumber " バッファローカル setlocal tabstop=4 setlocal foldmethod=marker
  32. 32. オプション " デフォルト値に戻す set runtimepath& " オンとオフを切り替え set cusorline! " オプションを変数のように設定・取得 let &shiftwidth = g:indent let &tabstop = &shiftwidth
  33. 33. おすすめのオプション ...とかを当てにしない いろいろ試しながら自分に一番合う設定をさがしま しょう :options :help options :help option-list 「Vim オプション 一覧」とかで検索して出てくるやつは情報古い ネットよりも:help
  34. 34. マッピング あるキーの入力を別のコマンドに認識させる " <F5> を押すと先頭行に #!/bin/sh と入力 map <F5> ggO#!/bin/sh<ESC>
  35. 35. マッピングの種類 ❖ モード別のマッピング ➢ nmap : ノーマルモード ➢ imap : インサートモード ➢ xmap : ビジュアルモード ※ 他にもある ❖ 再マップする、しない " : と ; を入れ替え noremap : ; noremap ; : ※ 再マッピングする意思がなければ基本的には nnoremap
  36. 36. より柔軟なマッピング <expr> をつけると式の評価結果にマッピングできる " 下の2つは同じ意味 nnoremap j gj nnoremap <expr> j "gj" " 先頭行に変数の値を挿入する let g:shebang = "#!/bin/sh" nnoremap <expr> <F5> "ggO".g:shebang."<Esc>" さっきの nnoremap <F5> ggO#!/bin/sh<ESC>
  37. 37. 6. vimrc の正しい書き方
  38. 38. Vim script には罠がいっぱい 正しい書き方を Tips 形式で紹介します vimrc を正しく書く
  39. 39. vimrc を一瞬で開く、反映させる Vim のナイスな設定を思いついたら即座に vimrc を開いて編集することが重要 nnoremap <F5> :<C-u>edit $MYVIMRC<CR> gvimrc も必要なら追加 この部分をお好みのコマンドに変えよう ・split (水平分割) ・vsplit (垂直分割) ・tabedit (新規タブ) などなど
  40. 40. vimrc を一瞬で開く、反映させる vimrc を編集したら即座に反映させましょう nnoremap <F6> :<C-u>source $MYVIMRC<CR> :source $MYGVIMRC<CR> ※再読み込みすると問題が発生する場合があ る。これを防ぐにはリローダブルな vimrc を書く 必要がある
  41. 41. リローダブルな vimrc を書く ❖ 詳しくは kana さんの書いた「Vim の極め方」を 参照のこと(http://whileimautomaton.net/2008/08/vimworkshop3-kana-presentation) " 追加する形のオプションは一旦デフォルト値を設定 set backupdir& backupdir+=hoge " あるいは起動時しか実行されないようにする if has('vim_starting') set runtimepath^=~/.vim endif
  42. 42. リローダブルな vimrc を書く " autocmd が複数登録されないように最初に消しておく augroup myvimrc autocmd! augroup END " 必ず augroup 名を指定して書く autocmd myvimrc FileType scala setlocal sw=2
  43. 43. グローバルとローカルの設定を区別する ❖ 以下の設定の何が悪い? " JavaScript のときはインデント幅4 autocmd myvimrc FileType javascript set shiftwidth=4 tabstop=4 softtabstop=4 :set はグローバルな設定値も変更してしまう! 代わりに :setlocal を使う
  44. 44. グローバルとローカルの設定を区別する ❖ 正しい設定 " JavaScript のときはインデント幅4 autocmd myvimrc FileType javascript setlocal shiftwidth=4 tabstop=4 softtabstop=4
  45. 45. グローバルとローカルの設定を区別する ❖ 以下の設定の何が悪い? " 行末スペースをハイライトで可視化する match Error /s+$/ :match はカレントウィンドウにしか作用しない! (しかも vimrc 読み込み時の最初の1回だけ) WinEnter イベントを使ってカレントウィンドウが変わる都 度呼ばれるようにする
  46. 46. グローバルとローカルの設定を区別する ❖ 正しい設定 " 行末スペースをハイライトで可視化する autocmd myautocmd VimEnter,WinEnter * match Error /s+$/
  47. 47. マッピングを使い分ける ❖ マッピングを定義するためのコマンドはモードご とに細かく分かれている ➢ nmap ➢ xmap ➢ imap ➢ cmap ➢ smap ➢ omap
  48. 48. マッピングを使い分ける ❖ 以下の設定で何が起こるか? " 見た目通りに移動 noremap j gj noremap k gk ただの :map はノーマル+ビジュアル+セレクト+演算待ち モードに作用する ・セレクトモードで j が入力できなくなる  (neosnippet のようなプラグインで困る) ・dj のようなコマンドの挙動まで変わってしまう
  49. 49. マッピングを使い分ける ❖ こっちのほうが良さげ " 見た目通りに移動 nnoremap j gj xnoremap j gj nnoremap k gk xnoremap k gk " omap を残す場合 noremap j gj sunmap j noremap k gk sunmap k
  50. 50. 既存のコマンドを潰さないようにする ❖ 以下の設定の何が悪い? " Ctrl+A で全選択 nnoremap <C-a> ggVG <C-a> はカーソル下の数値をインクリメントする便利なコ マンド。 これを潰してしまうなんてもったいない!
  51. 51. 既存のコマンドを潰さないようにする ❖ 正しい設定 " g Ctrl+A で全選択 nnoremap g<C-a> ggVG マッピングする前に :help ^a などで調べること
  52. 52. 既存のコマンドを潰さないようにする ❖ 以下の設定の何が悪い? " <Tab> で現在行をインデント nnoremap <Tab> >> Vim では <Tab> と <C-i> が同一視される。 <C-i> は進むコマンドなので潰すのはもったいない! 同一視されるのは他にも <C-m> と <CR> など
  53. 53. 既存のコマンドを潰さないようにする ❖ 正しい設定 " <Tab> で現在行をインデント nnoremap <Tab> >> " 進むコマンドを退避 nnoremap <C-i> <C-i>
  54. 54. まとめ Vim script はチューリング完全 Vim script でなんでもできる vimrc を書いて Vim を自分に最適化 罠に注意
  55. 55. おわり

×