Hatena::ブログ(Diary)

maru source RSSフィード Twitter

2010-10-30

vim再入門

僕はかれこれ5年くらいvimを使ってるんだけど、それにしてはvimを知らなさすぎると思って、勉強しなおしてみました。

参考書籍は「オライリー 入門vi」なのでvimじゃなくてviの基礎から勉強。


で、今まで使っていたコマンドと、新たに覚えた使えそうなコマンドをメモしておくことに。

ついでにRubyで補完をする方法、AutoComplPopの導入、作り直した.vimrcをさらしてみます。


コマンドモードから入力モードへ切り替える

iカーソル位置から文字を書き始める
aカーソル位置の後から文字を書き始める
oカーソル位置の下の行から文字を書き始める
Oカーソル位置の上の行から文字を書き始める

入力モードからコマンドモードへ切り替える

EscどちらのモードかわからなくなったらとにかくEsc

保存

:w保存
:q終了
:wq保存して、終了
:q!保存せずに終了

移動

1文字移動
h左へ移動(10h 10文字左へ移動)
j下へ移動
k上へ移動
l右へ移動

行内移動
0行頭へ移動
^行頭の空白文字の後へ移動
$行末へ移動

画面内移動
H画面内の最初の行へ移動
M画面内の中央の行へ移動
L画面内の最後の行へ移動

スクロール移動
Ctrl + f下へ1ページスクロール
Ctrl + b上へ1ページスクロール
z Enterカーソル行が画面の最初の行となるようにスクロール

検索移動
/abcカーソル位置以下の文字abcへ移動
?abcカーソル位置以上の文字abcへ移動
n前回の移動と同方向へ検索して移動
N 前回の移動と逆方向へ検索して移動

