知らないと損するvim知識30選

知らないと損するvim知識30選
はじめに
毎日プロテイン&筋トレを忘れない漢、vimtakuです。
何を目指しているの?っていわれます。何を目指しているんでしょうか。


社内向けに勉強会をやるべってなったので
社外にブログを公開してそれを題材に社内向けに勉強会するために
久しぶりにブログを書いているわけです。
ちなみに、タイトルはホットエントリーメーカーを参考に作った。
どうでもいいですね。では早速。


想定読者
- おそらくvim弱を脱しているくらいの人
-- http://ppworks.hatenablog.jp/entry/sendagayarb25
- vim 中級者(中級者の定義がわからないけどたぶん中級者位までに通じる内容だと思う)
- neobundle, unite.vim とかは知ってる
- これらを知っておくと少しドヤ顔出来るかもしれない


生きる上でかなり便利系

neobundle.vim

言わずもがな。省略。

NeoBundle 'Shougo/neobundle.vim.git'


unite.vim

やっぱないとどう仕様も無いレベルだし言わずもがななので特に説明はしないです。

NeoBundle 'Shougo/unite.vim.git'


qfixhowm.vim

dropbox との連携で神がかり化する。
Vimmer ならもちろんちょっとしたメモを取るのに
もちろん vim を使うと思うんだけどこれを使うと本当に
他の memo 系統は使いたくなくなる。
でも実は悩みがあって, これの memo を見る iPhone クライアントが
dropbox の公式アプリしかないので, ほぼないと言ってもいいレベル。
evernote とかは まぁそこそこ見やすいんだけど
いちいち開くのがだるかったりするのであんまり好きじゃない。
iPhone アプリクライアント作りたいなぁ。

NeoBundle 'git://github.com/fuenor/qfixhowm'


vim-mlh

おそらく全世界で2人くらいしか利用者がいない plugin。(拙作, 宣伝)
ローマ字で文字を入力したあと / で文字を変換することができる。
富豪的google transliterate API (google に ローマ字を投げると
文節とかを分けた結果がいい感じに帰ってくるAPI) を使っているので
インターネットコネクションが必須だったりして結構大変なんだけど、
これがまた googleAPI がクオリティ高いおかげで結構いい感じに文章を書くことができる。
実はこの文章もこれを使って書いている。
特に ちょっと 日本語で comment とかしたい時に有効かも。
無駄に skk-large-jisyo とかを使って変換候補を増やすこともできる。
実はローマ字の文節を区切る software
は結構あるので(ちょっと試したことがあるんだけど)
それをlocal に立てて通信とかできるようになったらもっと面白いかも。

see also: http://d.hatena.ne.jp/vimtaku/20111224/1324713931

NeoBundle 'vimtaku/vim-mlh.git'


unite-giti

git 使うとき結構便利。
diff とか部分的に見れたり remote branch を削除したりできる。

全然関係ないけど emacs の magit っていうやつはかなり便利らしい。

NeoBundle 'kmnk/vim-unite-giti.git'


perl の会社で働く自分がよく使っているvim plugin

text-obj-wiw

hoge_fuga_piyo みたいな underscore で区切られた部分や
HogeFugaPiyo みたいな camelize された部分を text obj としてあつかうことができる。
hoge_id とかを fuga_id とかにしたい時とか結構コピペしながら使うことがあるので
そういう時によく使う。

(
hoge_id => $hoge_id,
fuga_id => $fuga_id,
)

こういうやつ。

" original
NeoBundle 'git://github.com/h1mesuke/textobj-wiw.git'
" 自分でフォークして使っている版
NeoBundle 'vimtaku/textobj-wiw.git'


tcomment_vim

もちろんコメントアウトとかするとおもうんだけど
filetype に応じた comment out を提供してくれるのですごく便利。
visual mode で go とかするとできるように設定している。
なぜ go に設定しているかは謎。

NeoBundle 'tomtom/tcomment_vim.git'


text-obj-sigil

拙作でもうしわけないんですけどこれ。
$hoge とか $hoge->fuga とか $meso{ $hoge->{'fuga'} } とかを
text obj として扱うことができる。

see also: http://d.hatena.ne.jp/vimtaku/20110703

NeoBundle 'vimtaku/vim-textobj-sigil.git'


text-obj-doublecolon

拙作でもうしわけないんですけどこれ part 2。
use Hoge::Fuga::Meso::Piyo;
とか結構書いたりするんだけど :: で繋がっている部分を
text-obj として扱うことができる。
実は :set iskeyword+=: とかすると同じようなことが出来るんだけど
Hoge の部分を yank したりするのが辛くなるので便利。
(textobj-user は神plugin)

NeoBundle 'vimtaku/vim-textobj-doublecolon.git'


text-obj-between

my @list = qw/hoge fuga piyo/;
とか書くときにすごくhoge fuga piyo 一気に消したくなっちゃう時とかあって、
そういう時に dif/ とかすると消せる。オススメ。

NeoBundle 'thinca/vim-textobj-between.git'


vim-surrond.vim + vim-repeat.vim

