viを使う 2 (.vimrc / set & augroup)

viを使う 1
の続きです。

.vimrcを編集してviの設定をします。

vimのバージョンは7.4と8.0を想定しています。

Macの最初から入っているvim、brewでインストールしたvim、さくらのレンタルサーバーのvimで動作確認しています。
Raspberry Piでも動作すると思います。

.vimrcを編集する 1

.vimrcを編集して、viの設定をしていきます。
設定とその内容について説明します。

ホームディレクトリの.vimrcを編集します。


% vi ~/.vimrc

編集した内容を保存する場合は、normal modeで:w Enterと入力します。
編集した内容を保存してviを終了する場合は、normal modeで:wq Enterと入力します。

undoはnormal modeでuを押します。redoはCtrl-rです。

1文字削除する場合は、normal modeでxを押します。

1行コピーするのはnormal modeでyyで、貼り付けるのはpです。

.vimrc


"" show line number

set number

行番号を左に表示させます。
ダブルクォーテーションから行末まではコメントアウトになります。


if &compatible | set nocompatible | endif

viと互換性を持つ設定を無効にします。有効にすると、vimの高機能な機能が使えなくなります。


"" use space substitute for tab

set expandtab

"" tab width

set tabstop=4
set shiftwidth=4

タブに関連する設定です。

set expandtab

insert modeでタブキーを押したとき、指定の数の空白を挿入します。

set tabstop=4

insert modeでタブキーを押したときに入る空白の数を指定します。ここでは4を指定。

set shiftwidth=4

(自動)インデントの各段階に使われる空白の数を指定します。ここでは4を指定。


"" reflesh screen while typing

set redraw

編集内容を即時に表示させます。


"" syntax highlighting

syntax on

構文、構造に従って、色を付けるように設定します。


"" highlight corsor line

set cursorline

カーソルがある行を目立たせます。


"" always show status line

set laststatus=2

set showmode
set showcmd
set ruler

ステータスラインに対する設定です。

set laststatus=2

ステータスラインを常に表示します。(:help laststatusで、0と1についても書かれています。)

set showmode

今、normal modeなのか、insert modeなのか、visual modeなのか、を左下に表示させます。

set showcmd

右下にコマンドを表示させます。5wや10wとすると安全に確認できると思います。自分は、ここを確認することはほとんどありません。タイプミスしていそうな場合はEscを押しています。

set ruler

カーソルの位置を表示します。


"" command completion

set wildmenu

set history=2048

ステータスラインを利用する設定をします。

set wildmenu

自分の場合、:Tまたは:tとしてタブを押します。すると、Tで始まる候補一覧がステータスラインに出てきます。:fとしてタブを押す場合もあります。

set history=2048

途中まで入力して、上を押すか、タブキーを押すか、ということでここに記述しています。ある程度、使い慣れると履歴の呼び出しばかりになると思います。


"" sometime euc-jp setting is needed

" set enc=japan

set encoding=utf-8
" set encoding=euc-jp
" set encoding=sjis
" set encoding=iso-2022-jp

set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8
set fileformats=unix,dos,mac

ほとんどのサーバーでこの設定で期待の動作になるのですが、特定のサーバーで色々やって上手くいかなかったので、特定のサーバーでは手動でeuc-jpに切り替えることにしました。


"" highlight all search pattern matches

set hlsearch

"" incremental search

set incsearch

"" set ic!

set ignorecase
set smartcase

検索に対する設定です。

set hlsearch

検索にマッチした文字列を全てハイライトします。

set incsearch

入力途中でも、マッチした文字列をハイライトします。

set ignorecase

検索パターンにおいて大文字と小文字を区別しません。

set smartcase

ignorecaseと一緒に使います。検索パターンに大文字を入れると、大文字と小文字を区別します。


"" moving to matching braces

set showmatch
" set noshowmatch

"" N x 0.1 second

set matchtime=1

"" do not move cursor
"" variable loaded_matchparen = 1 -> avoid loading matchparen plugin

let loaded_matchparen=1

括弧に対する設定です。

set showmatch

閉じ括弧が入力されたとき、対応する開き括弧にわずかの間ジャンプさせます。

set matchtime=1

オプション ‘showmatch’ が有効のとき、マッチしている括弧を表示するための時間を0.1秒単位で指定します。何も指定しないと5、つまり0.5秒です。

let loaded_matchparen=1

対応する括弧を両方目立つように背景色が変わるのを止めさせます。自分の場合、邪魔に感じる場合があるので背景色が変わるのを止めていますが、慎重さを求める場合、この設定をコメントアウトして強調させた方が良いでしょう。


""

set scrolloff=10

カーソル移動の時に、上に行くとき、カーソルは上の10行より上に行かず、下に行くとき、カーソルは下の10行より下に行かないようにします。


""

set display=lastline

ウィンドウの最後の行ができるだけ表示されるようにします。
最後の行が非常に長いファイルを作成すると違いがわかります。


"" vi -p a b c d e f g h i j k l m n o p q r s t u v w x y z

set tabpagemax=20

同時に開くことができるタブの数を20に制限しています。
間違えて、ファイルがたくさんあるディレクトリで


% vi -p *

としてしまったときの保険です。
実際に10から12くらいのファイル(小さいファイル)を一度に開いて作業することもあったので、最大を20にしています。


"" :vnew -> new window will be right

set splitright

画面の垂直分割のとき、新規ウィンドウを右に作る設定です。
設定しないと左になります。これは完全に好みと思います。


"" Ctrl + a / Ctrl + x -> decimal (not octal, not hex)

set nrformats=

