#044
posted on 2021.06.01

Vimの初期設定をまとめた「.vimrc」ファイルの記述方法と記述内容。

CUI(Character User Interface)エディターのVimの初期設定をまとめた「.vimrc」ファイルの記述方法と一般的な記述内容のメモ。

 

Vimの基礎知識は前の記事を参照。

 

VIM – Vi IMproved 8.0 で確認。

 

Vimの各機能の設定はコマンドラインモードからExコマンドで都度変更できるが、Vimを終了すると元に戻るので、「.vimrc」ファイルを作成して変更したい設定をまとめて記述しておく。

  1. 「.vimrc」ファイルを作成して所定のディレクトリに配置。
  2. Vimの文法(Vim script)で変更したい設定を記述。
  3. Vim起動時に「.vimrc」ファイルが読み込まれて記述した内容が反映される。

※ Unix系の場合は、「$HOME/.vimrc」(~/.vimrc)または「$HOME/.vimr/.vimrc」(~/.vimr/.vimrc)に配置する。(ターミナルで$HOMEなど環境変数を確認するシェルコマンドは「echo $変数名」。)

※ VimはVi後方互換のため、「.vimrc」ファイルがあれば自動的にVimの既定値を使い、無ければViの既定値を使う仕様になっている。(=「.vimrc」ファイルがあれば、Exコマンド「:set nocompatible」を実行したのと同じになる。)

 

ExコマンドでVimの設定を確認

設定できるオプションの一覧。

:h option-list

 

現在のすべての設定値を確認。

:set all

 

vimrcのヘルプ。(OSごとの設置場所など。)

:h vimrc

 

 

各種設定に関する「.vimrc」ファイルの記述

「.vimrc」ファイルに、Vim scriptで設定のExコマンドを記述していく。

  • Vim scriptではExコマンドの「:」は省いて記述する。
  • 「”」はコメントアウト。(条件式内など場所によっては「”」でコメントアウトできない。)

 

文字コードの設定

Vimで改行したときは、現在のfileformatに対応した改行コードが適用される。

unixでは「LF」、macでは「CR」、dosでは「CRLF」。基本的には「LF」を使用する。

set encoding=utf-8 "Vimが内部処理で使用する文字コード
scriptencoding utf-8 "開いたファイルのVim scriptの文字コード
set fileencoding=utf-8 "ファイル保存時の文字コード(設定が無ければencodingの文字コード)
set fileencodings=utf-8,euc-jp,iso-20220-jp "文字化け対策のために羅列(左から優先的にチェックされる)
set fileformats=unix,mac,dos "改行コードのフォーマットを指定(複数記述により自動判別して非互換対策)

 

システム機能の設定

「clipboard」の設定は、「clipboard」機能を同梱しているVimのみ使用可能。

filetype on "ファイル形式の検出を有効化
filetype plugin indent on "ファイル形式の検出、ファイル形式別プラグイン・インデントのロードを有効化
set compatible "Vi互換の動作をオン (「.vimrc」があると自動的にオフ)
set clipboard=unnamed "yankとputをOSのクリップボードと連携させる(文字列が格納されている「無名レジスタ」の内容を「*レジスタ」にセットする)
set clipboard=unnamedplus "「無名レジスタ」の内容を「+レジスタ」にセットする(OSによって「unnamed」と使い分け)
set clipboard=autoselect "テキスト選択したら自動的にクリップボードにコピー
set history=数値 "コマンドの履歴をn件保存
set wildmenu "コマンドラインモードのときに「tab」キーで入力補完候補の一覧を表示

 

画面表示の設定

set lines=数値 "ウィンドウの高さを設定
set columns=数値 "ウィンドウの幅を設定
set number "行番号表示
set title "タイトルバーにファイルパスを表示
set list "タブ、スペース、改行文字を可視化
set listchars=tab:»-,trail:-,eol:↲,extends:»,precedes:«,nbsp:% "不可視文字(タブ、行末でのスペース、改行、画面両端で見切れているテキストの存在を示す記号、スペースの文字コード)の表記を変更
set visualbell "ビープ音を視覚表示(ビープ音時にカラー反転)
set showcmd "(「d2w」など)コマンドの入力途中でキー入力の状態を画面右下に表示

syntax on "シンタックスハイライト有効化
colorscheme カラースキーム名 "カラースキームの指定

 

ステータスラインの表示内容変更の設定

※ Exコマンド「:h statusline」でオプションなどステータスラインのヘルプ。

※ 「%」のあとの文字がステータスラインのオプションとして機能し、「%」が無ければただの文字列として認識される。

