人類はもっともっとVim本来の機能を使うべきだった
人類はもっともっとVim本来の機能を使うべきだった
はじめに
所属サークルにいるvimmerが使っていなさそうな機能に焦点を当てているので, 若干紹介している機能に偏りがある恐れがあります.
この記事は,SLP_KBITその2 Advent Calendar 2016の18日目の記事です。 また,人類はもっとvim本来の機能を使うべきだったの続きなのでここで紹介している機能は紹介しません.
特に,サークル生がvimを使う上で使っていなさそうな機能に焦点を当てて紹介を行います.
遅刻してすみませんでした.
目次
外部ツール連携編
移動編
{
,}
を使って移動<C-^>
は<C-6>
でもよい:ls
で buffer 一覧を確認し,指定した buffer に移動する
外部ツール連携編
vimの中からgrep
vimは,標準で :grep
というコマンドがあります.これは,外部のgrepを呼び出し
その結果をQuickFixに流し込無事ができるというものです.
QuickFixというのは,make時のエラーや検索の結果の該当位置をリストで保持し, かんたんにジャンプするためのbufferです.
また,'grepprg'
というオプションをセットすることで,外部grepに用いる,
grepコマンドを選択することができます.具体的には,ag
や git grep
などを
vimの中から叩くことができ,さらにその結果をQuickFixに流し混むことが
できるというものです.
ここでは,git grep を用いる例を紹介したいと思います.
set grepprg=git\ grep\ -I\ --line-number
デモアニメーションのように,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に戻ってくるので便利です.
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してくれます.
外部アプリケーションを使うことで,pluginを使わずmarkdownのlivepreviewができるようになりました.
コマンドの結果をvimに流し込む
vimの実行時に -
オプションを付与することで,標準出力をvimに流し込む事ができます.
curlなどを叩いて,jsonを整形&編集したいときなどで,便利です.
web上のファイルをそのまま開く
vimは,:edit
に URLを渡すと,そのURLをダウンロードし開いてくれます.
wget して エディタで開くという二手間が,vimの中から開くことで一手間に変わります.
移動編
{
,}
を使って移動する
意外と知られていない移動モーション,{
,}
を紹介します.
{
,}
は,それぞれ,前後の段落に対するモーションです.
前後の空行に移動すると思えば良いです.大きく上下に移動したいときや, 一つ上の関数定義などに飛びたいとき便利な場面が多いです.
他にも,(
, )
, [[
, ]]
, []
, ][]
などの便利なモーションが存在します.
興味のある人は,:help
を使って調べてみてください
<C-^>
は <C-6>
でもよい
<C-^>
の便利さは,昨年紹介しました
<C-^> : 直前のバッファに移動する
人類はもっとvim本来の機能を使うべきだった - うどん よこみち
一つ前のbufferに戻るという便利な移動コマンド <C-^>
ですが,JISキーボードでは
そこそこ押しやすいですが,USキーボードではとても押しづらいです.
(Shiftを押す必要があるため)
そんな,<C-^>
ですが,実は<C-6>
でも動きます.
:ls
で buffer 一覧を確認し,指定した buffer に移動する
vim では,:ls
コマンドで,開いたbuffer一覧を取得することができます.
そして,:edit #[number]
で,指定した buffer id を開くことができます.
:Unite buffer
に当たることを,pluginなしで実現することができます.
(Uniteが使えるのであれば使えばいいが,Uniteがないとbufferの移動ができないというのは良くない)
個人的には, :Unite buffer<CR>
とタイプするコストと :ls<CR>:e #[number]<CR>
をタイプするコストはそんなに変わらない
まとめ
vimはpluginもイケているが,素の機能もイケている. 自分の好みに合わせて選択すると良いだろう.
vimの素を知っておくと,拡張がない場面でも難なくテキスト編集できるのではないだろうか.