私のVim (Windows環境) (メモ)

WindowsでVimを使っている初心者Vimmerです．

自分なりに色々Vimをカスタマイズする中で、「これは新しいPCへと変えたときに今の設定を復元するのは苦労しそうだ」と思い、ここにまとめることとしました．

`.vimrc`をもとに、各行を説明する中で、vimとは別にインストールしたもの達のその手順を書きます．

:warning:をつけた場所は、私も理解しているとは言い難い項目であることを示しています．その下のリンクを参照することを勧めます．

このまとめも有効です．私の解説を見ずともだいたいのことが書いてあるでしょう．

https://vimhelp.org/quickref.txt.html

# .vimrc

こんな感じです．

```vimscript
filetype plugin indent on
syntax on

set number
set listchars=eol:\\u21b5
set list
set hlsearch
set incsearch
set ruler

set cindent

set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4

set backspace=indent,eol,start

set wildmenu


map <F2> :!make.bat <CR>
map <F5> :redraw<CR>:MinimapRefresh<CR>
map <F8> :TagbarOpen<CR>:NERDTree<CR>

nmap <c-l> <c-w>l <F5>
nmap <c-h> <c-w>h <F5>

nmap U <c-r>
nmap <Tab> gt <F5>
nmap <Esc><Esc> :nohlsearch<CR>


call plug#begin()

Plug 'preservim/nerdtree'
Plug 'preservim/tagbar'
Plug 'wfxr/minimap.vim'

call plug#end()

let g:minimap_auto_start = 1
let g:minimap_auto_start_win_enter = 1
```

# インストールするもの

