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

vim再入門

tech

僕はかれこれ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に移動
:n10 10行目に移動
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 file fileを読み込んでカーソル行に追加
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/def 10行〜最後の行でxyzが含まれる行
:g/xyz/,+10s/abc/def/ xyzが含まれる行〜下10行
削除
:10,20d 10行目〜20行目を削除
:g/abc/d abcが含まれる行を削除
:g/abc/,+10d abcが含まれる行〜下10行を削除

複数ファイルの編集

:vi file fileをviで開く
:ls viで開いているファイル一覧を表示
:b1 1番のファイルへ移動
: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

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

その他

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

AutoComplPop

キーワード補完候補を自動的に表示してくれるプラグイン
言語によってはオムニ補完も表示してくれる
AutoComplPop - Automatically opens popup menu for completions : vim online
ns9tks / vim-autocomplpop / source / doc / acp.jax — 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を完全網羅したら本とかないのかな??