Vim
Vim は、ターミナルテキストエディタです。vi の拡張版で、シンタックスハイライト、包括的なヘルプシステム、ネイティブスクリプト (Vim script)、テキスト選択のためのビジュアルモード、ファイルの比較 (vimdiff(1)) といった追加機能、および rview(1) や rvim(1) など制限付きのツールが含まれています。
インストール
以下のどちらかのパッケージをインストールしてください:
- vim パッケージは Python 2/3, Lua, Ruby, Perl インタプリタをサポート、GTK/X サポートは除外。
- gvim パッケージは上の
vim
パッケージと同じものに加えて GTK/X サポートが付属。
使用方法
これは Vim の使用方法に関する基本的な概略です。また、vimtutor
もしくは gvimtutor
を実行すると25-30分ほどの vim のチュートリアルが起動します。
Vim には4つのモードが備わっています:
- コマンドモード: キー入力はコマンドとして解釈されます。
- 挿入モード: キー入力はファイルに挿入されます。
- ビジュアルモード: キー入力でテキストを選択・カット・コピーします。
- Ex モード: 追加的なコマンドのための入力モード (例: ファイルの保存, テキストの置換...)
編集の基本
次のように Vim を起動すると:
$ vim somefile.txt
空のドキュメントが表示されます (somefile.txt が存在しない場合。存在するときは、その中身が表示されます) このまま編集することはできません – 今いるのはコマンドモードです。このモードではキーボードを使って Vim にコマンドを実行させることができます。
i
コマンドで (カーソルの前に) テキストを挿入します。I
(大文字の i) は行の最初にテキストを挿入します。テキストの追記 (カーソルの後ろにテキストを記述、ほとんどの人が予期するであろう挿入) には a
を使います。A
を入力するとカーソルが行末に置かれます。
Esc
を押すことでいつでもコマンドモードに戻ることができます。
移動
Vim では、矢印キーを使ってカーソルを移動することができますが、これは Vim の流儀とは言えません。標準のタイピングポジションから矢印キーまで右手を動かしたり、戻したりすることになります。楽しくありません。
Vim においては j
を押すことで下に移動できます。“j” は垂れ下がっていると覚えて下さい。逆に k
を押すことでカーソルを上に移動できます。左は h
で (“j” の左にあります)、右は l
です (小文字の L)
^
はカーソルを行の最初に、$
は最後に移動します。
次の単語に進むには、w
キーを押します。W
はより多くの文字列を単語として考えます (例えばアンダースコアやダッシュを単語の一部としてみなします) 前の単語に戻るには、b
を使います。同じように、B
は Vim が単語としてみなすものにより多くの文字列を含めます。単語の末尾に移動するには、e
を使い、E
はより多くの文字列を含めて考えます。
文の最初に移動したいときは、(
を使います。)
は反対に、センテンスの最後まで移動します。もっと大きな単位で移動したい場合は、{
で段落の最初まで移動できます。}
はパラグラフ全体の終末まで移動します。
画面の一番上の行に移動するには、H
を使います。M
は画面の真ん中まで移動し、L
は一番下の行に移動します。gg
はファイルの先頭まで飛び、G
はファイルの一番最後まで行きます。Ctrl+D
はページごとにスクロールします。
コマンドの繰り返し
コマンドの前に数字を付けると、その回数分コマンドが繰り返し実行されます (ただし s
コマンドなど例外はあります) 例えば、3i
→ “Help! ” → Esc
と入力すると “Help! Help! Help!“ と書かれます。2}
なら2段落だけ前に進みます。これは次のコマンドで役に立ちます。
削除
x
コマンドはカーソル上の文字を削除します。X
はカーソルの前の文字を消します。先の繰り返しと組み合わせると便利です。6x
は6文字分削除します。.
(ドット) を押すと直前の動作が繰り返されます。例えば、何箇所に "foobar" という単語を書いていたとして、あれやこれやと考えた末、“foo” だけにしたくなったとします。その際は、"b" のところまでカーソルを移動して、3x
と入力して、次の "foobar" に移って .
(ドット) を押せば "bar" を簡単に削除できます。
d
は Vim に何かを削除したいことを伝えます。d
を押した後、Vim に削除したいものを指定してください。移動コマンドを使うことで指定することができます。dW
は次の単語を削除します。d^
は行の先頭まで削除を行います。削除コマンドの前に数字を付けることもできます: 3dW
は次の3つの単語を削除します。D
(大文字) は行末まで削除するショートカットです (つまり d$
) dd
と入力すると一行まるまる削除されます。
単語を削除して置き換えたいときは、単語の上にカーソルを移動して cw
コマンドを実行してください。単語を削除してから挿入モードに移行します。一文字だけ置換するときは r
を使います。
アンドゥとリドゥ
Vim にはクリップボードが内蔵されています (バッファとも呼ばれます) 操作は u
で元に戻し Ctrl+r
でやり直すことができます。
ビジュアルモード
v
を押すことでビジュアルモードに入ることができます。ビジュアルモードではあちこち移動して文章を選択し、選択したら、y
を押して文章をバッファにヤンク (コピー) したり、c
でカットすることが可能です。カーソルの後ろには p
でペーストし、P
はカーソルの前にペーストします。V
は行単位で選択するビジュアルラインモードです。Ctrl+v
は矩形選択を行います。
検索と置換
ファイル内の単語または文字を検索するには、/
を使って検索したい文字列を入力してエンターを押します。次の検索結果を見るには n
を、前の結果に戻るには N
を押して下さい。
検索と置換をしたいときは代わりに :s/
コマンドを使います。構文は: [range]s///[arguments]
。例:
Command Outcome :s/xxx/yyy/ Replace xxx with yyy at the first occurrence :s/xxx/yyy/g Replace xxx with yyy at every occurrence in the current line :s/xxx/yyy/gc Replace xxx with yyy global with confirm :%s/xxx/yyy/g Replace xxx with yyy global in the whole file :#,#s/xxx/yyy/g Replace xxx with yyy line number range
グローバル :g/
コマンドを使えばパターン検索をしてマッチした部分でコマンドを実行することができます。構文は: [range]:g//[cmd]
。
Command Outcome :g/^#/d Delete all lines that begins with # :g/^$/d Delete all lines that are empty
保存と終了
保存や終了したいときは、Ex モードを使う必要があります。Ex モードのコマンドには :
を前に付けます。ファイルを保存するには :w
を使い、名前を付けてファイルを保存するには :w filename
を使います。終了は :q
です。変更を保存しないときには :q!
を使って下さい。保存して終了は :x
です。
その他のコマンド
s
を押すとカーソルの文字が消され、挿入モードに変わります。S
は行全体を消去して、挿入モードに移行します。o
は行の下に新しい行を追加して挿入モードに変わります、O
行の上に新しい行を追加して挿入モードに移行します。yy
は行全体をヤンクします。cc
はカーソルがある行を削除して挿入モードに入ります。*
は単語をハイライトして、n
はその単語を検索します。
設定
Vim のユーザー別の設定ファイルはホームディレクトリに配置されます: ~/.vimrc
。カレントユーザーの Vim ファイルは ~/.vim/
の中に配置されます。グローバルな設定ファイルは /etc/vimrc
にあります。グローバルな Vim ファイルは /usr/share/vim/
の中にあります。
gVim の場合、ユーザー固有の設定ファイルは ~/.gvimrc
にあり、グローバル設定ファイルは /etc/gvimrc
にあります。
set wrapscan
クリップボード
:yank
や :paste
などの Vim コマンドは名前のないレジスタを使用しますが、デフォルトでは "*
レジスタがこれにあたります。+clipboard
機能が有効になっている場合、"*
レジスタは X の PRIMARY
バッファになります。
デフォルトのレジスタを変更するには :set clipboard=unnamedplus
で "+
レジスタを使うことができます。"+
レジスタは X の CLIPBOARD
バッファに相当します。
clipboard
オプションはカンマ区切りの値に設定できることに注意してください。:set Clipboard=unnamedplus,unnamed
の場合、ヤンク操作では、ヤンクされたテキストが "+
レジスタに加えて "*
レジスタにもコピーされます。(ただし、削除、変更、および配置の操作は、依然として "+
レジスタに対してのみ実行されます)
詳細については、:help 'clipboard'
を参照してください。clipboard
機能に設定できる値は他にもあります。:help Clipboard-unnamed
を使用すると、この機能に設定できる最初の有効な値のヘルプ トピックに移動し、続いて他のすべての有効な値のヘルプに移動できます。
シンタックスハイライト
シンタックスハイライトを有効にするには (Vim は膨大な数のプログラミング言語をサポートしています):
:filetype plugin on :syntax on
インデント
特定のファイルタイプのインデントファイルをロードするには:
:filetype indent on
折返し表示
wrap
オプションはデフォルトでオンになっており、ウィンドウの幅より長い行を折り返し、残りの行を次の行に表示するように Vim に指示します。wrap
オプションはテキストの表示方法のみに影響し、テキスト自体は変更されません。
折り返しは通常、単語の途中であっても、ウィンドウに収まる最後の文字の後に行われます。よりインテリジェントな折り返しは linebreak
オプションで制御できます。set linebreak
で有効にすると、breakat
文字列オプションにリストされた文字の後に折り返しが発生します。
折り返された行は通常、インデントに関係なく次の行の先頭に表示されます。breakindent オプションは、長い行を折り返すときにインデントを考慮し、折り返された行が前に表示されていた行と同じインデントを保つように Vim に指示します。breakindent
の動作は breakindentopt
オプションで微調整することができ、例えば Python ファイルでは折り返す行をさらに 4 スペース右にずらすことができます (詳細は:help breakindentopt
を参照してください):
autocmd FileType python set breakindentopt=shift:4
マウスを使う
Vim にはマウスを利用できるようにする機能がありますが、特定のターミナルでしか機能しません (Linux なら xterm と gpm による Linux コンソール、あるいは PuTTY、詳しくはコンソールマウスサポート を参照)
この機能を有効にするには次の行を ~/.vimrc
に追加してください:
set mouse=a
~/.vimrc
が存在しない場合 mouse=a
オプションを defaults.vim
に設定することで読み込まれます。
矢印キーによる行移動
デフォルトでは、行頭で ←
を押したり、行末で →
を押しても、カーソルは前の行や次の行に移動しません。
~/.vimrc
ファイルに set whichwrap=b,s,<,>,[,]
を追加することでこのデフォルトの挙動を変更することができます。
ファイルのマージ
Vim には差分エディタが入っています。2つ (もしくはそれ以上) のファイルの差分をマージするのを助けるプログラムです。vimdiff
は横にマルチペイン表示を行って差分を色でハイライトします、それぞれのペインには確認・編集するファイルが開かれます。Vim には複数のモードが存在しますが、重要なのは文章を編集する挿入モードと、ウィンドウや行をわたってカーソルを移動するコマンドモードの2つです。vimdiff file1 file2
を実行して起動します。以下はいくつかのコマンドの例です。
アクション | ショートカット |
---|---|
次の差分 | ]c
|
前の差分 | [c
|
カーソルが (ハイライトされた) 差分の上にあるとき、もうひとつのウィンドウから現在のウィンドウに差分をコピー | do
|
現在のウィンドウからもうひとつのウィンドウへ差分をコピー | dp
|
折り畳まれた文章を開く | zo
|
折り畳まれた文章を閉じる | zc
|
ファイルの差分を再スキャン | :diffupdate
|
ヒントとテクニック
作業を完遂するための特定のユーザーのトリック。
行番号
:set number
で行番号を表示。:set relativenumber
で相対的な行番号を表示。:<line number>
でその行番号にジャンプ。
ジャンプはジャンプリストに記録されます。詳しくは :h jump-motions
を参照。
スペルチェック
set spell
この設定を使うと、Vim はスペルが間違っている単語をハイライトします。ミススペルの単語にカーソルを載せて z=
を入力すればスペルのサジェストが表示されます。
デフォルトでは英語の辞書しかインストールされていません、他の辞書は公式リポジトリからインストールできます。利用可能な言語のリストを表示するには:
# pacman -Ss vim-spell
言語辞書は Vim FTP archive からも入手できます。ダウンロードした辞書は ~/.vim/spell
フォルダに配置して、次を入力して辞書をセットしてください: :setlocal spell spelllang=LL
実行状態の保存
通常、vim
を終了すると、開いているファイル、コマンドラインの履歴、ヤンクしたテキストなど、必要のない情報はすべて破棄されます。この情報を保存するかどうかは、以下の方法で設定できます。
viminfo ファイル
また、viminfo
ファイルには、コマンドライン履歴、検索文字列履歴、入力行履歴、レジスタの内容、ファイルのマーク、ファイル内の位置マーク、最後の検索/置換パターン (セッション内で n
と &
による検索モードで使用)、バッファリスト、定義済みのあらゆるグローバル変数を保存するために使用されることがあります。viminfo
モダリティを使用するには、インストールした vim
のバージョンが +viminfo
機能付きでコンパイルされている必要があります。
viminfo
ファイルに何を残すかを設定するには、例えば ~/.vimrc
ファイルに以下のように記述します。
set viminfo='10,<100,:100,%,n~/.vim/.viminfo
各パラメータの前には識別子が付きます:
'q : q, 記憶された編集済みファイルの数 <m : m, 各レジスタに保存される行数 :p : p, 記憶された履歴コマンド行の数 % : バッファリストを保存して復元します n...: viminfo ファイルへの完全修飾パス (これはリテラル "n" であることに注意してください。)
既存の viminfo
ファイルが現在のセッション情報、例えばあなたが終了しようとしている現在のセッションのいくつかのバッファから更新されるときに、どのように変更されるかの詳細については、公式 viminfo documentation をご覧ください。
セッションファイル
セッションファイルは、任意の数の特定のセッションの状態を長期にわたって保存するために使用できます。各セッションやプロジェクトに1つの個別のセッションファイルを使用することができます。このモダリティを使用するには、インストールした vim
のバージョンが +mksession
機能付きでコンパイルされている必要があります。
セッション内で :mksession[!] [my_session_name.vim]
はカレントディレクトリの my_session_name.vim
に vim-script を書き出します。ファイル名を not にするとデフォルトで Session.vim
が使われます。オプションの !
は、同じ名前とパスの既存のセッションファイルを破棄します。
vim
セッションは、ターミナルから vim を起動するときに再開できます:
$ vim -S [my_session_name.vim]
または、vim コマンドを実行して、既に開いているセッション バッファーで次のようにします。
:source my_session_name.vim
保存される内容やセッションファイルのオプションの詳細については、vim documentation で詳しく説明されています。コメント付きの例は、ここ にあります。
カーソル位置の保存
こちらを参照 Restore cursor to file position in previous editing session
vi コマンドを vim で置き換える
vi
を vim
にする エイリアス を作成してください。
もしくは、sudo vi
と入力したときに vim
が起動するようにしたい場合、vi-vim-symlinkAUR をインストールしてください。vi
が削除され vim
のシンボリックリンクで置き換えられます。
DOS/Windows のキャリッジリターン (CR)
行末に "^M" が表示されることがあります。これは MS-DOS や Windows で作成したテキストファイルを編集しようとしたときに起こります。
解決方法: 次のコマンドで "^M" を全て置換:
:%s/^M//g
注意、"^" は制御文字なので、Ctrl+Q
を押して正しい "^" を取得してください。
もしくは、公式リポジトリから dos2unix パッケージをインストールして、dos2unix <file name here>
を実行してください。
gVim ウィンドウの底部の空きスペース
ウィンドウサイズのヒントを無視するように設定されたウィンドウマネージャを使っている場合、gVim は空の領域を GTK テーマの背景色で塗りつぶします。
解決方法はウィンドウ下部の gVim が確保するスペースを調整することです。ゼロに設定した場合、下の横スクロールバーが見えなくなってしまうことがあるので注意してください。次の行を ~/.vimrc
に記述します:
set guiheadroom=0
Vim をページャとして使う
スクリプトを使える Vim は アプリケーション一覧/ユーティリティ#ターミナルページャ として使用することができ、配色などの様々な Vim の機能を得ることができます。
Vim には /usr/share/vim/vim82/macros/less.sh
スクリプトが付属しており、その エイリアス を作成することで利用できます。このスクリプトは less(1) § OPTIONS で述べられているコマンドラインフラグをサポートしていないことに注意してください。
代わりに、vimpager という Vim スクリプトもあります。Vim スクリプトもあります。デフォルトのページャーを変更するには、環境変数 PAGER
を export してください。全てのコマンドラインフラグに対応しているわけではないことに注意してください。対応するフラグの一覧は、こちらを参照してください。 available on GitHub
検索結果の強調表示
検索の入力中に検索で一致する最初の文字列を強調表示するには、~/.vimrc
に次の行を追加します。
set incsearch
検索の入力中に検索で一致するすべての文字列を強調表示するには、検索が実行された後、~/.vimrc
に次の行を追加します。
set hlsearch
XDG Base Directory 仕様の回避策
7.3.1178 以降、~/.vimrc
が見つからない場合、vim は ~/.vim/vimrc
を検索します。
"$XDG_CONFIG_HOME"/vim/vimrc
set runtimepath^=$XDG_CONFIG_HOME/vim set runtimepath+=$XDG_DATA_HOME/vim set runtimepath+=$XDG_CONFIG_HOME/vim/after set packpath^=$XDG_DATA_HOME/vim,$XDG_CONFIG_HOME/vim set packpath+=$XDG_CONFIG_HOME/vim/after,$XDG_DATA_HOME/vim/after let g:netrw_home = $XDG_DATA_HOME."/vim" call mkdir($XDG_DATA_HOME."/vim/spell", 'p') set backupdir=$XDG_STATE_HOME/vim/backup | call mkdir(&backupdir, 'p') set directory=$XDG_STATE_HOME/vim/swap | call mkdir(&directory, 'p') set undodir=$XDG_STATE_HOME/vim/undo | call mkdir(&undodir, 'p') set viewdir=$XDG_STATE_HOME/vim/view | call mkdir(&viewdir, 'p') if !has('nvim') | set viminfofile=$XDG_STATE_HOME/vim/viminfo | endif
~/.profile
export GVIMINIT='let $MYGVIMRC="$XDG_CONFIG_HOME/vim/gvimrc" | source $MYGVIMRC' export VIMINIT='let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc" | source $MYVIMRC'
[G]VIMINIT
環境変数は、Neovim にも影響します。Vim と Neovim に個別の設定が必要な場合は、次の方が適切な選択になります:
export GVIMINIT='let $MYGVIMRC = !has("nvim") ? "$XDG_CONFIG_HOME/vim/gvimrc" : "$XDG_CONFIG_HOME/nvim/init.gvim" | so $MYGVIMRC' export VIMINIT='let $MYVIMRC = !has("nvim") ? "$XDG_CONFIG_HOME/vim/vimrc" : "$XDG_CONFIG_HOME/nvim/init.vim" | so $MYVIMRC'
プラグイン
vim にプラグインを追加することで生産力を向上させることができます。
インストール
内蔵のパッケージマネージャを使う
Vim 8 からサードパーティ製のプラグインをロードする機能がネイティブで追加されています。サードパーティ製のパッケージを ~/.vim/pack/foo
に保存することで使用することができます。
プラグインマネージャを使う
プラグインマネージャを使うことで Vim を実行しているプラットフォームから独立して Vim プラグインをインストール・管理することができます。以下が他の Vim プラグインのパッケージマネージャとして使えるプラグインです。
- Neobundle は Vundle をベースにして作られた、現在 Vim で最も人気があるプラグインマネージャですが、開発は今後保守だけになると開発者によって発表されています。
- Dein.vim は NeoBundle の開発者が新たに開発している Vim/Neovim のプラグインマネージャです。開発者曰くこちらに移行して欲しいとのこと。vim-dein-gitAUR でインストールできます。
- Vundle は Vim で人気があるプラグインマネージャです。
- Vim-plug はミニマルな Vim プラグインマネージャです。必要に応じてプラグインをロードしたり並列アップデートなどの多数の機能を備えています。
- pathogen.vim は Vim のランタイムパスを管理するシンプルなプラグインです。
Arch のリポジトリを使う
vim-plugins グループには様々なプラグインが入っています。pacman -Sg vim-plugins
コマンドを使うことで pacman でインストールできるパッケージのリストを確認できます。
注目のプラグイン
cscope
Cscope はプロジェクトを閲覧するためのツールです。単語/シンボル/関数まで移動して (ショートカットキーを使って) cscope を呼び出すことで次のことがわかります: 関数を呼び出している関数や、関数の定義など。コードベースを検索するには複数の手順が必要です。
cscope のデフォルトファイルを vim が自動的に読み取るところへコピーします:
mkdir -p ~/.vim/plugin wget -P ~/.vim/plugin http://cscope.sourceforge.net/cscope_maps.vim
cscope にインデックス化して欲しいファイルを記述したファイルを作成 (Cscope は多数の言語を扱えますがこの例では .c, .cpp, .h ファイルを find しています):
$ cd /path/to/project/dir $ find . -type f -print | grep -E '\.(c(pp)?|h)$' > cscope.files
cscope が読み取るデータベースファイルを作成します:
cscope -bq
デフォルトのキーボードショートカット:
Ctrl-\ and c: Find functions calling this function d: Find functions called by this function e: Find this egrep pattern f: Find this file g: Find this definition i: Find files #including this file s: Find this C symbol t: Find assignments to
ショートカットは自由に変更することができます。
#Maps ctrl-c to find functions calling the function nnoremap <C-c> :cs find c <C-R>=expand("<cword>")<CR><CR>
Taglist
Taglist はソースコードファイルの構造の概観を提供し、様々なプログラミング言語で書かれたソースコードファイルを効率的に閲覧できるようにします。
vim-taglistAUR パッケージをインストールしてください。
~/.vimrc
に記述する有用なオプション:
let Tlist_Compact_Format = 1 let Tlist_GainFocus_On_ToggleOpen = 1 let Tlist_Close_On_Select = 1 nnoremap <C-l> :TlistToggle<CR>
トラブルシューティング
gVim が遅い
Vim の GTK3GUI は GTK2 バージョンよりも遅い場合があります(FS#51366 を参照) gvim-gtk2AUR を回避策としてインストールしてみて下さい。
参照
公式
チュートリアル
- vim Tutorial and Primer
- vi Tutorial and Reference Guide
- Graphical vi-Vim Cheat Sheet and Tutorial
- Vim Introduction and Tutorial
- Open Vim - Vim 学習ツールのコレクション。
- Learn Vim Progressively
- Learning Vim in 2014
- Seven habits of effective text editing
- Basic Vim Tips
動画
- Vimcasts - .ogg 形式のスクリーンキャスト。
- Vim Tutorial Videos - 基本事項から高度な話題までカバー。
チートシート
- https://devhints.io/vim
- https://vim.rtorr.com/ - モバイルフレンドリーな Vim のチートシート。 - Sources
ゲーム
設定
- nion's
- A detailed configuration from Amir Salihefendic
- Bart Trojanowski
- Steve Francia's Vim Distribution
- Vim Awesome - Vim プラグイン
- W4RH4WK の Vim 設定
- Fast vimrc/colorscheme from askapache
- Basic vimrc
- Usevim
カラー
- Vivify — Vim のカラースキームエディタ。
- Vim colorscheme customization