normal modeで数の上にカーソルがあるとき、Ctrl-a(1増やす)やCtrl-x(1減らす)で増減させる際に、8進数と認識させずに10進数で認識させる設定です。
自分の場合はCtrl-aとCtrl-xを使うのはごく稀なので、設定しなくてもあまり不便ではありません。


set backspace=indent,eol,start

インデントの後の位置でインデントを消す、行頭の位置で行末を消す、insert modeに入ったところより前の文字を消す、
ことをできるようにしています。


"" uses the indent from the previous line

set autoindent

"" recognizes some C syntax to increase/reduce the indent where appropriate

set smartindent

自動インデントに対する設定です。

set autoindent

新しい行のインデントを現在行と同じにします。

set smartindent

プログラミング言語の構文に従ってインデントできるようにします。smartindentを有効にするときは、autoindentも有効にすることが推奨されています。


"" vimdiff option : ignore upper/lower case, ignore white space

set diffopt=icase,iwhite

vimdiffに対する設定です。
大文字と小文字が違っていても、同じとみなす設定をしています。
空白の数が違っていても、同じとみなす設定をしています。
この設定をすることが有効なときと、この設定をしないことが有効なときがあります。


"" when reopen file, jump to the last position
"" au : autocmd

augroup jump_to_the_last_position
    au!
    au BufRead * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
augroup END

ファイルを開いたとき、最後に開いていた位置から始まるようにします。
この設定をしないと、先頭行から始まります。


"" Arduino

augroup arduino
    au!
    autocmd BufNewFile,BufRead *.ino set filetype=cpp
augroup END

.inoファイルを、C++のファイルとして認識させます。
色を付けるためです。


"" (toggle set paste)
"" type "set paste" everytime

augroup insertleave_nopaste
    au!
    autocmd InsertLeave * set nopaste
augroup END

insert modeからEscしたときにpaste modeを解除します。

色々とset pasteに対するmapを考えましたが、Visual Studio Codeなどからviにソースコードを持ってくるときは、mapを考えるよりも毎回set pasteを打つのが楽だという判断になりました。
業務上、WindowsからSSHで接続した先のviに貼り付けたいという場面はあるかと思います。


"" molokai's comment is too dark for some old display -> a little light
"" too dark  : 232 - 239
"" good      : 240 - 247
"" too light : 248 - 255

"" molokai's cursor line is too dark for some old display -> a little light
"" good      : 232 - 239
"" too light : 240 - 255

"" molokai's single quote in Ruby is too dark -> a little light

augroup color_a_little_light
    au!
    autocmd ColorScheme * highlight Comment ctermfg=245 " defalut : 59
    autocmd ColorScheme * highlight CursorLine ctermbg=237 " default : 235
    autocmd ColorScheme * highlight Visual ctermbg=237 " default : 235

    autocmd BufNewFile,BufRead *.rb highlight Delimiter ctermfg=250 " defalut : 241
augroup END

molokaiの色でいくつかの古いディスプレイで暗くて見えなかったので、少し明るくしています。
参考にさせていただいたページそのままです。


"" highlight function (in legacy code)

augroup highlight_function_in_legacy_code
    au!
    autocmd ColorScheme * highlight Function ctermfg=255
    " autocmd ColorScheme * highlight Function ctermfg=161
    " autocmd ColorScheme * highlight Function ctermfg=255 ctermbg=1 cterm=bold
augroup END

molokaiは関数名を明るい緑(細い)で表示します。#ifdefも明るい緑(太い)が使われるので、#ifdefが大量にあるソースコードを解析するときは瞬間的な判断が困難になります。
レガシーコードを追いかけるとき、いつもは関数名を白で表示しておいて、関数を見つけることに集中するときは赤にしているので、ここでは白にしています。


"" enable 256 colors

set t_Co=256

256色を使うための設定です。
不要なのかもしれませんが、期待の動作をしているので、そのまま残しています。


"" good bye .exrc
"" vim 7.4 -> vim 8.0 >> .exrc -> .vimrc

"" name_have_exrc

" augroup name_have_exrc
"     au!
"     autocmd BufNewFile,BufRead *exrc* set filetype=vim
" augroup END

昔々は.exrcだったのですが、vim 8.0で廃止されたようです。
廃止する時期として良い頃合いと思います。


"" if you need folding, you should use notepad++.

" set foldmethod=syntax
" set foldlevel=100

" za    toggle current fold open/closed

" zR    open all folds
" zM    close all folds

" zi    switch folding on or off
" zo    opens a fold at the cursor
" zO    opens all folds at the cursor
" zc    close current fold
" zv    expand folds to reveal cursor

" set foldenable
" set foldmethod=manual
" set foldmethod=indent
" set foldmethod=syntax

" set foldmethod=marker
" set foldmarker="{{{,}}}"

" set foldlevelstart=100

" set foldopen=all

" set foldcolumn=0

" let perl_fold=1
" let sh_fold_enabled=1

非常に似ている2つのファイルを扱うときに、foldingを使って、特定の関数を編集しないように使うことができます。
大きなファイルに似ている関数が複数ある場合もfoldingを保護のツールとして使うことができます。
そういうときにしかfoldingを使っていないので、普段は全てコメントアウトしています。

まとめ

昔はviだったんです。(もっと昔はexだったんです。もっともっと昔はedだったんです。)

徹底的に調べたわけでもなく、やりたいことできればOKでやっています。

molokaiについては、viを使う 4で説明します。

次は、mapを設計します。

参考

Vim のカラースキームが微妙に気に食わないときの対処法

広告

IT開発関連書とビジネス書が豊富な翔泳社の通販『SEshop』
さくらのレンタルサーバ
ムームードメイン
Oisix(おいしっくす)
らでぃっしゅぼーや
珈琲きゃろっと
エプソムソルト




«       »