トップ 履歴 一覧 ソース 検索 ヘルプ ログイン

Vimのメモ

Vimの使い方をメモしていきます。

ページの目次をサイドバーへ移してみました。

ヘルプ

 日本語ヘルプ

でドキュメントの翻訳をしてくれている。成果物は

で読める。

Vim上で日本語ヘルプを参照できるようにする方法は次のページで説明されている。

ヘルプを見たいときは

:help

ね。

 ヘルプの検索

:helpgrep キーワード

でヘルプ内を検索できる。

参考:Vim documentation: helphelp

文字コード/改行コード

 開いているファイルの文字コード/改行コードの確認

改行コードの確認は

:set fileformat?

文字コードの確認は

:set fileencoding?

fileencodingに何もセットされていない場合は

:set encoding?

 文字コード/改行コードを変更して保存

:set fileencoding=utf-8
:set fileformat=dos

などとしてから

:w

fileformatに指定できるのは、dos, mac, unix。

fileencodingに指定できる値はeuc-jpとかutf-8とか。詳しくは :help encoding-values を参照。

 複数ファイルの文字コード/改行コードを一度に変更する

:bufdoを使って次のようにすると開いている(バッファリスト内の)全てのファイルの文字コード・改行コードを変換できる。

:bufdo set fileencoding=cp932 | set fileformat=dos | update

上を実行するには変換したいファイルを開いておく必要がある。複数のファイルを一度に開くために、:argaddを使って

