vimを教えるのがめんどくさいので、代わりにリンク集を作っておく

# vimを教えるのがめんどくさいので、代わりにリンク集を作っておく

一から説明するのは難易度も物量的なコストも非常に高いので、
代わりによさげなリンクを集めておく

あと、学習コスト、設定を煮詰めるコスト共に異様に高いので、正直、VS Codeとかでいいんじゃない？とも思う。

## とりあえずチュートリアルぽいの

適当にひろったチュートリアル。まぁこの辺はどれでも

- [【Vim入門】初心者のためのviの使い方と最低限の基本操作 \| キツネの惑星](https://kitsune.blog/vi-summary)

## なんでコマンドモードがあるの？って質問への回答

vimは移動や検索が多様なのがポイントだよ、それにはコマンドモードがあるほうが便利なんだよ
っていう感じを伝えてくれる説明。

- [vimを使うとき十字キーで移動して、vimmerに殺されるその前に \- Qiita](https://qiita.com/fasahina/items/2767891134028648f288)
- [3ヶ月使って実感\! 今すぐVSCodeにVimキーバインドを導入すべき3つの理由 \- Qiita](https://qiita.com/kazu_death/items/70876d62bb0b93a730de)

移動の仕方のもう少し詳しいまとめ

- [脱初心者を目指すなら知っておきたい便利なVimコマンド25選 \(Vimmerレベル診断付き\) \- Qiita](https://qiita.com/jnchito/items/57ffda5712636a9a1e62)

## Vimを使いやすく設定する（Plugin無し）

デフォルトはいろいろ使いにくい設定なので、設定ファイルを編集して使いやすくする。
設定ファイルは`~/.vimrc`にある（UNIX系の場合）

### 補足）vimrcのset系の見方

`set ～～`でその機能がON。`set no～～～`でその機能がOFF

### 言語に関する設定（必須）

先頭に下記を書いておく

```vim
set encoding=utf-8
scriptencoding utf-8
set termencoding=utf-8
set nobomb
set fileencodings=ucs-bom,utf-8,euc-jp,cp932,sjis,iso-2022-jp-3,iso-2022-jp,eucjp-ms,euc-jisx0213
set fileencoding=utf-8 " 保存時の文字コード
set fileformats=unix,dos,mac " 改行コードの自動判別、左側が優先される
```

### 見た目の設定

細かい設定が多いのでまとめて

```vim
set tw=0 " 自動で改行する画面幅（文字数）。0で改行なし
set wrap " 長い行を折り返して表示。こっちは見た目だけで改行はしない
set nocursorline " カーソル行を強調表示する。highlightで表示内容を変更
set showmatch " 括弧入力時に対応する括弧をフラッシュして表示
set matchtime=3 " 上記のshowmatchの表示秒数を3秒にする
set number " 行番号を表示
set nolist " タブや改行を表示。結構うざいのでnoにしとく
set notitle " タイトルを表示
set scrolloff=0
set cmdheight=2 " コマンドラインの高さ

" 下記4行、ステータスライン強化プラグインを使う場合はあまり触らないようにする
set noruler " ルーラーを表示
"set laststatus=2 " 常にステータス行を表示
"set noshowmode " 現在のモードを表示
"set showcmd " コマンドをステータス行に表示

" キーワードで色を変える
if has('syntax')
  syntax enable
endif
```

### インデントの設定

とりあえずこの辺設定しとく

```vim
set expandtab " タブをスペースに展開する
set tabstop=4 " タブの画面上での幅
set softtabstop=4 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set shiftwidth=4 " smartindentで増減する幅
set autoindent " 自動的にインデントする
set smartindent " 改行時に前の行の構文をチェックし次の行のインデントを増減する
set smarttab "新しい行を作った時に高度な自動インデントを行う
set backspace=indent,eol,start " バックスペースでインデントや改行を削除できるようにする
nnoremap <Leader>f :set foldmethod=indent<CR>
```

### 検索の設定

検索は基本`/検索したい文字<CR>`。次検索は`n`前検索は`p`

```vim
set incsearch " インクリメンタルサーチ. １文字入力毎に検索を行う
set ignorecase " 検索パターンに大文字小文字を無視
set smartcase " 大文字小文字の両方が含まれている場合は大文字小文字を区別
set hlsearch " 検索結果をハイライト
" Leader+ESCキーでハイライトの切り替え
nnoremap <Leader><Esc> :<C-u>set nohlsearch!<CR>
set wrapscan " 検索時にファイルの最後まで行ったら最初に戻る
```

### 関数の定義元とかにジャンプしたい

ctagsでtagsファイル作る。あとは`<C-]>`でジャンプ、`<C-t>`で戻る

もう少し詳しい説明
- [CtagsでVimにタグジャンプ機能を追加する \- Qiita](https://qiita.com/aratana_tamutomo/items/59fb4c377863a385e032)

universal-ctags公式：[universal\-ctags/ctags: A maintained ctags implementation](https://github.com/universal-ctags/ctags)
Windows版のバイナリ：[universal\-ctags/ctags\-win32: Universal Ctags Win32 daily builds](https://github.com/universal-ctags/ctags-win32)


### 画面を分割したい

`<C-w>v`で縦分割
`<C-w>s`で横分割
入れ子もOK

より詳しい説明
[Vim のウィンドウ分割機能 \- Vim のブログ](http://vimblog.hatenablog.com/entry/vim_window)


### ターミナルでコマンド打ったり結果みながら作業したい

`:term`でvim内でターミナルが起動する

### ssh等のリモート接続を切断しても編集状態をそのままにしたい

vim単独では無理。ターミナル上で`tmux`を起動し、そのうえで`vim`を起動すればそれっぽくなる

[tmuxを使い始めたので基本的な機能の使い方とかを整理してみた \- 完熟トマト](http://kanjuku-tomato.blogspot.com/2014/02/tmux.html)

### PCごとに設定するのがめんどくさい

gitに`.vimrc`おいて、それを落とすようにする



### 文中の全角スペースを表示して欲しい

下記をvimrcに追記

```vim
" 全角スペースの表示
function! ZenkakuSpace()
  highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=grey
endfunction

if has('syntax')
  augroup ZenkakuSpace
    autocmd!
    autocmd ColorScheme * call ZenkakuSpace()
    autocmd VimEnter,WinEnter,BufRead * let w:m1=matchadd('ZenkakuSpace', '　')
  augroup END
  call ZenkakuSpace()
endif
```

### 補足）vimrcでのショートカットキー設定の見方

設定例のところどころでキー設定も行っているが、その補足。

`vimrc`のショートカットキー設定は`nmap`等の`map`系のコマンドで始まるので
その行を見れば、どのキーに何の機能を割り当てたのかがわかる。
下記のように書かれていれば`controlとkを同時押し`で`～～～～`に書かれている機能が実行される、という意味。
`<silent>`はひとまず無視しておいていい。無い場合もある。

```vim
nmap <silent> <C-k> ～～～～
```

`<leader>`は「これを押したらショートカットの開始」という意味のキーで、ユーザーが任意に設定できる
下記の場合だと、「リーダーに設定したキー押して、それからxを押す」という意味。

```vim
nmap <silent> <Leader>x ～～～～
```

リーダーの設定例。上がスペースで下がコンマの場合。使いやすいものをお好みで設定。

```vim
let mapleader = "\<Space>"
let mapleader = ","
```


## Pluginを使って、Vimを使いやすくする

機能拡張のプラグインを使って使いやすくする。
機能とプラグインのピックアップ基準は手元の自分のvimrcに記載があるもの。

以降、プラグインマネージャーとして
[junegunn/vim\-plug: Minimalist Vim Plugin Manager](https://github.com/junegunn/vim-plug)
使っている場合



### デフォルトよりましな色合いにしたい

一例。`vim カラースキーム`で検索したら色々でてくる

```
Plug 'rhysd/vim-color-spring-night'
colorscheme spring-night
```

### gitの差分を行単位で目印して欲しい

`airblade/vim-gitgutter`使う。詳細は下記。
[Vimメモ : vim\-gitgutterで差分を左端に表示する \- もた日記](https://wonderwall.hatenablog.com/entry/2016/03/26/211710)

```vim
Plug 'airblade/vim-gitgutter'
" 目印行を常に表示する
if exists('&signcolumn')  " Vim 7.4.2201
  set signcolumn=yes
else
  let g:gitgutter_sign_column_always = 1
endif
```

### git周りを便利にしたい

`tpope/vim-fugitive`を使う。
ステータスラインにブランチ名を表示する場合は次項の`lightline.vim`の設定する。
詳しい使い方は下記。
[VimmerなGit使いはfugitive\.vimを今すぐ入れたほうがいい \- SELECT \* FROM life;](http://blog.yuku-t.com/entry/20110427/1303868482)

```vim
Plug 'tpope/vim-fugitive'
" vim-fugitive: Gitを便利に使う
" grep検索の実行後にQuickFix Listを表示する
autocmd QuickFixCmdPost *grep* cwindow
" コマンドをキー登録
nnoremap <silent> <Leader>g :Gstatus<CR>
nnoremap <silent> <Leader>d :Gdiff<CR>
nnoremap <silent> <Leader>b :Gblame<CR>
```


### ステータスラインに色々情報を表示したい

`itchyny/lightline.vim`を使う
公式：[itchyny/lightline\.vim: A light and configurable statusline/tabline plugin for Vim](https://github.com/itchyny/lightline.vim)

```vim
Plug 'itchyny/lightline.vim' " ステータスラインの表示強化
set laststatus=2 " ステータスラインを常に表示
set noshowmode " 現在のモードを表示
set showcmd " 打ったコマンドをステータスラインの下に表示
set ruler " ステータスラインの右側にカーソルの現在位置を表示する
" let g:lightline = { 'colorscheme': 'wombat' }
" let g:lightline = { 'colorscheme': 'powerline' }
let g:lightline = {
  \ 'colorscheme': 'powerline',
  \ 'active': {
  \   'left': [ [ 'mode', 'paste' ],
  \             [ 'gitbranch', 'readonly', 'filename', 'modified' ] ]
  \ },
  \ 'component_function': {
  \   'gitbranch': 'fugitive#head'
  \ },
  \ }
```

### 書式チェック（linter）と修正（fixer）を自動でして欲しい

`w0rp/ale`使う
公式：[dense\-analysis/ale: Check syntax in Vim asynchronously and fix files, with Language Server Protocol \(LSP\) support](https://github.com/dense-analysis/ale)

下記はpythonの例。
参考：[ALE\(on NeoVim\)でPythonコードを楽に整形する \- Qiita](https://qiita.com/lighttiger2505/items/9a36c5b4035dd469134c)

```vim
Plug 'w0rp/ale'
" ファイル保存時にLinterを実行する
"let g:ale_lint_on_save = 1
" テキスト変更時にはLinterを実行しない
let g:ale_lint_on_text_changed = 'never'
" Linter(コードチェックツール)の設定
let g:ale_linters = {
  \   'python': ['flake8', 'mypy'],
  \ }
" ファイル保存時にはFixerを実行しない
let g:ale_fix_on_save = 0
" テキスト変更時にはFixerを実行しない
let g:ale_fix_on_text_changed = 'never'
" Fixer(コード整形ツール)の設定
let g:ale_fixers = {
  \   'python': ['autopep8', 'black', 'isort'],
  \ }
" 余分な空白があるときは警告表示
let b:ale_warn_about_trailing_whitespace = 0
" ALE実行時にでる目印行を常に表示
let g:ale_sign_column_always = 1
" Leader + l で表示非表示の切り替え
nmap <silent> <Leader>l :ALEToggle<CR>
" Leader + x でfixerの実行
nmap <silent> <Leader>x <Plug>(ale_fix)
" Ctrl + j/k でエラー行を移動する
nmap <silent> <C-k> <Plug>(ale_previous_wrap)
nmap <silent> <C-j> <Plug>(ale_next_wrap)
```


### ctagsを自動で実行して欲しい

`soramugi/auto-ctags.vim`使う。ファイル保存時に自動で実行してくれる。

```vim
Plug 'soramugi/auto-ctags.vim'
" Ctags auto-execution
let g:auto_ctags = 1
```

### ファイル選択をツリーでしたい

`scrooloose/nerdtree`を使う。

```vim
Plug 'scrooloose/nerdtree'
let NERDTreeShowHidden = 0 " 隠しファイルを表示しない（Iで切り替え）
nmap <silent> <Leader>n :NERDTreeToggle<CR>
```

### ファイルの切り替えを素早くしたい

`Shougo/unite.vim`を使う。
常用セットを覚えるだけでも随分違う
（キーはLeaderにアサインしたキー2連打がいい感じ使える）

```
Plug 'Shougo/unite.vim' " ファイルオープンを便利に
Plug 'Shougo/neomru.vim' " Unite.vimで最近使ったファイルを表示できるようにする
" 常用セット
nnoremap <Leader>, :Unite buffer file_mru<CR>
" バッファ一覧
nnoremap <Leader>ub :Unite buffer<CR>
" ファイル一覧
nnoremap <Leader>uf :UniteWithBufferDir -buffer-name=files file<CR>
" レジスタ一覧
nnoremap <Leader>ur :Unite -buffer-name=register register<CR>
" 最近使用したファイル一覧
nnoremap <Leader>um :Unite file_mru<CR>
" 全部乗せ
nnoremap <Leader>ua :UniteWithBufferDir -buffer-name=files buffer file_mru bookmark file<CR>
" sourcesを「今開いているファイルのディレクトリ」とする
noremap :uff :<C-u>UniteWithBufferDir file -buffer-name=file<CR>
"" ウィンドウを分割して開く
au FileType unite nnoremap <silent> <buffer> <expr> <C-J> unite#do_action('split')
au FileType unite inoremap <silent> <buffer> <expr> <C-J> unite#do_action('split')
"" ウィンドウを縦に分割して開く
au FileType unite nnoremap <silent> <buffer> <expr> <C-K> unite#do_action('vsplit')
au FileType unite inoremap <silent> <buffer> <expr> <C-K> unite#do_action('vsplit')
```

### 末尾の半角スペース表示して欲しい

`bronson/vim-trailing-whitespace`を使う

```
Plug 'bronson/vim-trailing-whitespace' " 行末の半角スペースを可視化
```


### インデントを視覚化して欲しい

`Yggdroot/indentLine`使う。concealで非表示にされる項目があったりするので注意。様子見ながらつかう。
公式：[Yggdroot/indentLine: A vim plugin to display the indention levels with thin vertical lines](https://github.com/Yggdroot/indentLine)

```vim
Plug 'Yggdroot/indentLine'
"let g:indentLine_char_list = ['|', '¦', '┆', '┊']
"let g:indentLine_char_list = ['¦', '┆', '┊']
let g:indentLine_char = '|'
let g:indentLine_showFirstIndentLevel = 1
let g:indentLine_color_term = 244
let g:indentLine_color_gui = '#708090'
let g:indentLine_fileTypeExclude = [
  \ 'markdown', 'help', 'nerdtree', 'calendar', 'thumbnail', 'tweetvim']
```

### markdownのテーブルの整形とかしたい

たとえばmarkdownでテーブル書いてる場合とかに見た目を整形したい場合、
`junegunn/vim-easy-align`使う。
基本的な使い方は、整形したい文字を選択して`ga*| `。最後の`|`は区切り文字。
より詳しい説明
[vim\-easy\-alignでvimmerへの道を極めよう \- Qiita](https://qiita.com/takuyanin/items/846cb2b3e541f79f0d54)

```vim
Plug 'junegunn/vim-easy-align'
" 使い方：`gaip#` or `vipga#` `#`は区切り文字
" Start interactive EasyAlign in visual mode (e.g. vipga)
xmap ga <Plug>(EasyAlign)
" Start interactive EasyAlign for a motion/text object (e.g. gaip)
nmap ga <Plug>(EasyAlign)
```