その他の移動
%括弧にカーソルを合わせて%を押すと、対応する括弧に移動する
maカーソル位置にマークaをつける
`aマークaに移動
:n1010行目に移動
ggファイルの最初の行へ移動
Gファイルの最後の行へ移動

編集

コピー
yyカーソル行をコピー(10yy 10行コピー)
y0カーソル位置から行頭までをコピー
y^カーソル位置から行頭(行頭の空白無視)までをコピー
y$カーソル位置から行末までをコピー

ペースト
pカーソル位置の後にペースト
Pカーソル位置の前にペースト

削除
ddカーソル行をコピーして削除(10dd 10行削除)
d0カーソル位置から行頭までコピーして削除
d^カーソル位置から行頭(行頭の空白無視)までをコピーして削除
d$カーソル位置から行末までコピーして削除

名前付きコピー、削除、ペースト
"ayyバッファaにコピー
"addバッファaにコピーして行を削除
"apバッファaを貼付け
"Ayyバッファaに追加でコピー
"Addバッファaに追加でコピーして行を削除

文字編集
xカーソル位置の1文字をコピーして削除(10x 10文字削除)
raカーソル位置の1文字をaに置き換える
Rabcカーソル位置から3文字をabcに置き換える
~カーソル位置の1文字を大文字小文字を反転させる(10~ 10文字反転させる)

取り消し、繰り返し
uアンドゥー
ctrl+rリドゥー
.繰り返し

その他の編集
:r filefileを読み込んでカーソル行に追加
Jカーソル位置の行末に下の行を連結する (10J 10行連結)
>>カーソル行をインデント (10>> 10行インデント)
<<カーソル行をアンインデント (10<< 10行アンインデント)

置換

置換
:s/abc/def/カーソル行の最初のabcをdefに置換
:s/abc/def/gカーソル行の全てのabcをdefに置換
:s/abc/def/c確認しながら置換

行指数定
:%s/abc/def/全ての行
:10,$s/abc/def/10行目〜最後の行
:0,10s/abc/def/最初の行〜10行目
:.,+10s/abc/def/カーソル行〜下10行
:,-10s/abc/def/カーソル行〜上10行

行指定
:g/xyz/s/abc/def/xyzが含まれる行
:10,$g/xyz/s/abc/def10行〜最後の行でxyzが含まれる行
:g/xyz/,+10s/abc/def/xyzが含まれる行〜下10行

削除
:10,20d10行目〜20行目を削除
:g/abc/dabcが含まれる行を削除
:g/abc/,+10dabcが含まれる行〜下10行を削除

複数ファイルの編集

:vi filefileをviで開く
:lsviで開いているファイル一覧を表示
:b11番のファイルへ移動
:bn次のファイルへ移動
:bp前のファイルへ移動
ctrl + ^前に開いていたファイルへ移動

画面分割

:sp水平方向へ画面を分割
:vs垂直方向へ画面を分割
:10sp水平方向へ10行の画面を分割
:10vs垂直方向へ10桁の画面を分割
ctrl+w h左の画面へ移動
ctrl+w j下の画面へ移動
ctrl+w k上の画面へ移動
ctrl+w l右の画面へ移動

折りたたみ

:set foldmethod=marker{{{ }}}で囲まれた行を折りたたみ指定
zm全て折りたたみ
zr全ての折りたたみを開く
zcカーソル行を折り畳み
zoカーソル行の折りたたみを開く

shell

:!lslsを実行
:r !datedateを実行して、結果をカーソル行に追加
%!sort全行をソートしてその結果で置き換える

その他

:set number行数表示
:nohl検索結果のハイライト表示を終了
vヴィジュアルモードへ切り替え

AutoComplPop

キーワード補完候補を自動的に表示してくれるプラグイン

言語によってはオムニ補完も表示してくれる

AutoComplPop - Automatically opens popup menu for completions : vim online

ns9tks / vim-autocomplpop / source — Bitbucket


Rubyの補完

デフォルトのvimではRubyがサポートがされていない(vim --version | grep rubyで確認できる)

なので、vim-railsをインストールする

sudo apt-get install vim-rails

.vimrc

set nocompatible

"color
syntax on
colorscheme ron
"ポップアップメニューの色変更
"色参考 http://cl.pocari.org/2007-06-30-2.html
hi Pmenu ctermfg=0 ctermbg=7
hi PmenuSel ctermbg=1

"search
set hlsearch
"検索結果の色変更
"色参考 http://cl.pocari.org/2007-06-30-2.html
hi Search ctermfg=0 ctermbg=1

"split
cmap hs sp
"簡単に移動できるように変更
noremap <C-h> <C-w>h
noremap <C-j> <C-w>j
noremap <C-k> <C-w>k
noremap <C-l> <C-w>l

"backup
set backup
set backupdir=~/.vimbackup

"encoding
set encoding=utf8
set fileencodings=utf8

"indent
set tabstop=2 shiftwidth=2 softtabstop=0
set expandtab
set noautoindent
set nosmartindent

"fold
set foldmethod=marker

"filetype
filetype on
filetype plugin on
filetype indent off

"自動でコメントが開始されないように
autocmd FileType * setlocal formatoptions-=ro

":liを実行するとシンタックスチェックを行う
"もっと良いやり方を探すべし
autocmd BufRead,BufNewFile *.rb cmap li !ruby -c %
autocmd BufRead,BufNewFile *.php cmap li !php -l %
autocmd BufRead,BufNewFile *.pl cmap li !perl -l %
autocmd BufRead,BufNewFile *.sh cmap li !bash -n %

"autocomplpop
"参考http://bitbucket.org/ns9tks/vim-autocomplpop/src/tip/doc/acp.jax
let g:acp_enableAtStartup = 0
"入力モード中にC-oでacp有効、C-uでacp無効
inoremap <C-o> <Esc>:AcpEnable<CR>a
inoremap <C-u> <Esc>:AcpDisable<CR>a
"コマンドモード中にC-oでacp有効、C-uでacp無効
noremap <C-o> <Esc>:AcpEnable<CR>
noremap <C-u> <Esc>:AcpDisable<CR>
"変換候補をEnterで選んでも改行されないように
inoremap <expr> <CR> pumvisible() ? "\<C-Y>" : "\<CR>"
"変換候補をC-j,C-kで移動できるように
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<C-j>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<C-k>"


.vimrcはまだまだ未完成。というかvimの機能が多すぎてわからないことだらけ。vimを完全網羅したら本とかないのかな??