Vim

提供: ArchWiki
移動先: 案内検索

"Vim は UNIX のデファクトエディタ ‘vi’ のパワーに、様々な機能を追加した、高機能なテキストエディタです。"

Vim はキーボードでの利用にフォーカスしており、シンタックスハイライトやスクリプト機能などの便利な機能を提供しています。Vim は nano や pico などの単純なテキストエディタとは異なります。学習するのに多少の時間を割く必要があり、マスターするためには山ほどの時間が必要です。

インストール

以下のどちらかのパッケージをインストールしてください:

  • vim パッケージは Python 2/3, Lua, Ruby, Perl インタプリタをサポート、GTK/X サポートは除外。
  • gvim パッケージは上の vim パッケージと同じものに加えて GTK/X サポートが付属。
ノート:
  • vim パッケージには Xorg のサポートが組み込まれていません。従って、+clipboard 機能がないため、Vim は X11 のプライマリ・クリップボードのセレクションバッファを利用することができません。gvim パッケージには +clipboard が有効になっている完全な X サポートが入った Vim の CLI バージョンも含まれています。
  • 非公式の herecura リポジトリには様々な種類の Vim / gVim が取り揃えられています: vim-cli, vim-gvim-common, vim-gvim-gtk, vim-gvim-qt, vim-rt, vim-tiny

使用方法

これは Vim の使用方法に関する基本的な概略です。また、vimtutor もしくは gvimtutor を実行すると25-30分ほどの vim のチュートリアルが起動します。

Vim には4つのモードが備わっています:

  • コマンドモード: キー入力はコマンドとして解釈されます。
  • 挿入モード: キー入力はファイルに挿入されます。
  • ビジュアルモード: キー入力でテキストを選択・カット・コピーします。
  • Ex モード: 追加的なコマンドのための入力モード (例: ファイルの保存, テキストの置換...)。

編集の基本

次のように Vim を起動すると:

$ vim somefile.txt

空のドキュメントが表示されます (somefile.txt が存在しない場合。存在するときは、その中身が表示されます)。このまま編集することはできません – 今いるのはコマンドモードです。このモードではキーボードを使って Vim にコマンドを実行させることができます。

ノート: Vim は典型的な古典的 Unix スタイルのソフトウェアです。学習曲線は急峻ですが、一度初めてしまえば、Vim がとても強力なのがわかるでしょう。また、全てのコマンドは大文字・小文字を区別します。場合によって大文字のコマンドはその元のコマンドを「大雑把にした」コマンドだったり (s は文字を置き換え、S は行を置き換えます)、または全く違うコマンドだったりします (j は下に移動しますが、J は2行を結合します)。

i コマンドで (カーソルの前に) テキストを挿入します。I (大文字の i) は行の最初にテキストを挿入します。テキストの追記 (カーソルの後ろにテキストを記述、ほとんどの人が予期するであろう挿入) には a を使います。A を入力するとカーソルが行末に置かれます。

Esc を押すことでいつでもコマンドモードに戻ることができます。

移動

Vim では、矢印キーを使ってカーソルを移動することができますが、これは Vim の流儀とは言えません。標準のタイピングポジションから矢印キーまで右手を動かしたり、戻したりすることになります。楽しくありません。

Vim においては j を押すことで下に移動できます。“j” は垂れ下がっていると覚えて下さい。逆に k を押すことでカーソルを上に移動できます。左は h で (“j” の左にあります)、右は l です (小文字の L)。

^ はカーソルを行の最初に、$ は最後に移動します。

ノート: 一般的に ^$ は正規表現で、行の最初と最後にマッチするものとして使われます。正規表現はかなり強力で *nix 環境では大抵使われています。初めは取っ掛かりにくいように感じられるかもしれませんが、そのうちにほとんどのキーマッピングにはある「思想」が共通していることに気がつくでしょう。

次の単語に進むには、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 です。

