Vim (日本語) - ArchWiki

# Vim (日本語)

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

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

## インストール

CLI バージョンを使うには、以下をインストール:

- vim-minimal パッケージは軽量版
- vim パッケージは Python 2, Lua, Ruby インタプリタをサポート、GTK/X サポートは除外
- vim-python3 パッケージは上の `vim` パッケージに加えて Python 3 インタプリタをサポート

GUI バージョンを使うには、以下をインストール:

- gvim パッケージは上の `vim` パッケージと同じものが同梱
- gvim-python3 パッケージは上の `gvim` パッケージに加えて Python 3 インタプリタをサポート

Note: 非公式の herecura-stable リポジトリには様々な種類の 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 にコマンドを実行させることができます。

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

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

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

### 移動

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

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

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

Note: 一般的に `^` と `$` は正規表現で、行の最初と最後にマッチするものとして使われます。正規表現はかなり強力で *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` は矩形選択を行います。

Note: 何かを削除した時はいつでも、その何かはバッファの中に保存され、貼り付けることが可能です。

### 検索と置換

ファイル内の単語または文字を検索するには、`/` を使って検索したい文字列を入力してエンターを押します。次の検索結果を見るには `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/` の中に配置されます。グローバルな設定ファイルは `/etc/vimrc` にあります。グローバルなファイルは `/usr/share/vim/` の中にあります。

Arch Linux における Vim のグローバル設定は必要最小限であり、他の多くのディストリビューションにおけるデフォルトの Vim の設定ファイルとは異なっています。一般に有効にされている機能を使いたいときは (シンタックスハイライトや、最後のカーソルポジションへの復帰など)、Vim のサンプル設定ファイルを使ってみて下さい:

    # mv /etc/vimrc /etc/vimrc.bak
    # cp /usr/share/vim/vim74/vimrc_example.vim /etc/vimrc

### 折り返し検索

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

    set wrapscan

### シンタックスハイライト

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

    :filetype plugin on
    :syntax on

### マウスを使う

Vim はマウスを利用できるようにする機能がありますが、特定のターミナルでしか機能しません (Linux なら xterm と gpm による Linux コンソール)。

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

    set mouse=a

Note:

- SSH 上の PuTTY でも動作します。
- PuTTY では、マウスを使うと Vim はビジュアルモードに入るので通常のハイライト・コピーの挙動は変更されています。通常通りにマウスを使って文章を選択するには、文章を選択するときに `Shift` キーを押して下さい。

### 矢印キーによる行移動

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

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

### サンプル ~/.vimrc

サンプル Vim 設定。

## ファイルのマージ (vimdiff)

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

`]c`
  次の差分
`[c`
  前の差分
`Ctrl+w+w`
  ウィンドウの切り替え
`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 のヒント

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

### 行番号

1. `:set number` で行番号を表示。
2. `:<line number>` でその行番号にジャンプ。

### スペルチェック

    set spell

この設定を使うと、Vim はスペルが間違っている単語をハイライトします。ミススペルの単語にカーソルを載せて `z=` を入力すればスペルのサジェストが表示されます。

デフォルトでは英語の辞書しかインストールされていません、他の辞書は公式リポジトリからインストールできます。利用可能な言語のリストを表示するには:

    # pacman -Ss vim-spell

言語辞書は Vim FTP archive からも入手できます。ダウンロードした辞書は `~/.vim/spell` フォルダに配置して、次を入力して辞書をセットしてください: `:setlocal spell spelllang=LL`

Tip:

- 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>` を実行してください。

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

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

## プラグイン

vim にプラグインを追加することで生産力を向上させることができます。vim-plugins グループには多数のプラグインが含まれています。

    pacman -Ss vim-plugins

### 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/projectfolder/
    find . -type f -print | grep -E '\.(c(pp)?|h)$' > cscope.files

cscope が読み取るデータベースファイルを作成:

    cscope -bq

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

## 参照

### 公式

- ホームページ
- ドキュメント
- Tips Wiki

### チュートリアル

- vim Tutorial and Primer
- vi Tutorial and Reference Guide
- Graphical vi-Vim Cheat Sheet and Tutorial
- Vim Introduction and Tutorial
- Open Vim - Collection of Vim learning tools
- Learn Vim Progressively
- know vim

#### 動画

- Vimcasts - .ogg 形式のスクリーンキャスト。
- Vim Tutorial Videos - 基本事項から高度な話題までカバー。

#### ゲーム

- Vim Adventures
- VimGolf

### サンプル設定

- nion's
- A detailed configuration from Amir Salihefendic
- Bart Trojanowski
- Steve Francia's Vim Distribution
- W4RH4WK's Vim configuration
- Fast vimrc/colorscheme from askapache

### その他

- HOWTO Vim - Gentoo wiki article which this article was based on (author unknown).
- Vivify - A ColorScheme Editor for Vim

Categories:

- Development (日本語)
- Text editors (日本語)