:argadd **/*.java

などとすると便利かもしれない。

 文字コード/改行コードを指定してファイルを開きなおす(文字化けしている場合など)

:e ++enc=euc-jp
:e ++ff=unix

などとする。

参考:Vim documentation: editing

Tab関連

 Tabの幅

:set tabstop=8

とすると、1つのTabが8文字の幅で表示される。

 Tabキー押下時のカーソル移動幅

:set softtabstop=4

とすると、Tabキー押下時にカーソルは4文字分移動するようになる。そのときに挿入される文字がTabかスペースかは他の設定により変わってくる。

 インデント幅

:set shiftwidth=4

とすると、インデント幅が4に設定される。これは、Vimの自動インデント機能に影響する。インデント時に挿入される文字がTabかスペースかは他の設定により変わってくる。

 Tabキー押下でスペース挿入

:set expandtab

とすると、Tabキー押下時に必ずスペースが挿入されるようになる。このときに挿入されるスペースの量は、softtabstopの値で決まるはず。

この設定でTabを入力したい場合は、Ctrl-Vの後にTabキーを押下すればよい。

 Tab設定をファイル全体に反映する

:retab

参考:Vim documentation: change

 Tabを可視化する

:set list

とするとTabと改行が表示されるようになる。表示文字は

:set listchars=tab:>-

のようにしてカスタマイズできる。上の例だとTabが「>-------」と表示されるようになる。スペースを使いたい場合は\でエスケープする必要がある。

また、

:highlight SpecialKey ctermfg=1     " ターミナル版での文字色指定
:highlight SpecialKey ctermbg=7     " ターミナル版での背景色指定
:highlight SpecialKey guifg=gray    " GUI版での文字色指定
:highlight SpecialKey guibg=#012345 " GUI版での背景色指定

のようにして表示色をカスタマイズすることができる。

参考:options

閲覧

 単語単位でのカーソル移動

  • wで次の単語の先頭に移動。
  • eで次の単語の最後に移動。
  • bで前の単語の先頭に移動。
  • geで前の単語の最後に移動。
  • Wで次の空白の直後の文字に移動。
  • Eで次の空白の直前の文字に移動。
  • Bで前の空白の直後の文字に移動。
  • gEで前の空白の直前の文字に移動。

 どんどん戻る/進む

Ctrl-Oで以前のカーソル位置にどんどん戻れる(ブラウザの戻るボタンみたいな感じ)。Ctrl-Iはその反対。

 変更箇所に戻る/進む

「g;」で変更箇所をどんどん戻れる。「g,」はその反対。

Ctrl-O と違いファイルをまたげないみたい。あまり便利じゃないかも。

 行内での検索

  • 「f文字」で行内の次の「文字」へ移動。
  • 「t文字」で行内の次の「文字」の1つ前へ移動。
  • 「F文字」で行内の前の「文字」へ移動。
  • 「T文字」で行内の前の「文字」の1つ後ろへ移動。
  • ;でf,t,F,Tを繰り返す。
  • ,でf,t,F,Tを逆向きに繰り返す。

 検索

単語の検索

  • *でカーソル位置の単語の次の位置へ移動
  • g*でカーソル位置の単語が含まれる次の位置へ移動
  • #でカーソル位置の単語の前方の位置へ移動
  • g#でカーソル位置の単語が含まれる前方の位置へ移動

検索語のハイライトを消す

:nohl

インクリメンタルに検索する

:set incsearch

検索時に大文字小文字を区別しない

:set ignorecase

これに加えて

:set smartcase

も設定すると、検索パターンに大文字が含まれる場合だけは大文字小文字が区別されるようになる。

ignorecaseを有効にすると補完時にも大文字小文字を区別しなくなって不便だった。ignorecaseをオフにした状態で大文字小文字を区別するには、検索パターンのどこかに「\c」を付ければよい。

/kubetusinai\c

参考:Vim documentation: pattern

 画面のスクロール

  • Ctrl-Eで下スクロール、Ctrl-Yで上スクロール。

nowrapが設定されている場合は、次のスクロールが可能。

  • zhで左へスクロール、zlで右へスクロール。
  • zHで左へ半分スクロール、zLで右へ半分スクロール

 カーソル行を真ん中に

zz

 常にカーソル行を真ん中に

:set scrolloff=999

などと、大きな値を指定する。scrolloffはカーソル行の上下に表示する行数みたい。

参考:Vim documentation: options

 指定行へ移動

:行番号

を使っていたけど、

行番号gg

の方がいいかも。

 指定バイトへ移動

稀に、ファイル先頭からのバイト数の位置に移動したいときがある。gotoコマンドを使うとそれができる。

バイト数go

または

:go バイト数

 関数の宣言にジャンプ

  • ウィンドウ分割なし ---> [ Ctrl-I
  • ウィンドウ分割あり ---> Ctrl-W i

インクルードしているファイルを含めた最初からカーソル下の文字列を検索して、見つかった場所へジャンプしてくれる。これを使えば関数の宣言にジャンプできる。元の場所に戻るには Ctrl-O とか。

インクルードファイルを見つけられるようにするためには、pathオプションを適切に設定しておく必要がある。

参考:Vim documentation: tagsrch, Vim documentation: options

 タグジャンプ

ヘルプ内で使用できる。ctagsなどを使えばソースコード内でもジャンプ可能に。

  • Ctrl-] でカーソル位置のキーワードのタグへジャンプ
  • Ctrl-W ] だと、ウィンドウを分割してジャンプ
  • Ctrl-T で元の場所へ戻る
  • g Ctrl-] だと、カーソル位置のキーワードにマッチするタグが複数ある場合に選択を促されるようになる
  • :tselect で現在のタグの一覧を表示
  • :tn で次のタグへジャンプ
  • :tp で前のタグへジャンプ

ctagsを使う場合、tagsオプションにセミコロンを含めると上位のディレクトリにあるtagsファイルも参照してくれるようになる(:help file-searching)。例えば、

:set tags=./tags,tags;/home/ore,TAGS

と設定すると、「tags」というファイルだけは/home/oreまで上に辿って探してくれる。

参考:Vim documentation: tagsrch, Vim documentation: windows

 ウィンドウ関連

  • Ctrl-W s で上下に分割
  • Ctrl-W v で左右に分割
  • Ctrl-W o でカレントウィンドウ以外を閉じる(oはOnlyの意味みたい)
  • Ctrl-W r でウィンドウが「回転」する。例えば、2分割の場合はウィンドウの内容が入れ替わる。

参考:Vim documentation: windows

複数ウィンドウの同期スクロール

:set scrollbind

を実行したウィンドウ達は、スクロールが同期する。ただし、デフォルトでは縦スクロールだけが同期する。横スクロールも同期させるには

:set scrollopt=ver,hor,jump

などとし、scrolloptオプションにhorを含める。

参考:Vim documentation: scroll

 長い行の折り返し

:set wrap

で折り返しが有効になり、

:set nowrap

で折り返さなくなる。GVimでは、

:set guioptions+=b

により横スクロールバーが表示されるようになる。

参考:Vim documentation: usr_25

 長い行の見た目上の行末へ移動

長い行が折り返して表示されているとき、「g$」で折り返し地点に移動できる。

 折りたたみ(フォールディング)

  • ビジュアルモードで選択した後「zf」で、選択した部分を折りたためる。
  • 「zc」で折りたたみを閉じる。
  • 「zo」で折りたたみを開く。
  • 「za」で折りたたみを開いたり閉じたりする。
  • 「zi」で折りたたみを無効にしたり有効(全ての折りたたみを閉じる)にしたりする。

ほとんど使わないのでよく知らない。

参考:Vim documentation: fold

 強調表示

highlightとmatchを使って特定パターンを強調表示することができる。

matchでは1つのパターンしか有効にならないようだ。複数のパターンを定義する場合は、2match、3match を使用するみたい。2match、3matchはプラグイン用みたい。2matchで設定しても何かのタイミングで動作しなくなってしまうことがある。複数のパターンを定義することはできないのかな?

おおお、matchadd()を使うと複数のパターンを定義できそう。以下の例ではmatchadd()を使う。

全角スペースの強調

:highlight zenkakuda ctermbg=7
:call matchadd("zenkakuda", '\%u3000')

参考:全角スペースを視覚化

81文字目以降を強調

:highlight nagasugi ctermbg=yellow
:call matchadd("nagasugi", '.\%>81v')

参考:Vim documentation: pattern

 列の強調表示

:set colorcolumn=80

とすると80列目が強調表示される。

参考:Hack #217: 横幅が長いコードをハイライトする, options - vimdoc-ja

 ディレクトリを見る(Explorer)

:e .

などとしてディレクトリを開くと、ディレクトリ内のファイル・サブディレクトリ一覧が表示され、Vimをファイラとして使えるようになる。

.vimrcなどで

let g:netrw_liststyle=3

と設定しておくと、ディレクトリ閲覧時の表示がツリー形式になって便利。

参考:Vim documentation: pi_netrw

 バッファ間の差分を表示

vimdiffコマンドを使うと2つのファイルの差分を表示できるが、Vimで既に開いている複数のバッファ間の差分をvimdiffと同じように見るには、

  • ウィンドウを分割し比較したい複数のバッファを同時に表示し、それぞれのウィンドウで :diffthis を実行する。

とすればよい。

差分表示モードをオフにするには :diffoff! を実行する。

編集(挿入モード以外)

 続きを書く

gi で、挿入モードを抜けたときのカーソル位置に戻って挿入モードになる。

参考:Vim documentation: insert

 文字の削除

<DEL>相当は x、<BS>相当は X。X使ってなかった…

 インデント

「>>」で右インデント、「<<」で左インデント。shiftwidth分インデントする。

 大文字小文字変換

  • 「~」でカーソル下の文字の大文字小文字変換。
  • 「g~~」でカーソル行全体の大文字小文字変換。
  • 「guu」でカーソル行全体を小文字に変換。
  • 「gUU」でカーソル行全体を大文字に変換。
  • 「g~w」「guw」「gUw」で単語の切れ目まで変換、など。

参考:Vim documentation: change

 数値の増減

Ctrl-Aで数値が増え、Ctrl-Xで数値が減る。

 複数Vim間でのコピー&ペースト

  1. コピー元のVimでヤンクする
  2. コピー元のVimで :wv
  3. コピー先のVimで :rv!
  4. コピー先のVimでペースト

とすればVimをまたがってコピー&ペーストができる。

参考:複数のVim間でレジスタを共有する, Vim documentation: starting

 空行の削除

:global/^$/delete

でファイル全体の空行を削除できる。短くして

:g/^$/d

でもOK。globalコマンドはdelete以外にも色々なコマンドと組み合わせが可能。

参考:Vim documentation: repeat

 マッチしない行の削除

:v/pattern/d

でpatternを含まない行を削除できる。v は global! の省略形。

参考:Vim documentation: repeat

 操作の記録と繰り返し

単純な操作は「.」で繰り返せる。

複雑な操作は、

qa (記録の開始)
複雑な操作
q  (記録の終了)

で記録し、

@a

で繰り返せる。「a」の所は他のアルファベットも使用することができ、これにより複数の操作を記録できる。

@@

だと、直前に実行した繰り返しを繰り返せる。

参考:Vim documentation: repeat

 BOMの確認と削除・追加

:set bomb?

でBOMの有無を確認できる。

:set nobomb

でBOMを削除できる。

:set bomb

でBOMを追加できる。

参考:Vim documentation: options

挿入モードでの編集

 文字の削除

  • CTRL-H で <BS> 相当の削除。
  • CTRL-W で 直前の単語を削除。

削除時の動作はbsオプションで変更できる。

参考:Vim documentation: options

 インデント

挿入モードのときは「CTRL-D」で左、「CTRL-T」で右にインデント。

 ペースト

挿入モードでは、「CTRL-R "」で無名レジスタの内容を、「CTRL-R 0」で最後にコピーした文字列を、「CTRL-R /」で最後に検索した文字列をペーストできる。

また、CTRL-Oで一時的に挿入モードを抜けることができるので、「CTRL-O p」などとしてもペーストできる。

参考:Vim documentation: insert, Vim documentation: insert

 補完

挿入モードで、Ctrl-PとCtrl-Nにより補完候補が表示される。Ctrl-X系の補完もあるが分かってない。

Vim7の補完はより賢くなっているようだが分かってない。

プラグインのautocomplpop.vimを使うと自動的によしなに補完してくれるようになる。 autocomplpopは更新されなくなって久しい。今ならneocomplcacheが人気か。

 上下の行をコピー

挿入モードで、CTRL-Eにより下の行の文字をコピー、CTRL-Yで上の行の文字をコピー。

選択(ビジュアルモード)

 text-objectsの選択

「vi*」系と「va*」系を覚えたい。*の部分を色々変えることでカーソル位置を含む色々な部分を選択できる。「va*」の方が「vi*」よりもちょっと大きい部分を選択する。

  • viw で単語を選択
  • vis で文を選択
  • vip で段落を選択。段落とは空行から空行までと思っていいのかな。
  • vit でタグ内を選択。タグとはHTMLタグやXMLタグのこと。
  • vi', vi", vi`, vi(, vi{, vi{, vi< 引用符内や括弧内を選択。

 選択中にカーソルを逆の端点へ

選択中、「o」でカーソルを逆の端点へ移動できる。

矩形選択時は、「O」により「o」では移動できない端点へ移動できる。

参考:Vim documentation: visual

 再選択

「gv」で、直前に選択した領域を再度選択することができる。

コマンドラインモード

 ペースト

「CTRL-R "」で無名レジスタの内容をペーストできる。

「CTRL-R CTRL-W」でカーソル下の単語をペーストできる。

「CTRL-R %」で開いているファイルのパスをペーストできる。

参考:Vim documentation: cmdline

 コマンド履歴の検索・編集

コマンドラインモードで「CTRL-F」を入力するとコマンドラインウィンドウが開き、そこに過去に実行したコマンドの履歴が表示される。このウィンドウ内で文字列を検索し、必要なら編集し、Enterキーを押せばそのコマンドが実行される。

コマンドラインウィンドウは、ノーマルモードで「q:」「q/」「q?」を入力することでも開ける。

参考:Vim documentation: cmdline

 補完

  • Tabキーで補完ができる。
  • Ctrl-D で補完候補の一覧が表示される。
  • 補完の挙動はwildmodeオプションでカスタマイズできる。今は次の設定がいいと思っている。
:set wildmode=list:longest

 コマンドの繰り返し

「@:」で最後に実行したコマンドを実行できる。

参考:Vim documentation: repeat

 外部プログラムの実行

:!command

で任意の外部プログラムcommandを実行できる。

外部プログラムの出力をVimのバッファに取り込みたいことがある。そのようなときは、

:r!command

とするとカーソル位置にcommandの出力が挿入される。

:enew

で新規の無名バッファを開けるので、そこに外部プログラムの出力を取り込むことがよくある。

参考:Vim documentation: various, Vim documentation: insert, Vim documentation: editing

ステータス行

:set laststatus=2

とすると、ステータス行が常に表示されるようになる。値が1だと複数ウィンドウ時のみ表示され、0だとステータス行は表示されなくなる。

ステータス行に表示する内容は、

:set statusline=%<%f\ %m%r%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l/%L,%v

のようにして指定する。上記の意味はstatuslineのヘルプを参照すれば大体分かる。上の例だと、ファイル名、変更されたかどうか、読取専用かどうか、文字コード、改行コード、カレント行番号、全体行番号、カラム番号が表示される。

make

:make

でmakeを実行できる。エラーが発生すると自動的にファイルが開かれエラー発生箇所にカーソルが移動する。

:cc

でカレントのエラーの内容を表示。

:cn

で次のエラー箇所へ移動。

:copen

でエラーウィンドウを表示。

:cclose

でエラーウィンドウを閉じる。

makeを複数回実行したときなどは、

:colder
:cnewer

により各回のエラーウィンドウを切り替えられる。

参考:Vim documentation: quickfix

grep

:vimgrep パターン 対象ファイル

でgrep相当のことができる。検索結果の参照方法はmakeの場合と同じ。

対象ファイルに「**」を使うことで再帰的な検索も可能。

:vimgrep TODO **/*.cpp

