vim 環境

# ◎ 概要
```text
gvim を使っていて便利だと思うものを記事します。
gvim をこれから使ってみよう！という人の参考になれば。
lightline と cica フォントと vim-devicons を入れるだけで、なんとなくかっこいい感じになります。
gvim じゃなくて nvim 使う場合でも多少は参考になるのでは、と思います。
```

---

![Screenshot from 2020-04-25 19-14-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221128/3bbf6208-49bf-23b7-f874-0bb56b07f91d.png)


---
# ◎ プラグイン
|プラグイン|URL|概要|
|:--|:--|:--|
|プラグイン管理|[dein](https://github.com/Shougo/dein.vim)|NeoBundle でも良いし他のパッケージ管理でも良い。最近メジャーなのが dein.vim|
|非同期処理|[vimproc](https://github.com/Shougo/vimproc.vim)|取り敢えず入れておく。いろんなプラグインで使用する。|
|VIM Shell|[vimshell](https://github.com/Shougo/vimshell.vim)|取り敢えず入れておく。いろんなプラグインで使用する。|
|インクリメンタル検索|[fzf.vim](https://github.com/junegunn/fzf.vim)|最近流行りの fzf で vim をモダンに使う。|
|統合ユーザインターフェース|[Unite](https://github.com/Shougo/unite.vim)|色々な機能のインターフェースとして使用する。|
|フォント|[プログラミング用日本語等幅フォント Cica](https://github.com/miiton/Cica)|プログラミング用フォントなので単純に見やすいのでお薦め。|
|ステータスライン|[Lightline](https://github.com/itchyny/lightline.vim)|ステータスラインをきらびやかにする。|
|アイコン|[devicons](https://github.com/ryanoasis/vim-devicons)|アイコンを表示する。|
|カラースキーム|[morokai](https://github.com/tomasr/molokai)|カラースキーム「morokai」|
|フルスクリーン|[vullScreen](https://github.com/KabbAmine/vullScreen.vim)|フルスクリーン表示する。|
|インデントをハイライトする|[vim-indent-guides](https://github.com/nathanaelkane/vim-indent-guides)|インデントを可視化する。|
|git ラッパープラグイン|[vim-fugitive](https://github.com/tpope/vim-fugitive)|git のラッパー|
|git 変更行視覚化|[vim-gitgutter](https://github.com/airblade/vim-gitgutter)|git の変更点を表示する。|
|非同期コードチェック|[ALE](https://github.com/dense-analysis/ale)|シンタックスチェックツール|
|括弧自動補完|[lexima](https://github.com/cohama/lexima.vim)|括弧を自動で保管する。|
|TOML|[vim-toml](https://github.com/cespare/vim-toml)|TOML のシンタックスハイライトする。|
|PHP 用補完|[neocomplete-php](https://github.com/violetyk/neocomplete-php.vim)|PHP の関数名や変数の補完する。|
|HTML|[emmet-vim](https://github.com/mattn/emmet-vim)|HTML のシンタックスと補完をする。|
|Snippets|[neosnippet](https://github.com/Shougo/neosnippet.vim)|スニペットを管理する|
|Snippets|[neosnippet-snippets](https://github.com/Shougo/neosnippet-snippets)|スニペットを管理する。|
|Ref|[vim-ref](https://github.com/thinca/vim-ref)|PHP Manual を表示する為に使用する。|
|置換|[traces.vim](https://github.com/markonm/traces.vim)|結果を確認してから置換する。|
|C 言語用コンパイラとの連携|[vim-clang](https://github.com/justmao945/vim-clang)|C 言語、C++ の補完をする為に使用する。|
|Python 用補完|[jedi-vim](https://github.com/davidhalter/jedi-vim)|Python の関数名や変数の補完する。|
|チートシート|[vim-cheatsheet](https://github.com/reireias/vim-cheatsheet)|チートシートを表示する為のプラグイン。|
|メモ|[memolist.vim](https://github.com/glidenote/memolist.vim)|メモを作成する為のプラグイン。|
|ワークスペース|[vim-workspace](https://github.com/thaerkh/vim-workspace)|セッションの状態をワークスペースとして保存し、次に vim を起動した際に前回のウィンドウの状態を再現する。|
|自動実行|[vim-quickrun](https://github.com/thinca/vim-quickrun)|バッファ上のプログラムを実行する。|

---
# ◎ Cheat Sheet

## ▽ Aliaces
> ※ プラグインのインストールと設定が必要

|コマンド|説明|
|:--|:--|
|`:Uu`|Unite buffer|
|`:Ub`|Unite bookmark|
|`:Uf`|Unite file|
|`:Uc`|Unite file （現在開いているファイルのディレクトリ）|
|`:Cl`|閉じる|
|`:Ss`|ウィンドウ分割（横）|
|`:Sv`|ウィンドウ分割（縦）|
|`:Rt`|Twitter タイムラインリフレッシュ|
|`:Pm`|PHP Manual 表示|

## ▽ Keymap
> ※ プラグインのインストールと設定が必要

|コマンド|説明|
|:--|:--|
|`<silent> tc`|新規タブページ|
|`<silent> tn`|次のタブページに移動|
|`<silent> tp`|前のタブページに移動|

## ▽ プラグインコマンド
> ※ 設定が必要

|コマンド|説明|
|:--|:--|
|`:Files`|FZF files ファイル全文検索|
|`:%s;<検索文字列>;<置換文字列>;`|結果を確認してから置換する|
|`:PosttoTwitter`               |Twitter に POST する|
|`:FriendsTwitter`              |Twitter のタイムラインを表示する|
|`:VullScreen`                  |フルスクリーン化|
|`:HonyakuEJ`                   |翻訳（英語⇒日本語 Translate）|
|`:HonyakuJE`                   |翻訳（日本語⇒英語 Translate）|
|`:Gwrite`                      |Git ステージにする|
|`:Gcommit`                     |Git コミット|
|`:Gpush`                       |Git push|
|`:Gpull`                       |Git pull|
|`:Gblame`                      |Git blame|
|`:vertical diffsplit ＜ファイル＞`|現在開いているファイルと指定したファイルで比較する|

## ▽ vim オプション

|コマンド|説明|
|:--|:--|
|`vim -O2 file1 file2`|垂直分割で開く|
|`vim -o2 file1 file2`|水平分割開く|
|`vim +/gorilla file` |検索かけた状態でファイル開く|
|`vim -R file`        |読み取り専用状態でファイルを開く|
|`vim -d file1  file2`|差分確認|
|`vim -b gorilla.bin` |バイナリ編集（開いた後に :%!xxd）|

## ▽ その他
|コマンド|説明|
|:--|:--|
|`Control + Insert`|クリップボードにコピー|
|`Shift + Insert`|クリップボードからペースト|



---
# ◎ パッケージ管理
> プラグインをパッケージ管理をします。

## ▽ dein.vim インストール
```sh
mkdir -p $HOME/.cache/dein && cd $_;
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh;
sh ./installer.sh $HOME/.cache/dein;
```

## ▽ dein.vim セットアップ

### dein.vim 自体の設定
```toml
"===============================================================================
" dein.vim
"===============================================================================
if &compatible
	set nocompatible               " Be iMproved
endif
" Required:
set runtimepath+=$HOME/.cache/dein/repos/github.com/Shougo/dein.vim
" Required:
if dein#load_state('$HOME/.cache/dein')
	call dein#begin('$HOME/.cache/dein')
	" Let dein manage dein
	" Required:
	call dein#add('$HOME/.cache/dein/repos/github.com/Shougo/dein.vim')
	"-- tomi settings
	let s:toml_dir  = $HOME . '/.vim/rc'
	let s:toml      = s:toml_dir . '/dein.toml'
	let s:lazy_toml = s:toml_dir . '/dein_lazy.toml'
	call dein#load_toml(s:toml,      {'lazy': 0})
	call dein#load_toml(s:lazy_toml, {'lazy': 1})
	" Required:
	call dein#end()
	call dein#save_state()
endif
" Required:
filetype plugin indent on
syntax enable
" If you want to install not installed plugins on startup.
if dein#check_install()
	call dein#install()
endif
let s:removed_plugins = dein#check_clean()
if len(s:removed_plugins) > 0
	call map(s:removed_plugins, "delete(v:val, 'rf')")
	call dein#recache_runtimepath()
endif
"===============================================================================
```

### dein.vim 用ディレクトリ作成
```sh
mkdir -p $HOME/.vim/rc;
```

### dein.vimで管理するプラグインの設定
- $HOME/.vim/rc/dein.toml に記載する
- 参考：[Git/dein.toml](https://lab.crats.co.jp/gitlab/uchiyama/vim/blob/master/dein.toml)



---
# ◎ 開発環境構築
> vim で開発環境を整えます。
> dein で各プラグインのインストールと設定を行います。

## ▽ リンター
```toml
[[plugins]]
repo = 'w0rp/ale'
hook_add = '''
let g:ale_sign_column_always = 1
let g:ale_lint_on_enter = 1
let g:ale_set_loclist = 0
let g:ale_set_quickfix = 1
let g:ale_open_list = 1
let g:ale_keep_list_window_open = 0
let g:ale_sign_error = 'E'
let g:ale_sign_warning = 'W'
let g:ale_echo_msg_error_str = 'E'
let g:ale_echo_msg_warning_str = 'W'
let g:ale_echo_msg_format = '[%linter%] %code: %%s [%severity%]'
'''
```

## ▽ インデント設定
```toml
[[plugins]]
repo = 'nathanaelkane/vim-indent-guides'
hook_add = '''
let g:indent_guides_enable_on_vim_startup = 1
let g:indent_guides_start_level = 1
let g:indent_guides_guide_size = 1
'''
```

## ▽ スニペット
```toml
[[plugins]]
repo = 'Shougo/neosnippet'
hook_add = '''
imap <C-k>     <Plug>(neosnippet_expand_or_jump)
smap <C-k>     <Plug>(neosnippet_expand_or_jump)
'''
[[plugins]]
repo = 'Shougo/neosnippet-snippets'
hook_add = '''
let g:neosnippet#snippets_directory = [
\	$HOME . '/.cache/dein/repos/github.com/Shougo/neosnippet-snippets/neosnippets/',
\	$HOME . '/.vim/snippets/',
\]
'''
```

## ▽ タブ補完
```toml
[[plugins]]
repo = 'ervandew/supertab'
```

## ▽ 補完
```toml
[[plugins]]
repo = 'Shougo/neocomplete.vim'
hook_add = '''
let g:neocomplete#enable_at_startup = 1
let g:neocomplete#sources#syntax#min_keyword_length = 3
'''
```

## ▽ 自動実行
```toml
[[plugins]]
repo = 'thinca/vim-quickrun'
hook_add = '''
let g:quickrun_no_default_key_mappings = 1
let g:quickrun_config = {
\	"_" : {
	\	'runner'                    : 'vimproc',
	\	'runner/vimproc/updatetime' : 40,
	\	'outputter'                 : 'error',
	\	'outputter/error/success'   : 'buffer',
	\	'outputter/error/error'     : 'quickfix',
	\	'outputter/buffer/split'    : ':botright 8sp',
	\}
\}
'''
```




---
## ▼ PHP

### プラグインのインストール
```toml
#===============================================================================
# PHP Plugins
#===============================================================================
#-- 補完（PHP 用）
[[plugins]]
repo = 'violetyk/neocomplete-php.vim'
hook_add = '''
let g:neocomplete_php_locale = 'ja'
'''
#-------------------------------------------------------------------------------
#-- HTML
[[plugins]]
repo = 'mattn/emmet-vim'
#-------------------------------------------------------------------------------
#-- Ref
[[plugins]]
repo = 'thinca/vim-ref'
hook_add = '''
let g:ref_phpmanual_path = $HOME . '/.vim/php/php-chunked-xhtml'
'''
#-------------------------------------------------------------------------------
```

### PHP マニュアルを vim から参照できるようにする

#### マニュアルの用意
```sh
mkdir -p $HOME/.vim/php && cd $_;
wget http://jp2.php.net/get/php_manual_en.tar.gz/from/jp.php.net/mirror;
tar zxvf php_manual_en.tar.gz
```

#### テキストブラウザのインストール
```sh
sudo apt install lynx;
```

#### 使い方
```
:Ref phpmanual var_dump
```

### 補完（PHP）
> neocomplete.vim に以下設定を追加

```toml
let g:neocomplete_php_locale = 'ja'
```

### リンター設定
> ALE に以下設定を追加

```toml
let g:ale_linters = {
\	'php': ['phpcs','php','phpmd'],
\}
```

## ▼ C/C++

### プラグインのインストール
```toml
#===============================================================================
# C Language Plugins
#===============================================================================
[[plugins]]
repo = 'justmao945/vim-clang'
hook_add = '''
let g:clang_auto = 0
let g:clang_complete_auto = 0
let g:clang_auto_select = 0
let g:clang_use_library = 1
let g:clang_c_completeopt   = 'menuone'
let g:clang_cpp_completeopt = 'menuone'
let g:clang_exec = 'clang'
let g:clang_format_exec = 'clang-format'
let g:clang_c_options = '-std=c11'
let g:clang_cpp_options = '-std=c++1z -stdlib=libc++ -pedantic-errors'
'''
```

### 補完（C）

#### neocomplete.vim に以下設定を追加
```toml
if !exists('g:neocomplete#force_omni_input_patterns')
	let g:neocomplete#force_omni_input_patterns = {}
endif
let g:neocomplete#force_overwrite_completefunc = 1
let g:neocomplete#force_omni_input_patterns.c = '[^.[:digit:] *\t]\%(\.\|->\)'
let g:neocomplete#force_omni_input_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\|\h\w*::'
```

#### コンパイラやフォーマッタのインストール
```sh
sudo apt install clang clang-format
```

## ▼ Python

### プラグインのインストール
```toml
#===============================================================================
# Python Plugins
#===============================================================================
[[plugins]]
repo = 'davidhalter/jedi-vim'
on_ft = 'python'
#-------------------------------------------------------------------------------
```

### 補完（Python）

#### neocomplete.vim に以下設定を追加
```toml
autocmd FileType python setlocal omnifunc=jedi#completions
let g:jedi#auto_vim_configuration = 0
if !exists('g:neocomplete#force_omni_input_patterns')
	let g:neocomplete#force_omni_input_patterns = {}
endif
let g:neocomplete#force_omni_input_patterns.python = '\h\w*\|[^. \t]\.\w*'
```

#### jedi のインストール
```sh
cd $HOME/.cache/dein/repos/github.com/davidhalter/jedi-vim;
git submodule update --init;
```

### リンター設定

#### ALE に以下設定を追加
```toml
let g:ale_linters = {
\	'python': ['flake8', 'mypy'],
\}
```

#### Flake8 等のインストール
```sh
sudo apt install flake8
```

## ▼ JavaScript

### プラグインのインストール
```toml
#===============================================================================
# JavaScript Plugins
#===============================================================================
[[plugins]]
repo = 'billyvg/tigris.nvim'
on_ft = ['javascript', 'javascript.jsx']
hook_post_update = '''
	let g:dein#plugin.build = './install.sh'
'''
hook_add = '''
let g:tigris#enabled = 1
let g:tigris#on_the_fly_enabled = 1
'''
#-------------------------------------------------------------------------------
```

### リンター設定

#### ALE に以下設定を追加
```toml
let g:ale_linters = {
\	'javascript': ['standard'],
\}
```

#### standard のインストール
```sh
sudo apt install nodejs;
sudo apt install npm;
sudo npm install standard --global;
```