インストールすべきものは以下の通りです．

 * [Vim-plug](#vim-plug)
 * [code-minimap](#code-minimap)
 * [ctags](#ctags)


# 各行の大体の説明

## 見栄え系

 コマンド | 役割
 --- | ---
 [`filetype plugin indent on`](#filetype-plugin-indent-on)| 
 [`syntax on`](#syntax-on) | 
 [`set number`](#set-number) | 行番号を表示
 [`set listchars=eol:\\u21b5` <br> `set list`](#set-list) | 改行等の空白文字の可視化
 [`set hlsearch`](#set-hlsearch) | 検索結果を強調表示
 [`set incsearch`](#set-incsearch) | 検索コマンドの入力途中でも検索結果が出るように
 [`set ruler`](#set-ruler) | カーソル位置を表示

## インデント系
 
  コマンド | 役割
 --- | ---
 [`set cindent`](#set-cindent) | 自動インデントの有効化
 [`set expandtab`　<br> `set tabstop=4` <br> `set shiftwidth=4` <br> `set softtabstop=4`](#tab文字) | タブの表示、インデントの幅など

## 編集系

 コマンド | 役割
 --- | ---
  [`set backspace=indent,eol,start`](#set-backspace) | バックスペースキーで消せるものを増やす

## コマンド系

 コマンド | 役割
 --- | ---
  [`set wildmenu`](#set-wildmenu) | コマンド補完の候補を表示

## キーマッピング系

 コマンド | 役割
 --- | ---
  [`map`　<br> `nnoremap`](#キーマッピング) | キーマッピング色々

## プラグイン

 プラグイン | 役割
 --- | ---
 [vim-plug](#vim-plug) | プラグインを管理するプラグイン
 [nerdtree](#nerdtree) | ファイル構造のツリーのパネルを表示
 [tagbar](#tagbar) | プログラム中のタグ一覧のパネルを表示
 [minimap.vim](#minimapvim) | コードのミニマップのパネルを表示

# 詳細

### `filetype plugin indent on`

:warning:ファイルタイプの読み取りをしてくれるようになります．このとき、自動でインデントの設定がされます．

https://vimhelp.org/filetype.txt.html#%3Afiletype

### `syntax on`

:warning:Syntaxの強調表示を、デフォルトの設定で有効化します．
自分で設定する場合、`syntax enable`とします．

https://vimhelp.org/syntax.txt.html#syntax

### `set number`

行番号を表示します．
`set relativenumber`だと、カーソルのある行から数えた行数が表示されます．

https://vimhelp.org/options.txt.html#%27number%27

### `set list`

vimは標準では空白文字を可視化しません．

`listchars`オプションで、各空白文字を何と置き換えるか設定しておき、`set list`でその置き換えを有効化します．

https://vimhelp.org/options.txt.html#%27list%27

### `set hlsearch`

検索結果をハイライトします．

https://vimhelp.org/options.txt.html#%27hlsearch%27

### `set incsearch`

検索するときに、語句の入力途中の時点から、その時点での検索結果を表示できるようにします．

https://vimhelp.org/options.txt.html#%27incsearch%27

### `set ruler`

右下にカーソル位置を表示させます．

`statusline`オプションでもっと詳しくいじることができそうです．(まだvimhelpをよく読めていません．)

https://vimhelp.org/options.txt.html#%27ruler%27

### `set cindent`

C言語用に、自動でインデントをかけてくれるようになります．

他にも`autoindent`や`smartindent`オプションなどあります．

https://vimhelp.org/options.txt.html#%27cindent%27

### Tab文字

Vimのtab文字の見栄えや幅関連の解説をします．

主な命令は4つです．4のところには、好きなように数字を入れてカスタマイズができます．


```vimscript
set tabstop=4
set expandtab
```
と
```vimscript
set shiftwidth=4
set softtabstop=4
```
で、合わせて4つです．

#### `tabstop`と`expandtab`

この2つのオプションでは、tab文字のVimエディタ上での見栄えを設定できます．

`tabstop`で設定した数値は、Tab文字がエディタ上で空白何個分となるかを示します．
`expandtab`を設定すれば、tab文字は全て`tabstop`で設定した個数分のスペースと置き換えられます．

#### `shiftwidth`と`softtabstop`

この2つのオプションでは、Vimで編集するときのインデント幅を設定できます．

`shiftwidth`は`>>`なとのコマンドで入力するインデントの幅を示します．
`softtabstop`は、挿入モードでのBackspaceやTabの入力で、どれだけの幅の空白を変化させるかを示します．

#### 伝えておきたいこと

下2つのオプションは、Vimの見栄え上での幅を示します．ゆえに`expandtab`が指定されてない場合、Vimは見栄えをもとに自動でTabを挿入します．
Tabは、`tabstop`で指定された量の空白文字に達したとき、自動で行頭から置き換わります．

例えば、`softtabstop=4`で`expandtab`は指定なし、`tabstop=8`であったときのお話をしましょう．
今、挿入モードでTabキーを打っていくことを考えます．
最初のTabでは、`softtabstop`の指定に従い、見栄え上幅が4になるような空白が挿入されます．つまりスペース4つです．
次のTabでも同様に、もう一回幅が4の空白が挿入されます．すると、空白は8になりここでTab1つ分に達するので、スペース8つがTab1つに置き換わります．


これを参考にしました．

https://vi.stackexchange.com/a/28017


### `set backspace`

Vimのデフォルト設定では、Backspaceキーはインデントも消してくれません、挿入モードに入ったところ以前の文字も消してくれません、改行文字も消してくれません．

故に、Backspaceキーの役割を追加指定するため、このオプションを設定します．

```vimscript
" 改行文字を消せるように
set backspace=eol 
" 挿入モードに入った場所以前も消せるように
set backspace=start
" インデントを消せるように
set backspace=indent
```

https://vimhelp.org/options.txt.html#%27backspace%27

### `set wildmenu`

コマンド補完がより多機能になります．

https://vimhelp.org/options.txt.html#%27wildmenu%27

### キーマッピング

`<F2>`でカレントディレクトリの`make.bat`を実行します．
よって、この設定でVimからワンタッチでプログラムを実行するには、`make.bat`を作っておく必要があります

`<F5>`で画面のリフレッシュを行います．
Minimapがバグるので、画面遷移を行うたびにリフレッシュすることにしました．(Minimap、必要ない気がしてきました)

`<F8>`で、各種プラグインのパネルを開きます．

## プラグイン

### Vim-plug

https://github.com/junegunn/vim-plug

### nerdtree

https://github.com/preservim/nerdtree

### tagbar

https://github.com/preservim/tagbar

### code-minimap

https://github.com/wfxr/code-minimap

## 前提ソフトウェア

### minimap.vim

https://github.com/wfxr/minimap.vim

### ctags

https://github.com/universal-ctags/ctags