その他のコマンド

  1. s を押すとカーソルの文字が消され、挿入モードに変わります。S は行全体を消去して、挿入モードに移行します。
  2. o は行の下に新しい行を追加して挿入モードに変わります、O 行の上に新しい行を追加して挿入モードに移行します。
  3. yy は行全体をヤンクします。
  4. cc はカーソルがある行を削除して挿入モードに入ります。
  5. * は単語をハイライトして、n はその単語を検索します。

設定

Vim のユーザー別の設定ファイルはホームディレクトリに配置されます: ~/.vimrc。カレントユーザーの Vim ファイルは ~/.vim/ の中に配置されます。グローバルな設定ファイルは /etc/vimrc にあります。グローバルな Vim ファイルは /usr/share/vim/ の中にあります。

ノート: シンタックスハイライトなどの一般的な機能は defaults.vim で有効になっており、~/.vimrc が存在しない場合にロードされます。let skip_defaults_vim=1/etc/vimrc に追加することで defaults.vim のロードを完全に無効化できます [1]

折り返し検索

このオプションを使うと、次を検索でファイルの末尾まで達したとき、ファイルの先頭に飛ぶようになります。同じく、前を検索で先頭に達したらファイルの末尾まで移動します。

set wrapscan

クリップボード

:yank:paste などの Vim コマンドは名前のないレジスタを使用しますが、デフォルトでは "* レジスタがこれにあたります。+clipboard 機能が有効になっている場合、"* レジスタは X の PRIMARY バッファになります。

デフォルトのレジスタを変更するには :set clipboard=unnamedplus"+ レジスタを使うことができます。"+ レジスタは X の CLIPBOARD バッファに相当します。

詳しくは :help 'clipboard' を参照してください。

ヒント: コピーやペースト操作をするためのカスタムショートカットを作成することもできます。例えば [2] では ctrl+c, ctrl+v, ctrl+x をバインドしています。

シンタックスハイライト

シンタックスハイライトを有効にするには (Vim は膨大な数のプログラミング言語をサポートしています):

:filetype plugin on
:syntax on

マウスを使う

Vim にはマウスを利用できるようにする機能がありますが、特定のターミナルでしか機能しません (Linux なら xtermgpm による Linux コンソール、あるいは PuTTY、詳しくはコンソールマウスサポートを参照)。

この機能を有効にするには次の行を ~/.vimrc に追加してください:

set mouse=a

~/.vimrc が存在しない場合 mouse=a オプションを defaults.vim に設定することで読み込まれます。

ノート: ターミナルでマウスを有効にすると、X サーバーにアクセスできる場合、コピー・ペーストは "* レジスタを使うようになります。Shift キーを押すことで xterm によるマウスボタンの処理を利用できます。clipboard オプションも参照してください。

矢印キーによる行移動

デフォルトでは、行頭で を押したり、行末で を押しても、カーソルは前の行や次の行に移動しません。

~/.vimrc ファイルに set whichwrap=b,s,<,>,[,] を追加することでこのデフォルトの挙動を変更することができます。

サンプル ~/.vimrc

#設定 2を見て下さい。

ファイルのマージ (vimdiff)

