この辺の人の話です
暗黒美夢王(@ShougoMatsu)さん>>(超えられない壁)>> 自分 >>vimを使い始め>>vim使ったことない
しばらくvimを使ってきて、いろいろ設定を変えたり、プラグインを入れたりして大分馴染んできました。
Vimは使いこなせば便利なのですが、いきなり使いこなそうとすると死ぬので、とりあえず使えるレベルから初めて徐々にコマンドを覚えていけばよいかと思います。
なんていうかスポーツと一緒でいきなりオリンピック選手にはなれないので、基礎練しっかりやって、次のステップに行きましょう。覚えるというよりかは体に染み込ませるみたいな感じ。jキーのカーソル移動が上か下かはパッとでてこないけど、手をホームポジションに置くと自然と動かせるあの感じです。
新しいこと覚えたら、この記事更新していきますので、ストックしておくといいことがあるかもしれません。
なんか結構長いので、とりあえずちょっとカスタマイズしてみたい人は下記の設定をおすすめ!
多分この4つやっただけで、だいぶ使いこなせている感でますw
特にカラースキーマを変更すると、自分用にカスタマイズした感がでてvimに愛着がわきます(きっと)。
だって、
全部見るの面倒って言う人のために.vimrcはここにおいておきますね。
https://github.com/ykyk1218/myvim
プラグインと小技系はこちらをみた方がよいです。
プラグインまとめ
小技まとめ
まだまだ使いこなせてないです。もっとこんな便利な使い方あるよーって言う方いたら教えてください!
Vim使い始め
vimすげーよ、vim超便利、という話はよく聞いていたのですが、いざ自分が使ってみると、使いにくいことこの上ない。
- 矢印しか使えないのでカーソル移動が遅い
- コピペできない
- とりあえず':wq'だけ覚える
といった状態でした。
この状態で僕がやったことは、将来は使えると絶対便利になると思っていたので、
とりあえず無理やり使うようにしてました。
「今回はVimで全部コーディングする!」みたいに決めて、ちょっと操作がわからなければすぐに検索して覚えるようにしてました。
このころ使えていたコマンドはせいぜいyy→pぐらいですねw
後はこういうサイトでvimの操作になれるようにしていきました。
VIM Adventures
http://vim-adventures.com/
Vimで作業できるレベルになったころ
ある程度なれてきて、単純カーソル移動ぐらいならできるようになってくると、こういう設定した方がいいのではという事を考えるようになってきました。
特に書く最初のころは行頭(^
)と行末($
)にカーソルを移動させるのが面倒だったので、ここの部分のキーマッピング設定しました。
inoremap <C-e> <Esc>$a
inoremap <C-a> <Esc>^a
noremap <C-e> <Esc>$a
noremap <C-a> <Esc>^a
これの意味は
設定 | 内容 |
---|---|
inoremap | インサートモードでキーマッピング |
noremap | ノーマルモードでキーマッピング |
なので、inoremap <C-e> <Esc>$a
は
Ctrキーとeキーを押したときにノーマルモードに変更してカーソルを行末に移動して、挿入モードにする、となります。
たったこれだけだったのですが、意外とこれで結構変わりました。後はもう一つ個人的には結構衝撃的なことがありました。
カーソルの速度を変える
カーソル移動のキーを覚えてないので、ちょっとしたカーソル移動にも不便を感じていたのですが、下記の設定をしてからカーソル移動でのストレスが激減しました。
http://qiita.com/ykyk1218/items/8f5471c5e90cc83fd407#番外編キーリピートを高速化
Vimのコマンドをいろいろ覚え始めた
このころから本格的Vimのコマンドを覚え始めました。
もっと簡単にカーソル移動できないかな?
もっと簡単にファイルを開けないかな?
もっと簡単にファイル編集できないかな?
というのをちょくちょく考えてやるようにはしてました。とはいえまだ、このころでも普通のエディタ(サブライムテキストとか)のほうが使い勝手がよかったので、たまにそっちを使うことはありましたが。
このころに覚えたキー達です。
カーソル移動系コマンド
キー | 動作 |
---|---|
w | 右に進む |
b | 左に戻る |
gg | ファイルの先頭に移動 |
G | ファイルの末尾に移動 |
M | 画面の真ん中に移動 |
Ctr-f | 一画面進む |
Ctr-b | 一画面戻る |
他にもいろいろあるのですが、この辺が使えてれば作業には困らないレベルにはなっていると思います。
このころはj、k、l、hのカーソル移動がまだ、ままならなかったのでとりあえずj、kだけ覚えてカーソルの右、左はwキーとbキーに委ねるようにしてました。
ファイル、ウィンドウ操作
キー | 動作 |
---|---|
:e <ファイルパス> | 現在のウィンドウにファイルを開く |
:sp <ファイルパス> | 現在のウィンドウを横に分割してファイルを開く |
:vp <ファイルパス> | 現在のウィンドウを縦に分割してファイルを開く |
Ctr+w+w | 次のウィンドウへフォーカスを移動 |
Ctr+w+↑(k) | 上のウィンドウへフォーカスを移動 |
Ctr+w+↓(j) | 下のウィンドウへフォーカスを移動 |
Ctr+w+- | 現在のウィンドウを広げる |
Ctr+w+= | 全てのウィンドウの大きさを揃える |
u | アンドゥ |
ctr+r | リドゥ |
正直これだけだと、まだ不便さが拭えなかったです、、、最低限の必要なところですね。
でもウィンドウを分割するようになると、 ちょっとしたやってる感がでてvimに興味が湧いてきました。
画面分割に関しては、僕は横がメインです。
Ctr+hogeのところはCtrキーは押しっぱなしで問題ないです。
検索
キー | 動作 |
---|---|
/<検索ワード> | 指定したキーワード検索 |
n | 次の検索結果にカーソルを移動 |
N | 前の検索結果にカーソルを移動 |
これだけ
とりあえずどうにかなります。
その他
入力補完
Ctr+p
入力中にキーをctr+pを押すと、補完してくれます。次に出てくるneocomplecacheを覚えるまでの間重宝しました。
ビジュアルモード
通常モードでv
を押すとビジュアルモードになります。
このビジュアルモードを覚えるまでは、複数行をコピーするのに、y3
とかでできるのですが、いかんせん何行目までをコピーすればよいのかがパット見でわからないことがほとんどなので、いちいちマウスを使って普通のエディタみたいにコピペしてました。
ビジュアルモードをマスターしてからは、
1. ビジュアルモードでコピーしたい範囲を選択
2. y
でヤンク
3. ペーストしたい箇所にカーソルを移動して、p
でペースト
とできるようになりました。
(この場合いちいちカーソルがビジュアルモード開始位置に移動するのですが、これどうにかならないかな・・・)
Vimのプラグインを入れ始めた
いよいよ本格的にVimをカスタマイズしていくようになりました。プラグインの登場です。
ファイル間の移動がとにかくやりずらかったので、まずはその辺のプラグインを探し始めました。
NeoBundle
vimのプラグイン管理はこれがなければ始まらないので、とりあえずいれます。
https://github.com/Shougo/neobundle.vim
設定は
https://github.com/Shougo/neobundle.vim#quick-start
こちらの手順通りにやればうまくいくと思います。
カラースキーマの設定
NeoBundle入れたついでにカラースキーマの設定を変えました。
NeoBundleでインストールできるので、簡単。もっとはやくやればヨカタ。
NeoBundle 'w0ng/vim-hybrid'
colorscheme hybrid
僕はこのhybridを使ってます。
使える色の一覧はこちら
http://cocopon.me/app/vim-color-gallery/index.html?welcome=1
しかし、デフォルトのvimの色ってなぜにああもドギツイ色設定になっているのか・・・
NEADTree
https://github.com/scrooloose/nerdtree
まずはこれ。フォルダ階層をツリー表示してくれるすぐれものです。
各ノードで押すキーによってファイルの開き方を変えることができます。
キー | 動作 |
---|---|
enter | 直前のバッファのウィンドウで開く(フォルダの場合は展開する) |
x | 展開したフォルダを閉じる |
i | 横に分割して開く |
s | 縦に分割して開く |
t | 別タブで開く |
又m
を押すとメニューが表示されてファイルのコピー、追加、削除、リネームができます。
コマンドラインにいちいち戻らなくていいので結構便利
この画面だけでことたります。
プラグインを実行するときに :NERDTreeToggleと打つ必要があるのですが、面倒なのでキーマッピングさせました。
nnoremap :tree :NERDTreeToggle
似たようなプラグインでvimfilerというのもあります。
https://github.com/Shougo/vimfiler.vim
こちらはツリー表示を全画面でだすようになります。vimになれている人だとツリー表示させてファイル間移動するのはかったるいと思いますが、僕ぐらいのvimレベルだとこうしたプラグインは大変ありがたいです。
Unite.vim
https://github.com/Shougo/unite.vim
ファイル開くときには先ほどの、NEADTreeか、:sp、:eを使って開くことが多いのですが、もう少しさくっとイケてる感じでファイルを開けるのがこのUnite.vimです。
僕がこれを使う場面は、「さっき開いてたあれ、もう1回みたいなー」っていう過去のファイルを開きたいときです。
そんなときは、Unite.vimと同時に、Shougo/neomru.vimもいれます。
これがファイルを開いた履歴をUnite.vimを使用してみれるプラグインです。
Unite関連の.vimrcの設定は
" unite.vimの設定
noremap <C-U><C-F> :Unite -buffer-name=file file<CR> " ファイル一覧
noremap <C-U><C-R> :Unite file_mru<CR> " 最近使ったファイル一覧
au FileType unite nnoremap <silent> <buffer> <expr> <C-i> unite#do_action('split') " ウィンドウを分割して開く
au FileType unite inoremap <silent> <buffer> <expr> <C-i> unite#do_action('split')
" ESCキーを2回押すと終了する
au FileType unite nnoremap <silent> <buffer> <ESC><ESC> q
au FileType unite inoremap <silent> <buffer> <ESC><ESC> <ESC>q
Unite.vimのコマンドは基本長くて覚えられないので、これもキーマッピングさせてます。
↑のサンプルgif動画では
1. +:ファイルの閲覧履歴を表示
2. i:インサートモードに変更
3. 検索ワードを入力
4. 対象のファイルパス上でctr+i
という流れになってます。
neocomplcache(neocomplete)
https://github.com/Shougo/neocomplcache.vim
(neocomplcacheは保守のみになって、開発はneocompleteの方で行われているので、今から入れる人はneocompleteのほうが良いかと思います。
https://github.com/Shougo/neocomplete.vim)
私がNEADTree、Unite.vimと合わせて vim三種の神器と勝手に僕が呼んでいるneocomplacacheです。これは入力時に文字を自動補完してくれる、超頼もしいやつ。これがあると、IDEにも引けをとらない開発環境ができると思います。
ただ、こいつは設定する項目が多くてちと面倒
どこからかコピってきた設定をのせておきます。(すいません、どこからコピーしたかは忘れていましました・・・)
highlight Pmenu ctermbg=4
highlight PmenuSel ctermbg=1
highlight PMenuSbar ctermbg=4
" 補完ウィンドウの設定
set completeopt=menuone
" 補完ウィンドウの設定
set completeopt=menuone
" rsenseでの自動補完機能を有効化
let g:rsenseUseOmniFunc = 1
" let g:rsenseHome = '/usr/local/lib/rsense-0.3'
" auto-ctagsを使ってファイル保存時にtagsファイルを更新
let g:auto_ctags = 1
" 起動時に有効化
let g:neocomplcache_enable_at_startup = 1
" 大文字が入力されるまで大文字小文字の区別を無視する
let g:neocomplcache_enable_smart_case = 1
" _(アンダースコア)区切りの補完を有効化
let g:neocomplcache_enable_underbar_completion = 1
let g:neocomplcache_enable_camel_case_completion = 1
" 最初の補完候補を選択状態にする
let g:neocomplcache_enable_auto_select = 1
" ポップアップメニューで表示される候補の数
let g:neocomplcache_max_list = 20
" シンタックスをキャッシュするときの最小文字長
let g:neocomplcache_min_syntax_length = 3
" 補完の設定
autocmd FileType ruby setlocal omnifunc=rubycomplete#Complete
if !exists('g:neocomplete#force_omni_input_patterns')
let g:neocomplete#force_omni_input_patterns = {}
endif
let g:neocomplete#force_omni_input_patterns.ruby = '[^.*\t]\.\w*\|\h\w*::'
if !exists('g:neocomplete#keyword_patterns')
let g:neocomplete#keyword_patterns = {}
endif
let g:neocomplete#keyword_patterns['default'] = '\h\w*'
他にもいろいろいれた
後は、いろいろ進めていくうえで不便さを感じるところを解消できるプラグインないかなーと思って検索して取り入れていってます。
困ったことは検索すればだいたい解決。いい時代になりました。
キー | 動作 |
---|---|
vim-endwise | ruby向け、endを自動でいれてくれる |
html5.vim | html5のシンタックスカラーon |
vim-coffee-script | coffeeスクリプトのシンタックスカラーon |
vim-visual-star-search | ビジュアルモードで選択した範囲を*で検索できるようにする |
もっと便利になるように設定した
このころには、だいぶVimをストレスなく使えるようになってきて、必要最低限の動作はできるようになってきました。
ただ世の中には便利なエディタがいっぱいあるので、それらに使い勝手で負けてしまってはVimを使っている意味ないじゃないかと思い、コーディングスピードがあがる便利設定をしていくようになりました。
ctagsの活用
ctagsはソースコード上のメソッド名とか変数の宣言箇所のインデックスを作成するプログラムです。
これを使うことで宣言箇所にジャンプすることができます。
これはプラグインとかではなくて、Vim本体の機能です。
ctagsのインストール
macだと既に入っているみたいなのですが、オプションが微妙に違っているので別途インストールしましょう。
brew install ctags
ctagsの実行
ctags -R
これで、カレントディレクトリにtagsファイルが作成されます。
ctags使えるとこんな風にだいぶ便利にファイル間の移動ができます。
これは
1. ファイルを開く
2. hoghoge関数上でctr+]
3. 別ファイルに定義されているhogehoge関数にカーソルが移動
4. ctr+o
で前のバッファに戻る
5. 今度はctr+k
で先ほど開いたファイルををウィンドウを横に分割して開く
6. <ctr+w><ctr+w>
で最初のウィンドウにフォーカスをあてる
.vimrcへのctags用の設定はこちら
nnoremap <C-h> :vsp<CR> :exe("tjump ".expand('<cword>'))<CR>
nnoremap <C-k> :split<CR> :exe("tjump ".expand('<cword>'))<CR>
" unite-tagsの設定
autocmd BufEnter *
\ if empty(&buftype)
\| nnoremap <buffer> <C-]> :<C-u>UniteWithCursorWord -immediately tag<CR>
\| endif
ctagsで見つかったファイルを画面分割して開けるようにキーマッピングしてます。
都度タグを更新するのは面倒なのですが、勝手にタグが更新されるプラグインがあるので、こちらをいれておくと便利。
auto-ctags
https://github.com/soramugi/auto-ctags.vim
htmlの閉じタグ補完
htmlで閉じタグを勝手に補完してくれるやつ
</ を入力すると閉じタグを補完します
augroup MyXML
autocmd!
autocmd Filetype xml inoremap <buffer> </ </<C-x><C-o>
autocmd Filetype html inoremap <buffer> </ </<C-x><C-o>
augroup END
括弧の補完
{とか[とか(を入力してEnterを押すと閉じ括弧が自動で入ります。
ruby使い始めてからあんまり{}
を使わなくなってしまったので、出番が少なくなってしまいました。
inoremap {<Enter> {}<Left><CR><ESC><S-o>
inoremap [<Enter> []<Left><CR><ESC><S-o>
inoremap (<Enter> ()<Left><CR><ESC><S-o>
ヤンクレジスタ周りの設定
通常xキーで文字を削除するとヤンクの内容が上書きされてしまうので、xキーで文字を削除したときにヤンクした内容が消えないようにしました。
noremap PP "0p
noremap x "_x
以前に書いたこちらの記事を見ていただくとよいかもしれません。
http://qiita.com/ykyk1218/items/8f5471c5e90cc83fd407#%E3%83%A4%E3%83%B3%E3%82%AF%E3%81%97%E3%81%9F%E5%86%85%E5%AE%B9%E3%81%8C%E6%B6%88%E3%81%88%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
初期設定をいろいろ変えた
vimにはset hogehogeの設定がいろいろあるので、必要そうなのをもってきてます
set hlsearch
set ruler
set number
set noswapfile
set title
set incsearch
set wildmenu wildmode=list:full
設定 | 内容 |
---|---|
hlsearch | 検索結果をハイライト |
ruler | カーソル位置の行数と列を表示 |
number | 行数を表示 |
noswapfile | swapファイルを作成しない(ローカルだとswapファイルはむしろ邪魔なのでw) |
title | windowのタイトルを変更 |
incsearch | インクリメント検索 |
wildmenu | onにするとvimからファイルを開くときにリストを表示する |
wildmode | wilemenuのモード、list:full |
TABキーを押すことで、ファイルの候補を表示させていきます。
ちょっと使いづらい
候補をリストで表示して、TABキーでフォーカスを移動できます。
どんなファイルが候補にあるのかを見れるので、パッ見わかりやすい。
vimgrepを覚えた
vim内でgrepをできるようになる。いちいちvimを抜けなくていいので、便利。
:vim[grep] {pattern} {file} | cw
下記を見てもらうとだいたいのノリがわかるかと思います。
コマンド | 検索対象 |
---|---|
:vim hogehoge ** | カレントディレクトリから検索 |
:vim hogehoge **/*.js | カレントディレクトリの下のjsファイルから検索 |
最後のcw
をつけるとquickfix-windowを表示して検索にヒットした対象の一覧を表示してくれるので、基本的にはつけたほうが良いです。
いろいろ興味がでてきて小技も覚えはじめました。
囲まれたところを選択
vi"
でダブルクォーテーションで囲まれた箇所を選択vi]
で[]で囲まれた箇所を選択vi)
で()で囲まれた箇所を選択
i
をa
にすると囲んでいる文字も含めて選択します。
選択した後にy
でヤンクなり、x
で削除なりすればよいかと
元いた場所に戻る
ファイルをいろいろ開いた結果、さっきいたあそこに戻りたいっていうときに活躍。
キー | 内容 |
---|---|
m[A-Z] | カーソル位置をマークする |
`[A-Z] | マークした位置に戻る |
同じファイル内であれば、u
→ctr-r
でも戻ります。アンドゥ、リドゥしてるだけ
スペースを複数行にいれる
ctr-v
で矩形(くけい)選択を開始して、スペースを入れたいとこまで選択。shift-i
でインサートモードに入る- スペースを入力
- インサートモードを抜ける
するとあら不思議、スペースが複数行に入りました。
コマンドモードで現在開いているパス表示
コマンドモードで%:h
と打つと現在のパスが表示されます。
app/controller/home_controller.rbを開いていて、
:e %:h
と打つとapp/controller/までを自動補完してくれます。
%:hは打ちにくいので%%
でキーバインドさせときす。
cnoremap <expr> %% getcmdtype() == ':' ? expand('%:h') . '/' : '%%'
おまけ(プラグイン作ったお)
今回はじめてプラグイン作りました。
https://github.com/ykyk1218/vim-simple-search
:SimpleSearch hogehoge.rb
とするとファイル名のみで検索して、検索結果の一覧を表示します。
unite.vimでいいじゃんッて感じなのですが、あれだとファイル名だけで検索っていうやり方がよくわからず。(できるのかも)
完全に自分用につくったので、突っ込みどころはいっぱいありますがせっかくの機会なので公開しちゃいます。
neobundle使っていれば下記でインストール。
:NeobundleInstall ykyk1218/vim-simple-search
ちょっとだけ作り方
まず
~/.vim/plugin
~/.vim/autoload
この2つのフォルダを作成します。
~/.vim/plugin/vim_simple_search.vim
if exists('g:loaded_vim_simple_search')
finish
endif
let g:loaded_vim_simple_search = 1
let s:save_cpo = &cpo
set cpo&vim
command! -nargs=1 SimpleSearch call vim_simple_search#search("<args>")
let &cpo = s:save_cpo
unlet s:save_cpo
よくわからない記述がいろいろありますが、意味あるのは
command! -nargs=1 SimpleSearch call vim_simple_search#search("<args>")
これだけですね。
ようは:SimpleSearch
コマンドを追加して、呼ばれたときにvim_simple_search関数を呼び出します。
if exists('g:loaded_hogehoge')
finish
endif
let g:loaded_hogehoge = 1
let s:save_cpo = &cpo
set cpo&vim
<なんかの処理>
let &cpo = s:save_cpo
unlet s:save_cpo
ここはおまじないみたいなものです。あまり意味をわかってない・・・
~/.vim/autoload/vim_simple_search.vim
let s:save_cpo = &cpo
set cpo&vim
function! vim_simple_search#search(word)
let s:filelist = glob("./**/". a:word . "*")
let s:splitted = split(s:filelist, "\n")
let s:result = []
new
for s:file in s:splitted
call append('.', s:file . "\r")
endfor
nnoremap <silent> <buffer> <C-i> <C-w>f<C-w>p:q!<CR><C-w>w
endfunction
let &cpo = s:save_cpo
unlet s:save_cpo
実際のメイン処理はこちら。
下記処理で、引数で渡された文字列でファイル名の検索かけてます。
let s:filelist = glob("./**/". a:word . "*")
for文の前にこっそり書いてあるnew
で新しくウィンドウを立ち上げ、for文内の
call append('.', s:file . "\r")
ヒットしたファイルを表示させていきます。
最後の
nnoremap <silent> <buffer> <C-i> <C-w>f<C-w>p:q!<CR><C-w>w
ここでctr-i
を押した時に新しくウィンドウを立ち上げ、今のウィンドウを閉じる処理をしてます。ctr-i
にキーマッピングしてるんですが、<buffer>
があるため、このキーマッピングが効くのはこのプラグインで立ち上げたウィンドウのみになっています。
でfunctionの上下にある
let s:save_cpo = &cpo
set cpo&vim
function hogehoge
<なんかの処理>
endfunction
let &cpo = s:save_cpo
unlet s:save_cpo
はおまじないです。
最後に
学習コスト高いけどVim楽しいよ
すばらしい参考サイト達
vimgrepとQuickfix知らないVimmerはちょっとこっち来い
http://qiita.com/yuku_t/items/0c1aff03949cb1b8fe6b
脱初心者を目指すVimmerにオススメしたいVimプラグインや.vimrcの設定
http://qiita.com/jnchito/items/5141b3b01bced9f7f48f
脱初心者を目指すなら知っておきたい便利なVimコマンド25選 (Vimmerレベル診断付き)
http://qiita.com/jnchito/items/57ffda5712636a9a1e62
Vim幼稚園からVim小学校へ
http://qiita.com/hachi8833/items/7beeee825c11f7437f54