いわずもがなだとおもうんだけどこれ。
textobj を char で囲むことができる。
siw{ と siw} の違いは意外に知られていない事実の予感なのでいちおうかく。
siw{ だと { hoge }, siw} だと {hoge} となる。
つい癖でsiw{ を押してしまって space を x で消す というのを何度もやってる。

NeoBundle 'tpope/vim-surround.git'


perldoc.vim

:Perldoc -f sprintf
とかしていい感じに見れる。
たまに使う。
mattn さんの記事を見ていれた。
http://mattn.kaoriya.net/software/lang/perl/20100901231137.htm

NeoBundle 'mattn/perldoc-vim.git'


operator-replace.vim

これもあちこち言及されてる気がするけど本当に便利。
yank しているものを text-obj の部分と入れ替えることができる。

NeoBundle 'kana/vim-operator-user.git'
NeoBundle 'kana/vim-operator-replace.git'


alignta.vim

my %hoge = (
    hoge => $hoge,
    fugafuga => $fugafuga,
    piyo => $piyo,
);

とか書くじゃないですか。たくさん。
visual mode とかで選択範囲を => って打つと
いい感じに整列できるようにしているのでこれはオススメだ。

" for alingta
vnoremap <silent> => :Align @1 =><CR>
vnoremap <silent> = :Align @1 =<CR>
vnoremap <silent> == =

こんな感じに設定している。

NeoBundle 'h1mesuke/vim-alignta.git'

基礎コマンド編


g; or g,
最後の編集した箇所に戻ってくる。
上の方とか行って戻ってくるときに使う。ないと死ぬ。



gu or gU
text obj を upper case , lower case に変換できる operator。



ciW
何故か基礎的なコマンドなんだけどなぜか昔全然使えてなかった。
hoge fuga みたいな space
で囲まれている部分とかを消すときに使う。カジュアルに。



gJ
space をいれないで 文字列の連結を行うことができる。
J も gJ も両方使える。



_
normal mode で行頭に行くときは何派が多いのだろうか。
_ はかなり便利だ。
0 は遠いし, 文字の先頭に行ってくれないので。



insert mode で=数式
1298 + 3819 みたいな計算をたまにしたい時があるけど
insert mode で =1298 + 3819= とかで
計算できて嬉しい, みたいな。



"で"レジスタの内容を貼付けることが出来る。
:reg とかでレジスタを確認して
4 とかをおして見ると何かと便利。
", / は特に日頃よく使っているので
これはしっておくとかなりいいと思う。


dit
hoge
tag の text-obj だよっていうだけ。


ぜひ設定しておいてほしい設定

set listchars=tab:>-,trail:-,nbsp:-,extends:>,precedes:<,

末尾のspace とか tab と space の混在とか
そう言うのを可視化して減らすことができる。
経験上 IDE で書いていると結構 space とか入っちゃう気がする。
神経質な人間にはオススメしない。いや逆か?
(僕もはっきり言って曖昧なので細かいオプションは :help 見てください)


こっからは好み, .vimrc 編

nnoremap : q:a
nnoremap / q/a

ujihisa さんが教えてくれたやつ.
これは/ とか押したときに command line window をひらいて
そこで vim を使えるようにできるからおすすめ。

set scrolloff=10

スクロールするときにいちいち画面の一番上とかに行かなくても
スクロールが開始されるので source reading しやすい。

" paste yanked string vertically
vnoremap <C-p> I<C-r>"<ESC><ESC>

の時に とか押すと vertical に paste ができる。
意外にそういう時ってあるとおもうんですよ。

nnoremap <C-h> :noh<CR>

help 派が多い気がするんだけど実際 help 引くより
コード読んだりする時間のほうが僕の中では圧倒的に多いので
かなりおすすめの設定。:noh って打つの大変だし。

" for masui special.
noremap g<CR> g;
nnoremap <CR> :<C-u>w<CR>

増井 俊之さんっていう方が考案したとまことしやかに囁かれている
Enter と semicolon を入れ替える技術があるんだけど、
僕も懐疑的にそれを使ってみて抜け出せなくなったパターンで、
自分が使うマシンは常にそれを設定している。
(mac ならkeyremap4Macbook, win なら 窓使いとかのどかとかで)

上記の設定でnormal mode の Enter を押すだけで保存できるようになっている。
:w は昔は律儀に押していたけど最近は keyboard 的にsemicolon を押すだけで
保存されるという感じになっている。オススメ。


" qでウインドウを閉じて Qでマクロ
nnoremap q :<C-u>q<CR>
nnoremap Q q

code を読むときはtab で展開するんだけど意外に閉じたりすることも多く、
:q が結構面倒くさくなってきていた。
(vimperator を使う方ならわかると思うけど d で tab
を消せるのが意外に便利だったりする。)
なので普段頻度が高いわけでもないマクロのq を Q に置き換えて
q を buffer を閉じるにした。マジ便利。


所感
自分のこだわりな設定をかなり書けた。割とこだわって厳選した。

Neobundle で一応書いている部分は依存関係が書かれていないので
エラーとか言われるかもしれない。

最後に
社内の人にそこまで vim に詳しいなら vim に還元しろって言われたので
vim advent calendar 2012(http://atnd.org/events/33746)
に勢いで登録してしまいました。
ネタ(plugin かなぁ)を勢いで作んなきゃなァ。

「これをみている人たちも参戦すればいいと思うよ!」
こうささやくんだ、俺のゴーストが。