Vim-Tips
- 検索
- 小文字の検索で大文字も見つかるようにする(検索時に大文字小文字を無視する)
- 大文字を混ぜて検索した場合だけ大文字/小文字を区別する
- 検索文字を打ち込むと即検索する(インクリメンタルサーチ)
- 完全に一致しない文字を*,#で検索する
- 検索結果をハイライトしない
- 検索時にファイルの最後まで行ったら最初に戻らないようにする
- 設定
- 設定をデフォルトに戻す
- タブの文字数(タブストップ)を設定する
- タブの入力を空白文字に置き換える
- 水平スクロールバーを表示する
- バックスペースでインデントや改行を削除できるようにする
- 括弧の入力時にカーソルを対応する括弧の上に一定時間表示させる
- コマンドライン補完するときに補完候補を表示する
- お気に入りのファイルをキーを2つ入力しただけで開く
- バックアップファイルの作られるディレクトリを指定する
- バックアップファイルを世代別に作成する
- スワップファイルが作られるディレクトリを指定する
- キーバインド(ショートカット、キーマッピング)を設定する
- フルパスを指定せずに、ファイル名だけでファイルを開けるようにする
- 見た目
- 日本語入力中にカーソルの色を変更する
- ステータスラインに表示される文字を変更する
- 操作
- Vim付属のエクスプローラで簡単にファイルを開く
- 開いているバッファのリスト表示
- 挿入モードでインデントする
- 横スクロールをする
- 行の折り返しをしている時に見た目の次の行へ移動する
- カーソル位置の単語
- 編集中のファイル名を表示する
- 同じ文字を一気に挿入する
- 挿入モードで一時的にノーマルモードのコマンドを実行する
- 一気に行の先頭に同じ文字を挿入する
- ヴィジュアルモードの範囲を再選択する
- 編集
- キーボードマクロ
- 数の増減を行うショートカット
- CTRL-A で8進数の計算をさせない
- 目的の関数へタグジャンプをする
- プログラム内での移動
- 入力中の文字を補完する
- 常に開いているファイルと同じディレクトリをカレントディレクトリにする
- フィルタコマンドを使う
- 挿入モードでファイル名を補完して入力する
- 選択した文字をクリップボードに入れる
- 保存していなくても別のファイルを表示できるようにする
戻る
検索
小文字の検索で大文字も見つかるようにする(検索時に大文字小文字を無視する)
Vimで検索を行うと、大文字と小文字が区別されるため、「/abc」と打ち込んでも"Abc"や"ABC"を見つけることが出来ません。「/abc」で"Abc"や"ABC"を検索できるようにするためには、次の設定をします。
:set ignorecase
この設定により、検索時に大文字と小文字を区別しないで検索できるようになります。
大文字を混ぜて検索した場合だけ大文字/小文字を区別する
検索を行う際に、検索する文字のスペルは分かっているが、先頭が大文字であったかを覚えていない場合に小文字だけで大文字もヒットさせたり、大文字で構成
されている単語ということが分かっているときに、大文字で検索文字を入力して小文字をヒットさせないようにすることができる設定です。
:set smartcase
この設定により、全て小文字で検索文字を入力した場合は、大文字、小文字に関わらず検索にヒットするようになります。逆に、検索文字に大文字
を含めると大文字と小文字を区別して検索されるようになるため、検索をするときに、Shiftキーを押したりCapsLockをする必要がなくなります。
この設定の前に「:set
ignorecase」により、大文字と小文字の区別を行わないようにする必要があります。このオプションは正確には、検索パターンに大文字が含まれると
きに'ignorecase'のオプションをOFFにする設定です。
検索文字を打ち込むと即検索する(インクリメンタルサーチ)
検索を行うには、「/」を押してから検索文字を入力して、「Enter」を押しますが、「Enter」を押す前
から随時検索文字として入力した文字に一致する文字を表示することが出来ます。これを"インクリメンタルサーチ"と言います。インクリメンタルサーチを行
うには、オプション"incsearch"をONにします。
:set incsearch
こうすることにより、検索文字を入力している途中で目的の位置が表示されます。目的の語が表示されたら「Enter」キーを押すことで検索を完了することが出来ます。この機能により、ブラインドタッチが出来る方ならば、より早い検索が可能になります。
完全に一致しない文字を*,#で検索する
Vimの便利な検索方法に、検索したい単語の上にカーソルを置いて「*」を押すというものがあります。これは、
カーソルの下の単語に完全に一致する単語を検索するコマンドです。従って、"abc def
gef"という文章の"def"の上にカーソルを置いて「*」を入力すると"next-def"の"def"にはヒットしますが、"define"の
"def"にはヒットしません。
これは、「*」の検索文字となる"def"が独立した単語として書かれている個所にヒットするためです。
"def"の上で「*」を押したときに"define"にもヒットさせるときには、「g*」を使います。このコマンドにより、部分的に一致する単語にも
(前述のdefineにも)ヒットするようになります。
前方に検索する「#」の場合は、「g#」とします。
検索結果をハイライトしない
検索を行うと、Vimは検索にヒットした部分をハイライトします。この動作が好きではない場合は、
:set nohlsearch
とします。この設定は、「Enter」を押した後の検索結果をハイライトしないという意味になります。インクリメンタルサーチの結果はハイライトされるため、インクリメンタルサーチ中にどこにヒットしているか分からなくなることはありません。
逆に、ファイルを一度閉じた後でも、次にファイルを開いたときにハイライトで表示ほしいときには、
:set viminfo-=h
とします。"set
viminfo-=h"とは、オプション「viminfo」から"h"のオプションを削除するという意味になります。
"h"がなくなると、Vimは検索結
果のハイライトを次回の起動時にも表示しようとします。
:set option-=x
とすることで、viminfoの他の設定を変更せずに"h"だけを消すことが出来ます。
検索時にファイルの最後まで行ったら最初に戻らないようにする
ファイルの中から単語を次々に検索していると、いつも間にか何度も同じ場所を表示していたりします。次のオプションを設定すれば、ファイルの最後まで検索すると検索をストップしてくれるようになります。
:set nowrapscan
逆に、ファイルの先頭まで検索した場合も停止してくれるようになります。
設定
設定をデフォルトに戻す
Vimのオプションをデフォルトに戻すには、そのオプションの名称の後ろに"&"を付けます。
set viminfo&
こうすることにより、Vimで定義された規定値に戻すことが出来ます。
タブの文字数(タブストップ)を設定する
<TAB>文字が対応する空白の文字数を設定するには、オプション「tabstop」を使います。TAB幅を4にするためには以下のようにして下さい。
:set tabstop=4
あるファイルを作成したときに<TAB>の文字数を4(タブストップを4)にしていた場合は、このファイルを開く人はその人の設
定に寄らず、
<TAB>文字を4つの空白と同じ幅で表示して欲しいと思います。
このような場合には、Vimの機能である「モードライン」を使用できます。
モードラインは、ファイルの先頭数行(オプションmodelinesで指定した行数)かファイルの終端数行にスペースを空けて"vim: set
option"というように書けば機能します。
vim:ts=4
この行が書かれているとVimは、タブストップを4にしてファイルを表示します。
ファイルの先頭か最後の数行に、"vim:"と書かれていれば、Vimは
それをモードラインとして認識します。このvim:の後ろには、「:set」で指定できるオプションを書くことが出来ます(但し、安全上の理由で変更でき
ないオプションもあります)。
モードラインの"vim:xxx"の前後には、任意の文字を書くことが出来ますので、コメントの中にモードラインを置くことが出来ます。
例 htmlの場合: <!-- vim: ts=4:sw=4:tw=80 --!>
タブの入力を空白文字に置き換える
Vimでは、<TAB>文字を入力したときに、その文字を空白文字に置き換えることが出来ます。通
常、<TAB>を入力したときには<TAB>文字になってほしいことが多いのですが、メールの文章を書いている場合や、どのエ
ディタで見てもインデントが合うように<TAB>が適切な空白文字に置き換わるようにできます。
:set expandtab
このオプションをONにすると、'autoindent'も空白文字で行われます。
水平スクロールバーを表示する
gVimのデフォルトの設定では、水平のスクロールバーが表示されません。水平スクロールバーを表示するには、guioptionsに"b"を付け加えます。
set guioptions+=b
この行は、$HOMEの.gvimrcに書き込むか、以下のようにして.vimrcに書いて、GUIモード(gvim)でのみ読み込まれるようにして下さい。
if has('gui')
set guioptions+=b
endif
バックスペースでインデントや改行を削除できるようにする
Vimの初期設定では、<BS>キー(バックスペース)を押しても、インデントを削除できない、行
の先頭で前の行の改行を削除できない、Ctrl+Wで入力した単語しか削除できないという動作になります。
この動作は、直感と異なるので、変更したくなる
と思います。この動作を変更するには、以下のようにして下さい。
:set backspace=indent,eol,start
"backspace"オプションに、"indent"が入っているとオートインデントの空白文字を<BS>キーで削除できるよ
うになります。
"eol"が含まれていると、行の先頭で<BS>キーを押すことにより、前の行の改行文字を削除して前の行と連結することがで
きるようになります。
"start"を含めると、Ctrl+uやCtrl+wで入力した文字以外(最初から行にある文字)も削除することができるようにな
ります。
もし、使っているVimのバージョンが5.4以前のものであれば、0,1,2の値を"backspace"に設定してください。値はそれぞれ、
全オプションのbackspaceを参考にして下さい。
括弧の入力時にカーソルを対応する括弧の上に一定時間表示させる
プログラムを書いていると括弧が何度も続いて、いくつ目の括弧にいるか良く分からなくなることがあります。そこで、Vimでは閉じ括弧を入力すると、一時
的に対応する括弧の上にカーソルが表示されるという機能が用意されています。
この機能を使うには、以下のようにして下さい。
:set showmatch
これで、閉じ括弧を入力すると対応する括弧の開始位置にカーソルが移動するようになります。
カーソルは一時的に見た目の位置が移動しているだけですので、カーソルが戻ってくる前に次の文字を入力しても問題ありません。
カーソルが括弧の始めに要る時間が長いと感じる場合は、オプションの'matchtime'を変更してください。このオプションの値が、マッチした括弧の始めを表示する時間(1/10秒)になります。
set matchtime=3
コマンドライン補完するときに補完候補を表示する
Vimのコマンドラインでは、<TAB>キーを押すことで補完が出来ます。
例えば、":e
.v<TAB>"と入力するとカレントディレクトリにある".v"で始まるファイルを探して補完してくれます。
ところが、この補完時にどの
ファイルがどの順番で補完されるかわからないため、何度も<TAB>を押して目的のファイルを通り過ぎてしまうことがあります。
この問題を解
決するのが、次のオプションです。
:set wildmenu
このオプションをONにすると、補完候補がコマンドラインのすぐ上の行に表示されるようになります。
お気に入りのファイルをキーを2つ入力しただけで開く
よく使うファイルには、マークをしましょう。
マークをするには、お気に入りのファイルを開いて、好きな行にカーソルを置いて"mA"とします。"A"の部
分は大文字のアルファベット"A〜Z"が使えます。
小文字のマーク"a-z"はファイルごとに設定できますので、自由に使うことが出来ますが、今回の用途
には使用できません。
次回の起動時に、よく使うファイルを開くときには、マーク位置にジャンプしようとすれば良いです。
Vimを立ち上げたら、マーク位置へのジャン
プするために、"'A"と入力してください。"A"の部分はマークをするときに使った大文字のアルファベットを指定します。
こうすることで、お気に入りの
ファイルが一瞬で開きます。
大文字のマークは、Vimで一意の行を示す(別のファイルを編集中でも"'A"と入力すれば、"A"としてマークしたファイルのマークした行が表示され
る)ために使用されますが、実はこのマークはファイルを閉じても、Vimを終了させても記憶してくれています。
このため、大文字でマークをすればよく使う
ファイルを一瞬で表示できるようになります。この機能が効かない場合は、次の設定を.vimrcで行ってください。
:set viminfo+=f1
バックアップファイルの作られるディレクトリを指定する
Vimは、ファイルを変更すると変更前のファイルをバックアップファイルとして、元のファイルと同じディレクトリにFileName~というように、元の
ファイル名に"~"を付けたファイルを作成してくれます。
しかし、この規定の動作では、編集したファイルのバックアップがいたるところに出来てしまいます。
そこで、バックアップファイルが保存されるディレクトリを指定して、一箇所にバックアップファイルが書き込まれるようにする設定をしてみます。
:set backupdir=xxx
この設定により、バックアップファイルが"xxx"で指定した位置に作成されるようになり、あちこちに"~"のついたファイルが作られるのを防げます。設定するディレクトリには、変数も使用できます。
:set backupdir=$HOME/backup
バックアップファイルの拡張子を"~"から別のものに変更するには、以下のようにして下さい。
set backupext=.back
これで、FileName.backというバックアップファイルが作成されるようになります。
バックアップファイルを世代別に作成する
Vimのバックアップ機能は、保存する前のファイルに"~"を付け加えて、編集したファイルに保存するようになっています。
しかし、これでは2回以上の編
集をすると1回目のバックアップファイルが上書きされて消えてしまいます。バックアップファイルを上書きせずに、次々と作成するためには
"savevers.vim"というVimのプラグインを使うと上手くいきます。
このプラグインはVimには含まれていませんので、ダウンロードしてくだ
さい。
http://www.vim.org/scripts/script.php?script_id=89
ファイルをダウンロードしたら、ホームディレクトリに以下のディレクトリを作成してください。
・Windowsの場合
%HOME%\vimfiles\plugin
・UNIX/Linuxの場合
$HOME/.vim/plugin
作成したディレクトリにダウンロードした"savevers.vim"をコピーします。これで、Vimは起動すると"savevers.vim"というプ
ラグインを認識します。後は、このプラグインの動作を指定すれば使用できます。
このプラグインの為に以下の設定を".vimrc"に追加して下さい。
" savevers.vim バックアップファイルの設定" savevers.vimのためにパッチモードにします
set patchmode=.clean
" カンマで区切られたバックアップを作成するファイル名です "*.c,*.h,*.vim"
let savevers_types = "*"
" バックアップファイルが書き込まれるディレクトリです ここでは、オプション"backupdir"と同じディレクトリにしています
let savevers_dirs = &backupdir
" バックアップファイルとの比較でウィンドウのサイズを変更する場合は0
let versdiff_no_resize=1
" ウィンドウのサイズを変更する場合にどれだけの幅までを許可するか
"let versdiff_no_resize=80
スワップファイルが作られるディレクトリを指定する
Vimは、ファイルを2重に開いたことを検出したり、Vimがクラッシュしたときに編集中のファイルを復旧できるように、スワップファイルと呼ばれるファ
イルを作成します。通常の設定ですと、編集中のディレクトリに".FileName.swp"というファイル(FileNameの部分は開いているファイ
ル名)が作成されます。
これが嫌いな場合には、以下の設定でスワップファイルが作成されなくなります。
:set directory=
スワップファイルは作成して欲しいが、あちらこちらに作成せずに一定のディレクトリに作成して欲しい場合は、以下のようにして下さい。
let &directory = &backupdir
この設定は、スワップファイルの作成されるディレクトリをバックアップファイルの作られるディレクトリと同じにしています。違うディレクトリにある同じ名
前のファイルを開いた場合は、".index.html.swp", ".index.html.swo",
".index.html.swn"のように最後の一文字が変化したスワップファイルが作成されますので、特に問題は発生しません。
キーバインド(ショートカット、キーマッピング)を設定する
よく使う機能には、ショートカットを設定しましょう。Vimのショートカットは、キーの意味を変えることが出来ます。キーボードの"a"と"b"のキーを
入れ替えるということまで出来ます。Vimではこのキーに別の意味をもたせる機能をキーマッピングと呼んでいます。ショートカットというよりも、機能とし
ては「あるキーを押したら、別のキーを押したことと同じ動きをする」ので、ショートカットよりもキーマッピングの方がふさわしいですね。
マッピングは、":map"コマンドを使います。":map"にはモードによっていくつかのシリーズがあります。
|
ノーマル |
ビジュアル |
演算待ち |
挿入 |
コマンドライン |
:map |
○ |
○ |
○ |
|
|
:map! |
|
|
|
○ |
○ |
:nmap |
○ |
|
|
|
|
:vmap |
|
○ |
|
|
|
:omap |
|
|
○ |
|
|
:imap |
|
|
|
○ |
|
:cmap |
|
|
|
|
○ |
このように、":map"は挿入モードとコマンドラインモード以外のモードで使用でき、":map!"とすると残りの挿入モードとコマンドラインモードで使用できます。それ以外はモードごとにマッピングを行えるようになっています。
マップコマンドの構文は、":map"の後に、置き換えられるキーと新しいキーをスペースを空けて書きます。
例: map <F1> <F2>
上記の場合は、F1キーを押すとF2キーを押したのと同じ動作になります。では、実際にマッピングを試してみましょう。以下のように入力してください。
:nmap <F11> yyp
こうすると、通常モードでF11キーを押すと"yyp"を押したのと同じ動作になります。"yyp"は、"yy"で1行コピー、次の"p"でペーストになりますので、F11キーを押すことでカーソル位置の行を複製することができるようになります。
お勧めのキーマップとして以下のものがあります。
" マーク位置へのジャンプを行だけでなく桁位置も復元できるようにする
map ' `
" Ctrl+Nで次のバッファを表示
map <C-N> :bnext<CR>
" Ctrl+Pで前のバッファを表示
map <C-P> :bprevious<CR>
" 挿入モードでCtrl+kを押すとクリップボードの内容を貼り付けられるようにする
imap <C-K> <ESC>"*pa
" Ctrl+Shift+Jで上に表示しているウィンドウをスクロールさせる
nnoremap <C-S-J> <C-W>k<C-E><C-W><C-W>
" コマンドラインでのキーバインドを Emacs スタイルにする
" Ctrl+Aで行頭へ移動
:cnoremap <C-A> <Home>
" Ctrl+Bで一文字戻る
:cnoremap <C-B> <Left>
" Ctrl+Dでカーソルの下の文字を削除
:cnoremap <C-D> <Del>
" Ctrl+Eで行末へ移動
:cnoremap <C-E> <End>
" Ctrl+Fで一文字進む
:cnoremap <C-F> <Right>
" Ctrl+Nでコマンドライン履歴を一つ進む
:cnoremap <C-N> <Down>
" Ctrl+Pでコマンドライン履歴を一つ戻る
:cnoremap <C-P> <Up>
" Alt+Ctrl+Bで前の単語へ移動
:cnoremap <Esc><C-B> <S-Left>
" Alt+Ctrl+Fで次の単語へ移動
:cnoremap <Esc><C-F> <S-Right>
フルパスを指定せずに、ファイル名だけでファイルを開けるようにする
Vimでファイルを開くには、":e xxx/xxx/xxx.xxx"というようにしますが、フルパスで入力しなければならず、不便です。ここでは、予めよく開くファイルを登録しておき、必要なときにすぐに開けるようにする方法を紹介します。
複数のディレクトリによく開くファイルがある場合は、Vimの変数"path"にディレクトリを追加しておくと良いです。"path"にディレクトリが登
録されていれば、":find
xxx"とするだけでファイルを開くことができるようになります。"path"には、ディレクトリをカンマで区切って複数登録できます。
let &path += "/etc,/var/log,/var/log/httpd"
上記のようにすると、"/etc", "/var/log", "/var/log/httpd"が"path"に追加されますので、"/etc/fstab"を開くには、"find fstab"とするだけで良くなります。
見た目
日本語入力中にカーソルの色を変更する
Vimを使っていると、日本語入力中なのか分からずに困ってしまうことがあります。
そこで、日本語の入力が有効になっている場合には、カーソルの色を変えて分かりやすくする方法です。以下の内容を".gvimrc"に書き込んでください。
if has('multi_byte_ime') || has('xim')
" 日本語入力ON時のカーソルの色を設定
highlight CursorIM guibg=Purple guifg=NONE
endif
この設定は、guibg=COLOR
guifg=COLORというように書きます。"guibg"は、日本語入力がONの時のカーソルの色を表していて、"guifg"はカーソルの下の字の
色を表します。
使える色には、以下のものがあります。
|
明るい |
普通 |
暗い |
指定しない |
--- |
NONE |
--- |
黒 |
--- |
Black |
--- |
白 |
--- |
White |
--- |
茶色 |
--- |
Brown |
--- |
灰色 |
LightGrey |
Grey |
DarkGrey |
青 |
LightBlue |
Blue |
DarkBlue |
緑 |
LightGreen |
Green |
DarkGreen |
赤 |
LightRed |
Red |
DarkRed |
シアン |
LightCyan |
Cyan |
DarkCyan |
黄色 |
LightYellow |
Yellow |
DarkYellow |
マゼンタ |
LightMagenta |
Magenta |
DarkMagenta |
他の色を指定する場合は、#RRGGBBで指定することも出来ます。R=赤、G=緑,
B=青で0〜255を16進数で表した値になります。
例えば、日本語入力中のカーソルの色を赤:60h,緑:20h,青:80hの割合で混ぜた色にしたい
場合は、
:highlight CursorIM guibg=#602080 guifg=NONE
と書きます。以下に予め名前の付けられた色の一覧を載せておきます。もし、ターミナルが多くの色を表示できない場合は、似た色に丸
められます。
ステータスラインに表示される文字を変更する
ウィンドウの下に表示されるステータスラインですが、ここのフォーマットを自由に変更することが出来ます。オプションの"statusline"がステータスラインのフォーマットになります。
設定できる文字については、"statusline"の解説を見てください。
例 :set statusline=%F%M%R%=code:%B%H%W
{フルパス},+,RO code:{文字コード},HLP,PRV
操作
Vim付属のエクスプローラで簡単にファイルを開く
Vimでファイルを開くときに何かと便利なのが、":Explore"です。
これは、Windowsのエクスプローラのファイルの一覧のようにディレクト
リとファイルを表示してくれます。その一覧の中から、目的のファイルの上にカーソルを移動させて、<Enter>キーを押すことでファイルを
開くことができるようになります。ディレクトリ上で<Enter>を押すとそのディレクトリに移動します。
使用するときには、":exp<TAB>"で補完されると思いますので、続けて<Enter>を押してください。パラメータに
ディレクトリを設定するとそのディレクトリで開きます。
例えば、":Explore
C:"とするとCドライブを開きます。パラメータなしで、実行したときに開くディレクトリを変えるにはオプション"browsedir"に以下のいずれか
の設定をして下さい。
:set browsedir=last " 前回にファイルブラウザを使ったディレクト
:set browsedir=buffer " バッファで開いているファイルのディレクトリ
:set browsedir=current " カレントディレクトリ
:set browsedir={path} " {path} で指定されたディレクトリ
ファイルブラウザでの主なキー操作
操作
|
意味
|
<Enter> |
カーソル下のファイルを開く、ディレクトリに移動する |
o
|
カーソル下のファイル、ディレクトリを別のウィンドウで開く |
p
|
カーソル下のファイル、ディレクトリをプレビューウィンドウで開く |
x
|
カーソル下のファイルを関連付けられたアプリケーションで開く |
s
|
ファイルの並び順を変更する(押すたびに、ファイル名、サイズ、日付が切替る) |
r
|
ファイルの並び順を逆にする |
i
|
ファイルの詳細情報を表示する |
-
|
一つ上のディレクトリに移動する |
?
|
ヘルプを表示する |
開いているバッファのリスト表示
現在Vimで開いているバッファの一覧を表示するには、":ls"と入力します。実行すると以下のように、バッファのステータスとファイル名、カーソルのある行番号が表示されます。
> 1 #h "/test/text" line 1
> 2 - "asdf" line 0
> 3 % + "version.c" line 1
各バッファは一意の番号が割り当てられているので、":buffer N" などを使ってNで示したバッファへ移動できます。
バッファの番号の次にかかれている'-' はメモリ上にないバッファを表しています。
'h' はウィンドウに表示されていないバッファです。
'%'
はカレントウィンドウに表示されているバッファを表しています。
'#' は ":e #" や CTRL-^ で移動できるバッファです。
'+'はファイルを開いた後に編集されて、まだ保存されていないバッファを表しています。
挿入モードでインデントする
文字の挿入中にインデントをしたくなることがあります。例えば、オートインデントが思ったように動作しなかったり、ここでインデントを終了したいというよ
うな場合です。
一々ノーマルモードに戻るのも面倒なので、挿入モードのままインデントをしましょう。挿入モード中にインデントをするには、<C-T>
(Ctrlを押しながらT)を押します。これで、オプション'shiftwidth'で設定した価だけインデントされます。逆にインデントを一
段解除したい場合は、<C-D>を押します。インデントをなくしたい場合は、0<C-D>と押してください。
挿入モードではなくノーマルモードの場合は、"V"で行選択のビジュアルモードへ移行して、インデントを変更したい行を選択します。選択した状態で
"<"と入力するとインデントの1段分の解除になり、">"とするとインデントを1段追加できます。複数段のインデントをしたい場合は、
"."を押すことでインデントの増減を連続で行うことが出来ます。
横スクロールをする
Vimでは、":set
nowrap"をしていると、長い行が画面からはみ出ていきます。また、水平スクロールバーを表示しないようにしている(初期値のままでは表示されませ
ん)場合は、画面からはみ出た文字を見るために、横スクロールをするキー操作を覚えておくと便利かもしれません。横スクロールをするキーには以下のものが
あります。
操作
|
意味
|
zh |
N 文字分右にスクロール |
zl |
N 文字分左にスクロール |
zH |
半画面分右にスクロール |
zL |
半画面分左にスクロール |
行の折り返しをしている時に見た目の次の行へ移動する
Vimのデフォルトでは、画面の端で長い行が折り返されるように(:set
wrap)なっています。文章を読む場合にはこの方が読みやすくてよいのですが、編集をすると違和感のあるカーソルの動きになります。画面端で折り返され
た行で下に移動する"j"を押すと、見た目の次の行ではなく改行の次にある行まで移動します。
これは、Vimが見た目の行数ではなく、改行を基準にして行を管理しカーソルを動作させているために起こります。
編集をしているとカーソルの下の行を編集
したいために"j"を押しますが、カーソルは何行も下に移動してしまうことになります。
見た目の下の行に移動するには、横にカーソルを動かしていけばいず
れ目的の位置まで行き着きますが、これでは編集に時間がかかってしまいます。
この動作を避けるため("j"を押したら見た目の次の行に移動させる)には、"gj"を使用します。"j"の代わりに"gj"を使うことで、見た目の下の
行に移動します。上に移動するには、同じように"gk"を使用します。行の終端に移動する場合は"g$"、行の先頭に移動するには"g0"を使ってくださ
い
。
常に、見た目の行数で移動させたい場合には、キーマッピングを利用できます。".vimrc"に以下の設定を書いてください。
:nnoremap j gj
:nnoremap k gk
他の解決策としては、文章自体を編集するという手があります。文章の編集には、"gq"を使用できます。"gq"はテキストの整形コマンドで、オプション
'textwidth'で指定した文字数で自動的に改行を追加してくれます。
使うには、"gggqG"とします。最初の"gg"でファイルの先頭へ移動、
次の"gq"で整形コマンドの開始、最後の"G"でファイルの最後まで整形をするという意味になります。
カーソル位置の単語
コマンドラインでコマンドを呼び出す際に、カーソル位置の単語を表すには、'<cword>'を使います。例えば、以下のようにするとカーソル位置の単語が表示されます。
:!echo <cword>
この機能を使うことで、カーソル位置の単語をgrepするショートカットを作成できます。
nnoremap <F4> :grep <cword> ./*
編集中のファイル名を表示する
Vimでは編集中のファイルがどのディレクトリにあるのかがステータスラインに表示されません。このため、度々どこのディレクトリにあったかなと迷ってし
まうことがあります。
ステータスラインに表示する文字を変更する手もありますが、<C-G>を使うことでファイルの情報を表示することが出来
ます。<C-G>は<Ctrl>キーを押しながら<g>を押すことを意味します。<C-G>,
1<C-G>,
2<C-G>と頭に数字をつけると詳細な情報になっていきます。編集中のファイルのフルパスを表示させるには、1<C-G>か
2<C-G>を使ってください。
同じ文字を一気に挿入する
Vimでは、コマンドの前に数字を置くことで、複数回同じコマンドを実行することが出来ます。この機能を利用して、便利な技を使えます。
例えば、"-"を並べて横に線をひきたい場合は、キーを押しつづけるのではなく、"80a-"と入力してみてください。これは、80回"a-"を繰り返す
という意味になります。"80a-"と押しただけでは、"-"が1文字入力されるだけですが、ここで<Esc>キーを押すと、"-"が80個
横に並びます。
この機能は、"-"のように1文字にする必要はありません。例えば、"100a1234567890<ESC>"と入力すると"0-9"間での文字が100回分横に並ぶため、1000文字分の目盛りを振ることも出来ます。
挿入モードで一時的にノーマルモードのコマンドを実行する
挿入モードで文字を打ち込んでいるときに、少しだけノーマルモードのコマンドを打ってみたくなるときがありま
す。Viに慣れていると<Esc>を押してノーマルモードに戻り、コマンドを実行してから挿入モードに再度移行することは苦になりませんが、
一度だけノーマルモードに移って
コマンドを実行し、再度挿入モードに戻ることが分かっている場合には、<C-O>を試してみてください。
<C-O>を押すと一時的に
ノーマルモードに移行します。この状態で、ノーマルモードのコマンドを実行すると、自動的に挿入モードに戻ります。
行の途中から文字を挿入していったけれど、だんだん文章が変わってきて後ろについている文章が邪魔になった場合は、<Esc>lDiと4回
キーを押すよりも、<C-O>Dと2回のキー操作で済む方が便利です。他にも、一度だけノーマルモードに戻って操作したいときに活用できま
す。
一気に行の先頭に同じ文字を挿入する
行頭に同じ文字を挿入するには、<C-V>で挿入したい行の先頭を選択して、<I>の後に挿入したい文字を打ち<
Esc>で出来ます。
他には、選択範囲の置換を利用できます。選択範囲の置換を行うには、<S-V>で行選択モードにして変更したい行
を選択した上で、":"を押してください。すると、コマンドラインに":'<,'>"と表示されます。これは、選択範囲の開始位置から終了位
置までを表していますので、続けて"s/^/#/"と入力してください。
"s/xx/yy/"でxxをyyに置換するという意味になります。"^"は行の
先頭を表しますので、置換後が"#"になれば行の先頭に"#"が追加されることになります。
行頭を置換するというのはイメージしづらいですが、"^"は行
の先頭を表しているのであって、文字を表しているのではありません。場所をあらわしていると考えてください。従って、文字がない場所を、新しい文字で置き
換えるので、文字を追加するという意味になります。
ヴィジュアルモードの範囲を再選択する
ビジュアルモードでの選択を再度行うためには、"gv"と押してください。複雑な置換をするときには、複数回に置換コマンドを分けて実行すると簡単に行くことが良くあります。範囲選択をして置換を行うときに
編集
キーボードマクロ
Vimでもキーボードマクロを使えます。キーボードマクロは、キーボードからの入力を記録しておき、それを後からもう一度入力されたように振る舞う機能です。同じようなことを繰り返す時には、キーボードマクロを使うと便利です。
キーボードマクロを使うには、「記録開始」と「記録終了」の操作を行います。記録開始から記録終了までに入力した操作が記録されることになり、これを後で
もう一度再現することが出来るようになります。記録を開始するには、"qx"と押します。"x"は任意の文字です。ただし、"x"を大文字にすると記録さ
れたマクロに追加することになります。通常は、小文字を使ってください。記録を終了するには、"q"を押します。
では、マクロを使った例を挙げてみます。例えば、次のようなファイルがあったとします。この中から、""で囲まれた*.jpgだけを取り出したいとします。
<a href="abc.jpg">abc</a> <a href="index.html">top</a>
<a href="def.jpg">def</a> <a href="index.html">top</a>
<a href="hij.jpg">hij</a> <a href="index.html">top</a>
<a href="klm.jpg">klm</a> <a href="index.html">top</a>
<a href="nop.jpg">nop</a> <a href="index.html">top</a>
<a href="qrs.jpg">qrs</a> <a href="index.html">top</a>
<a href="tuv.jpg">tuv</a> <a href="index.html">top</a>
<a href="wxy.jpg">wxy</a> <a href="index.html">top</a>
この場合は、最初に現れる"から次の"に囲まれた範囲以外を削除すれば良さそうなので、まずは「0df"」で行の先頭から最初の「"」までを削除した後、「f"D」で2つ目の「"」以降を削除します。
これをマクロに記録するためには、「qa0df"f"Djq」と入力してください。最初の"qa"がマクロの記録開始、最後の"q"がマクロの記録終了
で、その間に「0df"」と「f"D」と「j」が入っています。最後の「j」で次の行に移動しています。これを繰り返せば、次々と編集できます。
マクロを実行するには、"@x"と入力します。"x"には記録させたマクロの名前を起きます。ここでは、"a"として記録したので、"@a"でマクロを実行できるようになります。
ファイルが何行あるかよく分からない場合は、適当に"100@a"と大きな数を"@x"の前に置いてください。Vimはファイルの終端まで行くと自動的にマクロの実行を終了してくれます。
結果、次のように欲しい文字が手に入りました。
abc.jpg
def.jpg
hij.jpg
klm.jpg
nop.jpg
qrs.jpg
tuv.jpg
wxy.jpg
数の増減を行うショートカット
Vimでは、テキストファイル内に書かれた数字を増減させることが出来ます。増減したい数字の上で<C-
a>を押すと増加、<C-x>で減少させられます。例えば次のように書かれているファイルの数字の上で<C-a>を押すた
びに、数字が増加していきます。
1. first
2. second
3. third
1.の「1」の上で<C-a>を押すと、2.に変化します。
2. first
2. second
3. third
この機能を使うと、連続した数値をキーボードマクロで並べることが出来るようになります。キーボードマクロの記録を開始するためには、通常モードで
"qx"と押してください。"x"は"a-z"の1文字を使用できます。マクロの記録を終了するには、"q"を押します。では、次のようなファイルを作成
したいとします。
=c1+d2
=c2+d3
=c3+d4
=c4+d5
=c5+d6
・・・
"="の後に、"c?"がついて"+"を挟んで"d?"が付いています。"?"は増加する数値です。この行を一気に作成するために、通常モードで最初の行を書いてください。
=c1+d2
この行をベースに次の行を作成するキーボードマクロを記録します。
qayypt+<C-a>$<C-a>q
最初の"qa"で"a"にマクロを登録します。"yyp"で現在の行を複製します。"t+"で"+"の1文字手前(増加させたい数字の上)にジャンプして
"c?"の"?"部分を増加させる。"$"で行の最後にジャンプして、"d?"の"?"部分を増加させます。最後の"q"でキーボードマクロの記録を終了
しています。
これで、"a"に1行追加するマクロが記録されましたから、これを実行します。マクロの実行は"@x"と押します。"x"の部分がマクロを記録した時の"qx"の"x"(バッファの名前)になります。ここでは、"a"で記録しましたから、実行するには"@a"と押します。
100行作成したいときには、"100@a"と押してください。"=c1+d2"〜"=c101+d102"までが作成されます。
CTRL-A で8進数の計算をさせない
<C-A>を使うと、"007"を増加させると"010"になってしまいます。これは、Vimがデフォルトで先頭に0が付く数字を8進数として扱うためです。先頭が0でも10進数として扱うためには、以下のように設定してください。
:set nrformats-=octal
これで、8進数として扱われなくなります。
目的の関数へタグジャンプをする
関数やマクロへのジャンプにはタグが使えます。ctagsでタグファイルを作成してから、タグファイルの位置をVimに知らせます。
:set tags=./tags,/usr/src/tags
「,」で区切って複数のタグファイルを指定することが出来ます。ジャンプする場合は、<C-]>と押してください。元の位置に戻るには、<C-t>とします。
プログラム内での移動
プログラムを編集中に便利な移動コマンドです。
コマンド
|
意味
|
[[
|
前の関数にジャンプ
|
]]
|
次の関数にジャンプ
|
%
|
対応する括弧"{ }","[ ]","( )"、コメント("/* */")にジャンプ
|
gd
|
ローカル宣言にジャンプ
|
gD
|
グローバル宣言にジャンプ
|
gf
|
カーソル下の単語をファイル名として開く
|
ga
|
カーソル位置の単語の文字コードを表示
|
入力中の文字を補完する
単語の入力中に、<C-p>を押すとカーソル位置よりも前にある単語で補完されます。<C-n>はカーソル位置よりも後ろにある単語で補完されます。
例えば、次のような文章を打っていたとします。
termcapinit((char_u *)"builtin_gui");
gui.starting = recursive - 1;
if (!gui.in_use) /* failed to start GUI */
{
termca
今入力している単語が"termcapinit"だとするとすでに上の方で入力していますから、<C-p>と押すだけで"termca"が"tarmcapinit"に補完されます。この機能を使うと非常に高速に編集することが出来るようになります。
常に開いているファイルと同じディレクトリをカレントディレクトリにする
通常ファイルを編集しているときには、同じディレクトリのファイルを開きたい事が多いと思います。Vimはカレ
ントディレクトリをVimが起動されたディレクトリにしていますので、開いているファイルのあるディレクトリをカレントディレクトリにしてくれません。こ
うなると、ファイルを開くたびにフルパスを入力することになってしまうのですが、開いているファイルのあるディレクトリに移動するようにVimに教えれ
ば、ファイルを開く操作が便利になります。
ファイルを開くたびに、そのファイルのディレクトリに移動するには、「.vimrc」に以下の行を書き込んでください。
au BufEnter * execute ":lcd " . expand("%:p:h")
これは、「cd.vim」というスクリプトの中身です。わざわざスクリプトにする必要はない(失礼)ので、「.vimrc」に直接書き込みます。
これで、ファイルを開く度にそのディレクトリに移動してくれるようになります。後は、編集中のファイルのあるディレクトリのファイルを開く度に、相対パスで指定できるようになります。
:e ./abc.txt
現在編集中のファイルのあるディレクトリに移動するのは、次のようにコマンドを打つことでも実現できます。
:cd %:h
フィルタコマンドを使う
Vimは、UNIXで使われるエディタなので、フィルタを便利に使うことが出来るように作られています。編集中のファイルの内容をフィルタにかけるには、次のようにします。
:%! command
これで、ファイルの内容が標準入力として「command」に渡されて、その標準出力に置き換えられます。例えば、次のようにすると、全ての行に行番号を振ることが出来ます。
:%! cat -n
「command」に渡す内容を一部分に絞ることもできます。ビジュアルモードで行を選択してから「:」を押します。コマンドラインに次のように表示されますので、
:'<,'>
「! command」で選択範囲をフィルタにかけられるようになります。
:'<,'>! command
例えば、次のようにすると選択範囲の先頭の単語だけを抜き出すことが出来るようになります。
:'<,'>! awk '{print $1}'
挿入モードでファイル名を補完して入力する
ファイル名を補完するには、<C-X><C-F>を使います。これで、ファイル名の補完をすることが出来ます。
#include "auto/conf
この状態で、<C-X><C-F>を押せば、"auto/conf"で始まるファイル名を補完してくれます。↓
#include "auto/config.h
選択した文字をクリップボードに入れる
WindowsのエディタのようにVimでコピー(ヤンク)した文字は、システムのクリップボードに入って欲しいと思うかもしれません。この場合は、以下の設定を行ってください。
set clipboard=unnamed
こうすることで、Vimのヤンクやペーストがクリップボードを使うことになり、Windowsのコピー、ペーストと同じように動作します。
Vimで文字を選択したらだけで、クリップボードにコピーするには、次のオプションを設定します。
set guioptions+=a
標準的なMS-WindowsのCTRL-X、CTRL-CおよびCTRL-Vを使うには、「.vimrc」に次の行を書いてください。
source $VIMRUNTIME/mswin.vim
保存していなくても別のファイルを表示できるようにする
Vimでは、編集後保存していないファイルがあると、別のファイルを開くことが出来ません。別のファイルを開く度に保存しなければならないのは不便ですので、保存していなくても別のファイルを開くことが出来るように設定します。
set hidden
この設定を行うと、別のファイルを自由に開くことが出来るようになりますが、強制的にファイルを閉じようとする場合は気をつけてください。
:q!
このときに、裏に隠れている編集中のファイルも保存されずにVimが終了してしまいます。
戻る