青の部隊 505小隊 ULZ

Vim攻略

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集
中途半端なVim使いが、Vimの使い方を中途半端に説明します。
短時間でまとめるのってむずいね。継続的に記載を見直していきます。

基本概念と基本操作に書いてある機能だけで、一般的なテキストエディタと同じように使えると思う。

ちなみに会社のメインはLinux Vim6.3(CUI)、家ではWindows gVim7.1(GUI)を使ってます。


最初にやること

大抵、hjklや:wqやi,aが挙げられるものなのですが、最近もっとも重要なのはこれじゃないかと思うようになりました。

:set nocp
:set bs=2

初めてVimを触る人は、必ず何も考えず、上記を入力すべきです。
これをやることで、一般エディタ的な動きに近づきます。

ちなみに、$HOME/.vimrcというテキストファイルに書いておけば、Vim起動のたびに打つ必要はなくなります。
最近のディストリビューションなら、最初からはいってるかも。

基本概念

Insertモード 一般的なエディタに近いモード。キー入力で文字が入力される。
Normalモード 文書の一部を切り取ったり、単語を検索したり、文字の入力以外の編集作業をするモード。一般的なエディタでいうと、Ctrlを押しっぱなしにしている状態に近い。たとえばuを押すとアンドゥになるし、x押すと一文字消える。
Exモード コマンドラインでVimコマンドを実行するモード。一般的なエディタでいうと、検索ダイアログみたいに何かのダイアログが開いてる状態に近い。一番下の行がコマンド入力行になる。
Visualモード 文書の一部を文字単位/行単位選択およびボックス選択するモード。

バッファ 編集対象となるテキストデータを記憶しているメモリのこと。
ウィンドウ バッファの内容を表示する、画面上の領域のこと。

基本操作

とりあえず、移動、文字入力、選択とカットコピーペースト、検索置換、保存と終了、アンドゥとリドゥは以下のとおり。
他に、これができなきゃ使えないって機能ある?

移動
h,j,k,l それぞれ←↓↑→に移動。

文字の入力
i Insertモードに入る。カーソル直前に文字を入力できるようになる。
a Insertモードに入る。カーソル直後に文字を入力できるようになる。
ESC Normalモードに戻る。

保存と終了
:q 終了
:q! 保存せず終了
:wq 保存して終了
:w ファイル名 ファイル名で保存

カット、コピー、ペースト
①範囲を選択(ビジュアルモードに移行する)
v 文字単位選択
V 行単位選択
C-V ボックス選択

②カットまたはコピー
y 選択範囲をコピー
d 選択範囲をカット

③貼り付け
p カーソル直後に貼り付け
P カーソル直前に貼り付け

検索
①Normalモードで/を入力する。(Exモードに移行)
②検索文字を入力してEnter。最初にヒットした語に飛び、Normalモードになる。
n 次を検索
N 前を検索

置換
置換はちょっと覚えにくいが、とりあえず丸暗記で。
:g/検索語/s//置換後の語/gc
単語を見つけるたびに置換してよいか聞いてくる。
無条件で全置換する場合は、コマンド末尾のcを消せばいい。

アンドゥとリドゥ
u 一手戻す
Ctrl-R 一手進める

すぐ覚えられる便利機能


* カーソル位置の単語を検索
% カーソル位置の括弧に対応する括弧を探す
. 直前の変更をもう一度繰り返す
yy カーソル位置の一行をコピー
dd カーソル位置の一行をカット
x 一文字削除(一般で言うデリート)
r カーソル位置の文字を上書きする。例えばrhで、カーソル位置の文字をhにかえる

人によってはないと困るかもしれない機能

^ 現在行の先頭にカーソル移動(普通のWindowsエディタだとHome)
$ 現在行の末尾にカーソル移動(普通のWindowsエディタだとEnd)
R 上書きモードになる(普通のWindowsエディタでInsertを押した状態になる)
gg ファイルの先頭にカーソル移動(普通のWindowsエディタだとCtrl-Home)
G ファイルの末尾にカーソル移動(普通のエディタだとCtrl-End)
行番号G 上から行番号目の行に移動(例えば 100G で100行目に移動)
:set number 行番号を表示(非表示にする場合は :set nonumber)

IDE的な機能

>> インデントを下げる
<< インデントを上げる
(インサートモードで)Ctrl-n オートコンプリート(何が補完されるかは設定による)
(インサートモードで)Ctrl-x Ctrl-f パス名をオートコンプリート(bashのTab的機能)
(ビジュアルモードで)zf 選択範囲をたたむ(一行にまとめる)
mアルファベット 現在行を記憶する
'アルファベット mアルファベットで記憶した行に飛ぶ
Ctrl-] カーソル位置の単語を定義している箇所に飛ぶ(ctagsコマンドで予めタグファイルを作っておく)
Ctrl-t タグジャンプしたあと、元の場所に戻る
[[ 現在の関数の先頭に移動
]] 次の関数の先頭に移動
][ 現在の関数の末尾に移動



単語単位で選択する


僕、いままで単語をコピーするときは、「単語の先頭にカーソル移動して」yeとしてました。
しかし実は、Text Object selectionなる技があることが判明。
わざわざ先頭に移動しなくても、単語上のどこかにカーソルがあれば、yiwでその単語をコピーできる。
他にもいろいろあるので、ヘルプでText Object selectionの項をたらたら読むといい。
v+セレクションコマンドで、どの範囲が選択されるか一発でわかるんで、いろいろ試してみましょう。

レジスタの内容をexモードのコマンドラインに貼り付ける


レジスタってのはViが持つクリップボードのようなもの。yしたりdしたりするとその内容はレジスタに入ります。

:でexモードに入ったら、

<C-R>+レジスタ名

とすることでレジスタの内容を貼り付けることができます。
レジスタ名を指定せずにyやd等を実行した場合、レジスタ名は " になっています。また、直前に検索したキーワードはレジスタ/に入っています。

外部コマンドを使って文章の一部を整形する


ビジュアルモードで選択した部分だけを外部コマンドに入力して整形することができます。
ビジュアルモードで文書の一部を選択したら、:を押してください。コマンドラインが下記のようになります。

:'<,'>

これに続けて、!コマンド名 と入力します。これで、ビジュアルモードで選択した部分だけを指定したコマンドの標準入力とし、その部分をコマンドの出力でおきかえることができます。

たとえば、テキストの一部にsortコマンドを適用する例を下に示します。

sample data

0030040 hogehoge < ビジュアルモードで選択
0030020 piyopiyo < ビジュアルモードで選択
0003010 hogera < ビジュアルモードで選択

end of sample data
~
-VISUAL-
:'<,'>!sort

これで、データ3行だけをソートできます。ちなみに、テキストの一部をコマンドに渡したいだけで更新したくないときは、:'<,'>w !sortとします。3行がsortに渡され、その出力結果はただ表示されます。

チートシートも

Visual StdioのエディタでもVIのキー配置が使いたい、という人がまとめたチートシート。

タグ:

+ タグ編集
  • タグ:
ウィキ募集バナー