読者です 読者をやめる 読者になる 読者になる

人類はもっともっとVim本来の機能を使うべきだった

人類はもっともっとVim本来の機能を使うべきだった

はじめに

所属サークルにいるvimmerが使っていなさそうな機能に焦点を当てているので, 若干紹介している機能に偏りがある恐れがあります.

この記事は,SLP_KBITその2 Advent Calendar 2016の18日目の記事です。 また,人類はもっとvim本来の機能を使うべきだったの続きなのでここで紹介している機能は紹介しません.

特に,サークル生がvimを使う上で使っていなさそうな機能に焦点を当てて紹介を行います.

f:id:maxmellon:20161225164711p:plain

遅刻してすみませんでした.

目次

  • 外部ツール連携編

    • vimの中からgrep
    • markdownをいい感じにpreviewしながら書く
    • コマンドの結果をvimに流し込む
    • web上のファイルをそのまま開く
  • 移動編

    • {,} を使って移動
    • <C-^><C-6> でもよい
    • :ls で buffer 一覧を確認し,指定した buffer に移動する

外部ツール連携編

vimの中からgrep

vimは,標準で :grep というコマンドがあります.これは,外部のgrepを呼び出し その結果をQuickFixに流し込無事ができるというものです.

QuickFixというのは,make時のエラーや検索の結果の該当位置をリストで保持し, かんたんにジャンプするためのbufferです.

また,'grepprg' というオプションをセットすることで,外部grepに用いる, grepコマンドを選択することができます.具体的には,aggit grep などを vimの中から叩くことができ,さらにその結果をQuickFixに流し混むことが できるというものです.

ここでは,git grep を用いる例を紹介したいと思います.

set grepprg=git\ grep\ -I\ --line-number

f:id:maxmellon:20161225164752g:plain

デモアニメーションのように,vim内部から素早く git grep を叩くことができ, 更にそれをリストから自由自在に選択できます. コマンドライン上で,grepを叩いて頭で行番号を覚えることから脱却しましょう.

常に 'grepprg'git grep にしていると,git管理下ではないソースコードに対して grepをかけるときに不便です. そこで,私は,:grep をラッピングしたコマンドで運用しています.

function! s:gitgrep(query)
  let l:current_grep = &grepreg " 前回の設定値の保存
  setlocal grepprg=git\ grep\ -I\ --line-number
  execute 'silent grep! ' . a:query
  let &grepprg = l:current_grep
  redraw!
endfunction

command! -nargs=? Ggrep call s:gitgrep(<f-args>)

function! s:jvgrep(query)
  let l:current_grep = &grepprg
  setlocal grepprg=jvgrep
  execute 'silent grep! ' . a:query ' ./*'
  let &grepprg = l:current_grep
  redraw!
endfunction

command! -nargs=? Jvgrep call s:jvgrep(<f-args>)

augroup Vimrc
  autocmd!
  autocmd QuickFixCmdPost make,*grep* cwindow
augroup END

:grep の前に,:silent を挟むことで,Returnキーを押下することなくVimに戻ってくるので便利です.

f:id:maxmellon:20161225164839g:plain

markdownをいい感じにpreviewしながら書く

vimで結構めんどくさいのが,マークダウンを preview しながら書くことです. kannokanno/previm を利用すれば, 実現できるらしいですが,ここではもっとお手軽にプラグインなしで livepreviewを実現する方法を紹介したいと思います.

利用するツールは rhysd/Shiba です.

これは,markdownのlivepreviewに特化したアプリケーションで,ファイルの変更を監視し, 変化があったときに自動でリロードしてくれるというものです. このツールの良いところは,markdownのpreviewに機能を絞っている(エディタに依存がない) ので,様々なツールから扱うことができるということです. ここでは,vimとの組み合わせを紹介したいと思います.

shibaのインストールですが,npmを経由してインストールする場合は,nodeが必要です.

$ npm install -g shiba

パッケージ済みのものをインストールする場合は特に必要ありません. npm経由でアプリケーションを落とさなかった場合は,落としたアプリをコマンドラインから 呼べるように`PATH``を通しておくと便利です.

インストールが完了すれば,これをvimから立ち上げるコマンドを定義します.

command! Shiba :silent call system('shiba ' . expand('%') . ' &>/dev/null 2>&1 &') | redraw!

このコマンドを定義することによって vim の中から shibaを立ち上げることができ, 現在のbufferに対してlivepreviewしてくれます.

f:id:maxmellon:20161225164920g:plain

外部アプリケーションを使うことで,pluginを使わずmarkdownのlivepreviewができるようになりました.

コマンドの結果をvimに流し込む

vimの実行時に - オプションを付与することで,標準出力をvimに流し込む事ができます. curlなどを叩いて,jsonを整形&編集したいときなどで,便利です.

f:id:maxmellon:20161225165230g:plain

web上のファイルをそのまま開く

vimは,:edit に URLを渡すと,そのURLをダウンロードし開いてくれます. wget して エディタで開くという二手間が,vimの中から開くことで一手間に変わります.

f:id:maxmellon:20161225165301g:plain

移動編

{,} を使って移動する

意外と知られていない移動モーション,{,} を紹介します.

{,} は,それぞれ,前後の段落に対するモーションです.

前後の空行に移動すると思えば良いです.大きく上下に移動したいときや, 一つ上の関数定義などに飛びたいとき便利な場面が多いです.

f:id:maxmellon:20161225165336g:plain

他にも,(, ), [[, ]], [], ][] などの便利なモーションが存在します. 興味のある人は,:help を使って調べてみてください

<C-^><C-6> でもよい

<C-^> の便利さは,昨年紹介しました

<C-^> : 直前のバッファに移動する

人類はもっとvim本来の機能を使うべきだった - うどん よこみち

一つ前のbufferに戻るという便利な移動コマンド <C-^> ですが,JISキーボードでは そこそこ押しやすいですが,USキーボードではとても押しづらいです. (Shiftを押す必要があるため)

そんな,<C-^> ですが,実は<C-6> でも動きます.

f:id:maxmellon:20161225165421g:plain

:ls で buffer 一覧を確認し,指定した buffer に移動する

vim では,:ls コマンドで,開いたbuffer一覧を取得することができます. そして,:edit #[number] で,指定した buffer id を開くことができます.

:Unite buffer に当たることを,pluginなしで実現することができます. (Uniteが使えるのであれば使えばいいが,Uniteがないとbufferの移動ができないというのは良くない)

個人的には, :Unite buffer<CR> とタイプするコストと :ls<CR>:e #[number]<CR> をタイプするコストはそんなに変わらない

f:id:maxmellon:20161225165458g:plain

まとめ

vimはpluginもイケているが,素の機能もイケている. 自分の好みに合わせて選択すると良いだろう.

vimの素を知っておくと,拡張がない場面でも難なくテキスト編集できるのではないだろうか.