Vim には差分エディタが入っています。2つ (もしくはそれ以上) のファイルの差分をマージするのを助けるプログラムです。vimdiff は横にマルチペイン表示を行って差分を色でハイライトします、それぞれのペインには確認・編集するファイルが開かれます。Vim には複数のモードが存在しますが、重要なのは文章を編集する挿入モードと、ウィンドウや行をわたってカーソルを移動するコマンドモードの2つです。vimdiff file1 file2 を実行して起動します。以下はいくつかのコマンドの例です。

]c  
次の差分
[c  
前の差分
i  
挿入モードに入る
Esc  
挿入モードを出る
p  
貼り付け
do  
diff obtain。カーソルが(ハイライトされた)差分の上にあるとき、もうひとつのウィンドウから現在のウィンドウに差分をコピー。
dp  
diff put。diff obtain の逆で、現在のウィンドウからもうひとつのウィンドウへ差分をコピー。
zo  
折り畳まれた文章を開く
zc  
折り畳まれた文章を閉じる
:diffupdate 
ファイルの差分を再スキャン
yy  
行をコピー
dd  
行を切り取り
:wq  
現在のウィンドウを保存して終了
:wqa  
両方のウィンドウを保存して終了
:q!  
保存せずに終了

ファイルを編集したら、file.pacnew の変更を考慮して:

# mv file file.bck
# mv file.pacnew file

新しいファイルが正しいか確認してから、バックアップを削除:

# rm file.bck

Vim のヒント

作業を完遂するための特定のユーザーのトリック。

行番号

  • :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

ヒント:
  • LaTeX (または TeX) 文章のスペルチェックのみを有効にしたいときは、autocmd FileType tex setlocal spell spelllang=en_us~/.vimrc/etc/vimrc に追加して、Vim を再起動してください。英語以外の言語のスペルチェックを使う場合は、en_us を適当な言語で置き換えて下さい。
  • 2つの言語のスペルチェックを有効にするには (例えば英語とドイツ語)、set spelllang=en,de~/.vimrc/etc/vimrc に追加して、Vim を再起動してください。
  • FileType プラグインとファイルタイプを検出するカスタムルールを使うことで任意のファイルタイプ (例: *.txt) のスペルチェックを有効にすることができます。名前の最後が *.txt で終わるファイルのスペルチェックを有効にするには、/usr/share/vim/vimfiles/ftdetect/plaintext.vim ファイルを作成して、autocmd BufRead,BufNewFile *.txt setfiletype plaintext という行をファイルの中に記述します。そうしたら、autocmd FileType plaintext setlocal spell spelllang=en_us~/.vimrc/etc/vimrc に追加して、Vim を再起動してください。

行の置換

特定の行だけで置換を行うには:

:n,ns/one/two/g

例えば、3行目と4行目で 'one' を 'two' に置き換えるには、次を実行します:

:3,4s/one/two/g

Vim にファイルのカーソル位置を記憶させる

前回ファイルを開いたときのカーソル位置を復元させたいときは、以下を ~/.vimrc に追加してください:

if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
endif

Vim Wiki の この tip を参照。

gVim ウィンドウの底部の空きスペース

ウィンドウサイズのヒントを無視するように設定されたウィンドウマネージャを使っている場合、gVim は空の領域を GTK テーマの背景色で塗りつぶします。

解決方法はウィンドウ下部の gVim が確保するスペースを調整することです。ゼロに設定した場合、下の横スクロールバーが見えなくなってしまうことがあるので注意してください。次の行を ~/.vimrc に記述します:

set guiheadroom=0

"^M"

行末に "^M" が表示されることがあります。これは MS-DOS や Windows で作成したテキストファイルを編集しようとしたときに起こります。

解決方法: 次のコマンドで "^M" を全て置換:

:%s/^M//g

注意、"^" は制御文字なので、Ctrl+Q を押して正しい "^" を取得してください。

もしくは、公式リポジトリから dos2unix パッケージをインストールして、dos2unix <file name here> を実行してください。

ノート: fileformat の設定を変えるという方法もあります。set ff=unix で DOS/Windows の改行コードが使われているファイルを Unix の改行コードに変換できます。逆をしたい場合、set ff=dos で Unix の改行コードが DOS/Windows の改行コードに変換されます。

vi コマンドを vim で置き換える

vivim にするエイリアスを作成してください。

もしくは、sudo vi と入力したときに vim が起動するようにしたい場合、vi-vim-symlinkAUR をインストールしてください。vi が削除され vim のシンボリックリンクで置き換えられます。

プラグイン

vim にプラグインを追加することで生産力を向上させることができます。

インストール

プラグインマネージャを使う

プラグインマネージャを使うことで 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 パッケージをインストールしてください。

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
ノート: You must browse your project files from this location or set and export the $CSCOPE_DB variable, pointing it to the cscope.out file.

デフォルトのキーボードショートカット:

 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-taglist パッケージをインストールしてください。

~/.vimrc に記述する有用なオプション:

let Tlist_Compact_Format = 1
let Tlist_GainFocus_On_ToggleOpen = 1
let Tlist_Close_On_Select = 1
nnoremap <C-l> :TlistToggle<CR>

参照

公式

チュートリアル

動画

ゲーム

設定

カラー