みたいに使える。詳しくは :help ** を見よ。

また、

:grep オプション

とすればPCにインストールされているgrepを使える。オプションにはgrepの全オプションを指定できるはず。

GVim

 フォントの指定

:set guifont=MS_Gothic:h10:cSHIFTJIS

のように、guifontオプションで指定できる。Windows版では、

:set guifont=*

によりフォント選択ダイアログでの指定が可能。

参考:Vim documentation: options

オプション関連

 オプションなどの設定箇所を表示

verboseコマンドを使うとオプションやマップの設定箇所が表示される。例えば、

:verbose set shiftwidth?

を実行すると

 shiftwidth=4
       Last set from ~/.vimrc

などと表示される。

参考:vimのオプションが、どのファイルで設定されているかを調べる - 週記くらい@上海Vim documentation: various

プラグイン

 自動インストール/自動更新

(下に書いたのはVimの機能だけれど、今ではvundleなどのプラグイン管理用プラグインを使う方が一般的と思われる。)

:GetLatestVimScripts

を実行すると、プラグインを自動的にダウンロードしてインストール/更新してくれる。ただし、事前に ~/.vim/GetLatest/GetLatestVimScripts.dat ファイルを作成し、そこに

ScriptID SourceID Filename
--------------------------
1879 1 :AutoInstall: autocomplpop.vim
1984 1 :AutoInstall: fuzzyfinder.vim

のように記述しておく必要がある。最初の2行は必ず必要で、3行目以降にインストールしたいプラグインの情報を記述する。数値は、一番左にプラグインのIDを書き、2番目には1と書く(2番目の番号はGetLatestVimScripts実行時に書き換えられる)。

参考:GetLatestVimScripts の使い方, getscriptで最新のVimスクリプトを自動取得, Vim documentation: getscript

コメント

  • zH ←nowrapなノーマルモードのとき 画面からはみ出た長い行を横に移動する →zL - A_Nekomimi_A (2011年07月04日 17時48分11秒)
    • コメントありがとうございます。スクロールの所に追記してみました。 - 小川
お名前: コメント: