新しい MacBook Pro の Vim 環境を整備する中で最小限の .vimrc ファイルを作成してみました。万人にとって最小限の .vimrc ファイルではなく、Vim 環境の要件に基づいて最小限の .vimrc ファイルを作成する手順について説明していきます。
Vim 環境の要件を明確にする
Vim 環境を構築する記事は世の中にたくさんあります。しかし、事前に Vim 環境の要件を明示しているものはそれほど多くない気がします。Vim だけでアプリケーション開発からサーバー運用まですべてに対応するという要件だけではないと思うので、要件を明示した上で .vimrc ファイルを作成していこうと思います。
私の場合、エディターとして Rider と Visual Studio Code、Vim を使用しています。
Rider は、C# や F#、Rust のコーディングに使用しています。静的型付け言語を使用するときや、大きなプロジェクトとして開発するときは、いわゆる統合開発環境が便利です。とくに、JetBrains 社の製品はリファクタリング機能が充実しているのでお気に入りです。
Visual Studio Code は、HTML & CSS や Markdown、PlantUML などのコーディングに使用しています。プレビューしながら編集したいときや、小さなプロジェクトとして開発するときは、高速に起動して軽快に編集できる軽量ソースコードエディターが便利です。また、プログラミング言語やフレームワークを学習するために使用することも多いです。最近は、言語やフレームワークのチュートリアルに Visual Studio Code による開発環境の構築方法が記載されていることが多いからです。
Vim は、設定ファイルやスクリプトなどのコーディングに使用しています。シェルで動作を確認しながら設定したいときや、シェルから実行することを前提としたスクリプトをコーディングするときは、シェルから高速に起動できるテキストエディターが便利です。複数ファイルを並行して編集することもあるため、ターミナルとファイルエクスプローラーがテキストエディターに統合されていると理想的です。また、Linux サーバーで作業するときも標準的にインストールされている Vim を使用します。各サーバーの Vim 環境にプラグインをインストールするわけにもいかないので、作業効率を考慮した最小限の設定で作業することになります。
このような各種エディターの利用状況から下記のような Vim 環境の要件を思いつきました。
- 高速に起動できる
- 設定の可搬性がある
- シンタックスをハイライトできる
- 検索結果をハイライトできる
- インデントを調整できる
- ターミナルが統合されている
- ファイルエクスプローラーが統合されている
最小限の .vimrc ファイルを作成する
前述の要件から最小限の .vimrc ファイルを作成していきます。「高速な起動」と「設定の可搬性」については、標準的な Vim を最小限に設定することで実現できます。そのため、本節ではこれらの項目以外について見ていきます。
シンタックスをハイライトする
最初は、defaults.vim から始めましょう。defaults.vim は .vimrc ファイル(ユーザー vimrc ファイル)が見つからない場合に読み込まれます。しかし、macOS 標準の Vim は、起動時に読み込む /usr/share/vim/vimrc ファイル(システム vimrc ファイル)で defaults.vim を読み込まないように設定しています。きちんと起動時に defaults.vim ファイルを読み込むように、defaults.vim のヘルプにある指示に従って、下記の2行を .vimrc ファイルの先頭に記述しましょう。実はこれだけで「シンタックスハイライト」が実現できます。
unlet! skip_defaults_vim
source $VIMRUNTIME/defaults.vim
検索結果をハイライトする
次に、検索結果をハイライトする hlsearch を設定しましょう。ついでに大文字と小文字を区別しないように ignorecase を設定しておきます。大文字と小文字の区別なく少し広めの検索結果を得られる方が便利だと思うからです。なお、今回は設定しませんが、大文字を含む場合は大文字と小文字を区別して検索する smartcase という追加オプションもあります。
set hlsearch
set ignorecase
また、検索後にハイライトを消したいことがあります。:nohlsearch (:noh) とコマンドを入力することでハイライトを消せるのですが、ノーマルモードでエスケープキーを2回連続で押下したとき同様の動作をするようにマップを設定しておくと便利です。ちなみに、:nmap の n はノーマルモードを意味しており、ノーマルモードのみで動作するマップを設定することになります。
nmap <Esc><Esc> :nohlsearch<Enter>
インデントを調整する
ここからはインデントに関連するオプションを設定していきます。最近はスペース4文字分を使用してインデントすることが多いので、タブをスペースに展開する expandtab を設定し、タブ文字をスペース何文字分として表示するかを示す tabstop を4に設定します。タブキーを押下したときにスペース何文字分のインデントを入力するかを示す softtabstop はデフォルト値が0(機能オフ)なので明示的には設定せずオフのままにしておきます。>> などによるインデントや cindent などによる自動インデントでスペース何文字分のインデントを入力するかを示す shiftwidth を0(tabstop 値使用)に設定します。
set expandtab
set tabstop=4
set shiftwidth=0
このように設定することで、tabstop 値を変更するだけでスペース何文字分のインデントにするかを変更できます。例えば、C のインデントとしてスペース2文字分表示のタブを使用したい場合、下記のようにファイルタイプで判別して個別設定するように .vimrc ファイルに記述できます。
autocmd FileType c setlocal tabstop=2 noexpandtab
統合されたターミナルを設定する
Vim 8.1 で追加された機能としてターミナルがあり、Vim のウィンドウでシェルを実行できます。:terminal (:ter) とコマンド入力することでターミナルウィンドウが開きます。初期状態だとカレントウィンドウの上側に開くのですが、カレントウィンドウの下側に開くように splitbelow を設定します。また、ターミナルウィンドウの行数が15行になるように、そして、列数はカレントウィンドウと同じになるように、termwinsize を 15×0 に設定します。
set splitbelow
set termwinsize=15x0
統合されたファイルエクスプローラーを設定する
Vim に標準で付属している Netrw プラグインで統合されたファイルエクスプローラーを実現します。ネットワーク (net) を通じたファイルの読み書き (rw) を提供するプラグインですが、ローカルファイルのエクスプローラーとしても利用できます。
おそらく、ディレクトリへのパスで Vim を起動したとき、下記のような Netrw の画面に遭遇したことがあると思います。この Netrw を設定していくと一般的なファイルエクスプローラーのような動作になります。
まずは、Netrw のウィンドウに表示されるバナーを非表示にするために g:netrw_banner を0に設定します。Vim のオプションではなく、Netrw の変数を設定するので、設定方法が異なることに注意してください。
let g:netrw_banner=0
次に、Netrw の表示スタイルを変更します。初期設定だと、ディレクトリ上で Enter を押下した場合、そのディレクトリに移動する動作になります。ディレクトリをツリー表示で展開する動作にするために、g:netrw_liststyle を3に設定します。
let g:netrw_liststyle=3
さらに、ファイルエクスプローラーからファイルを開く動作を変更します。初期設定だと Netrw のウィンドウを上書きしてファイルが開かれます。これを g:netrw_browse_split を4に設定することで、独立した専用ウィンドウで開くようにします。そして、g:netrw_preview を1に g:netrw_winsize を75に設定することで、垂直分割で75%幅のウィンドウを開くようにします。これで一般的な軽量ソースコードエディターにおけるファイルエクスプローラーの動作とだいぶ近くなりました。
let g:netrw_browse_split=4
let g:netrw_preview=1
let g:netrw_winsize=75
最小限の .vimrc ファイル
これまでの設定をすべて記述した .vimrc ファイルは下記のようになります。オプションや変数はアルファベット順に並べています。
unlet! skip_defaults_vim
source $VIMRUNTIME/defaults.vim
set expandtab
set hlsearch
set ignorecase
set shiftwidth=0
set splitbelow
set tabstop=4
set termwinsize=15x0
nmap <Esc><Esc> :nohlsearch<Enter>
let g:netrw_banner=0
let g:netrw_browse_split=4
let g:netrw_liststyle=3
let g:netrw_preview=1
let g:netrw_winsize=75
この .vimrc ファイルを読み込んで起動した Vim 環境の一例は下記のようになります。(スクリーンショットの都合上 termwinsize は 8×0 に変更しています。)
Vim 環境を活用する
本稿で構築した Vim 環境は最小限の .vimrc ファイルで構成されています。そのため、ファイルへのパスを指定して Vim を起動する場合、その操作感への違和感はほとんどないと思います。
検索で大文字小文字を区別しないようにしているので、区別したいときは検索キーワードの末尾に \C を付与するということを覚えておくくらいでしょうか。
一方、ディレクトリへのパスを指定して Vim を起動した場合、その操作感は .vimrc ファイルの影響が大きいので本節で解説したいと思います。また、統合されたターミナルも比較的新しい機能なので一緒に説明します。
最小限の .vimrc ファイルで想定している使用方法のひとつは、プロジェクトのルートディレクトリを開くものです。例えば、ホームディレクトリで Rust のプロジェクトを生成し、そのプロジェクトを編集する場合は下記のような操作になります。
pwd
/Users/takuyatsuchida
cargo new hello
Created binary (application) `hello` package
cd hello
vim .
そうすると下記のような Netrw ウィンドウのみの Vim が起動します。
src ディレクトリの行までカーソルを移動して Enter を押下して展開し、main.rs の行までカーソルを移動して Enter を押下すると下記のように新しいウィンドウにコードが表示されます。
コマンドとして :ter を入力すると下記のように統合されたターミナルが新しいウィンドウとして開きます。(スクリーンショットの都合上 termwinsize は 8×0 に変更しています。)
あとは、ウィンドウコマンドでウィンドウを移動しながら作業していきます。CTRL-W W と CTRL-W [HJKL] を覚えておけば不便はないかと思います。
統合されたターミナルも一般的なターミナルと操作感にほとんど違いはありません。特筆すべき違いは、ターミナルモードとしてターミナルジョブモードとターミナルノーマルモードがあることです。ターミナルジョブモードは通常のターミナルと同じようなモードです。ターミナルウィンドウで CTRL-\ CTRL-N と押下するとターミナルノーマルモードに遷移し、Vim のノーマルモードと同じような操作ができます。出力結果などをコピーするときに便利です。ターミナルノーマルモードで i や a を入力するとターミナルジョブモードに戻ります。
蛇足ですが、macOS のクリップボード(レジスター +)へのコピーは、v を入力してビジュアルモードに遷移し、コピーしたい範囲を選択した上で “+y と入力することで実現できます。ブログ記事などに広範囲のソースコードや出力結果をコピー&ペーストするときに便利です。
本稿では、Vim 環境の要件に基づいて最小限の .vimrc ファイルを作成する手順について説明しました。.vimrc ファイルを作成するときの参考になれば幸いです。