※ 特殊文字やスペースを挿入する場合は「\」でエスケープ処理する。(「%」文字のエスケープは「%%」。)

set laststatus=2 "画面下にステータスラインを常に表示(「0」は非表示、「1」はウィンドウが分割の場合だけ表示)
set statusline=%f "ファイルの相対パス
set statusline+=%F "ファイルの絶対パス
set statusline+=%y "ファイル形式
set statusline+=%m "内容が編集されている場合は[+]を表示(読み込み専用なら[-]で表示)
set statusline+=%r "読み込み専用の場合は[RO]を表示
set statusline+=%h "ヘルプの場合は[Help]を表示
set statusline+=%w "プレビューの場合は[Prevew]を表示
set statusline+=%= "左右の区切り(これ以降は右寄せで表示)
set statusline+=%{&ff} "fileformatの値を表示(fileformat」の省略形)(dos, unix, mac)
set statusline+=%{&fileencoding!=''?&fileencoding:&encoding} "fileencoding(ファイルの文字コード)の設定値、無ければencoding(Vimの文字コード)の値
set statusline+=%l "カーソル位置の行番号
set statusline+=%c "カーソル位置の列番号
set statusline+=%p "全行数の何%の位置に居るか
set statusline+=%L "ファイルの全行数

"1つにまとめて記述
set statusline=%F\ %y%m\ %r%h%w%=[%{&fileencoding!=''?&fileencoding:&encoding},%{&ff}]\ [Pos\ %02l,%02c]\ [%p%%/%L]

 

カーソルの設定

set cursorline "カーソルがある行を強調表示
set cursorcolumn "カーソルがある列を強調表示
set whichwrap=b,s,h,l,<,>,~,[,] "行頭行末の左右移動で上下の行に移動
set virtualedit=onemore "行末の1文字右までカーソルを移動をできるようにする
set ruler "カーソル位置の行・列番号をステータスラインに表示(statuslineで設定変更してない場合)

 

編集ファイルの挙動の設定

set autoread "外部でファイルに変更があったときに自動再読み込み
set confirm "保存されていないときは終了前に確認(保存を確認するYes,No,Cancel選択の表示)
set nobackup "保存時に保存前のバックアップファイルを生成しない
set noswapfile "編集中のファイルをスワップファイルとして保存しない

 

編集補助の設定

set showmatch "括弧入力時に対応する括弧を強調表示
set completeopt=menuone,noinsert "常に補完ウィンドウを表示,補完ウィンドウを表示時に挿入しない

 

インデントの設定

※ Vimはデフォルトで40以上のプログラミング言語の自動改行に対応している。

set autoindent "新しい行に前の行のインデントが引き継がれる自動インデント
set smartindent "C言語ライクに判別する自動インデント
set cindent "より厳密に判別する自動インデント(smartindentは無効になる)

set tabstop=数値 "半角スペースn個連続で「Tab」文字に変換(expandtabがオフの場合)
set softtabstop=数値 "「Tab」キーで半角スペースをn個挿入(smarttabがオフの場合)
set shiftwidth=数値 "挿入されるインデントの幅を半角スペースをn個に設定
set expandtab "tabstopなどの設定による半角スペースの「Tab」文字への変換をさせない
set smarttab "行頭のときに「Tab」キーでインデント(shiftwidthの値に準拠)

 

検索の設定

set hlsearch "検索該当文字列をハイライト強調
set wrapscan "ファイル末尾まで検索して進んだらファイルの先頭に戻る
set ignorecase "大文字/小文字の区別をしない
set smartcase "入力した検索ワードに大文字が含まれる場合だけ、大文字/小文字の区別をする
set incsearch "入力中に部分マッチで該当検索(「enter」キーを押さずに入力1文字ごとに検索開始)

 

 

キーマッピングに関する「.vimrc」ファイルの記述

押しづらいキーの操作を別のキーに割り当てたり、特定の入力をしたときに自動で特定のコマンド操作を行ったりするスクリプトを記述をしておく。

 

「:h index.txt」デフォルトキーバインドの一覧。

「:h map-overview」キーマッピングのヘルプ。 (モードの対応表など。)

「:h key-notation」入力キーの表記の一覧。

 

キーマッピングの基本的な記述方法

「指定したモード」のときに「指定した特別な引数」の挙動で「指定したキー入力」で「指定した操作」を実行する。(「特別な引数」は必須ではない。)

"「モード指定のマッピング 特別な引数 入力キー 操作内容」
inoremap <buffer> <C-h> <Left> "インサートモードのマッピングで、現在のバッファのみ、「ctrl + h」入力で、左に移動

 

キーマッピングの設定方法には、「map」(再マップする)と「noremap」(再マップしない)があるが、通常は「noremap」を指定する。

再マップとは、設定したマッピングによって出力する操作の中に、他のマッピングが設定されたキーが含まれていた場合に、さらにそのマッピングを辿って展開していくこと。(無限ループが発生する可能性もある。)

 

 

インサートモードでカーソル移動のキーマッピング

「ctrl」+「h,j,k,l」キーの入力で、インサートモードでも左右上下にカーソル移動できるようにする。

inoremap <C-h> <Left>
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-l> <Right>

inoremap : 再マップさせないインサートモードのマッピングを指定。

<C-キー> : 「ctrl + 指定したキー」の入力。

<Left> : カーソルを左へ移動。

<Down> : カーソルを下へ移動。

<Up> : カーソルを上へ移動。

<Right> : カーソルを右へ移動。

 

インサートモードで括弧の自動補完のキーマッピング

括弧を入力したら閉じ括弧も出力して左へ1文字(閉じ括弧の前に戻す)移動。

inoremap { {}<Left>
inoremap [ []<Left>
inoremap ( ()<Left>
inoremap ' ''<Left>
inoremap " ""<Left>

inoremap : 再マップさせないインサートモードのマッピングを指定。

<Left> : カーソルを左へ移動。

 

インサートモードで補完候補から「enter」キーで選択しても改行させないキーマッピング

「enter」キーで選択決定すると改行も同時に入るので、補完候補表示のときは「enter」キーを「ctrl + y」(改行が入らない選択決定)として動作させ、補完候補が非表示の場合はそのまま「enter」キーとして動作させる。

inoremap <expr> <CR> pumvisible() ? "<C-y>" : "<CR>"

inoremap : 再マップさせないインサートモードのマッピングを指定。

<expr> : 引数を式(スクリプト)として扱い、式を評価する。

<CR> : 「enter」キー。

pumvisible() : 補完ウィンドウ表示の有無を返す関数。

<C-y> : 「ctrl + y」キー。

 

オムニ補完機能の設定と、インサートモードで閉じタグ補完のキーマッピング

Vimではオムニ補完(Omni completion)と呼ばれる、ソースコードの書式や文脈に沿った補完を行う機能を、開いたファイルの形式に則して有効化するコマンドの自動化。(別途「filetype plugin on」の設定でないとファイル形式を判定できない。)

※ オムニ補完の機能が有効な場合、「ctrl + x」「 ctrl + o」で補完候補が表示される。(補完候補表示中に「 ctrl + e」で補完をキャンセル。)

※ おそらく仕様で「omnifunc」は1個のバッファに1個しか設定できない。

 

xmlとhtmlの場合は、オムニ補完の機能を利用して、キーマッピングで「</」を入力したら自動で閉じタグを補完する。

augroup ag2omnicomp
	autocmd!
	autocmd Filetype html setlocal omnifunc=htmlcomplete#CompleteTags
	autocmd Filetype html setlocal omnifunc=xmlcomplete#CompleteTags
	autocmd Filetype css setlocal omnifunc=csscomplete#CompleteCSS
	autocmd Filetype javascript setlocal omnifunc=javascriptcomplete#CompleteJS
	autocmd Filetype php setlocal omnifunc=phpcomplete#CompletePHP

	autocmd Filetype xml inoremap <buffer> </ </<C-x><C-o>
	autocmd Filetype html inoremap <buffer> </ </<C-x><C-o>
augroup END

augroup グループ名 augroup END : 任意のグループ名でautocmdをグループ化する。

autocmd! : 現在のグループ名に属しているすべてのautocmdを削除(重複読み込みを避けるため)。

autocmd : 指定したイベントが発生したら自動的に指定のコマンドを実行。

Filetype ファイル形式 : Filetypeイベント。指定したファイル形式の場合に発火。

setlocal : 現在のバッファを対象に設定。

omnifunc=値 : オムニ補完機能に値を指定して有効化する。(インサートモードで「ctrl+x ctrl+o」でソースコードの補完候補が表示されるようになる。)

inoremap : 再マップさせないインサートモードのマッピングを指定。

<buffer> : 現在のバッファのみを対象にする。

 

 

この記事をシェア

この記事へのコメント

コメントの書き込みはまだありません。

  • コメント内のタグはエスケープ処理され、文字列として出力されます。
  • セキュリティーのため、投稿者のIPアドレスは取得されます。
  • 管理者が内容を不適切と判断したコメントは削除されます。
  • このフォームにはスパム対策として、Googleの提供するreCAPTCHAシステムが導入されています。
    (Google Privacy Policy and Terms of Service.)