脱terapadの為のvim環境構築

#これは[Tokyo City University Advent Calendar 2019](https://adventar.org/calendars/4282) 6日目の記事だよ 
# 情報系の学科なのにまだterapadでコード書いてるんですか？
キャンパス内で開講されるプログラミング系の講義ごとで使われているテキストエディタを調べると(講義名は割愛)

|学年|学科|言語|エディタ|
|:-:|:-:|:-:|:-:|
|1|情報システム|C|terapad|
|1|情報システム|Java|IDE|
|2|情報システム|C++|terapad|
|2|情報システム|Java|IDE|
|3|情報システム|php+SQL|terapad|
|1|社会メディア|JS|terapad|
|1|社会メディア|JS|terapad|

とまぁこの通りほとんどの講義でソースコードをterapadで書いている．


講義のアシスタントをしていると「コンパイルが通らない理由がtypo」「スペースに全角が混じっている」みたいな理由で課題に苦戦する学生が多く，とてもかわいそう．



# 脱terapadの為のvim環境構築
## vimのある幸せな世界へ
~~情報系の学科なのにエディタが無改造terapadでは救済されないので~~vimを使ってコーディングすれば人生の悩みから解放されます．~~大学内で使えるパソコンには既にvimがインストールされており今日からでも使えるのですが、素のvimだといろいろ不便なので使いやすく改良してやろうというのが本記事の魂胆です．~~

最初は学内で使えるパソコン上でvimを便利に使えるようになるのを想定していたのですが，そこはgitもなければbashも使えない，想像を絶する~~ゴミ環境~~不便さだったので諦めました．自分はAndroid上で動く仮想Linuxターミナルみたいなものでこれらをやりましたがwin系ならおおよそ同じ手順でできると思います．Macは知りません．以下の作業はgit bashとかやると幸せかもしれません．


## :Tutorialをする（しなさい）
プロンプトおったててとりあえず`vim`とタイプしてvimを開きましょう（vimが入ってない場合は[kaoriya](https://www.kaoriya.net/software/vim/)とか`apt-get install vim`とかで拾って来てください）

![hoge](https://imgur.com/diMSjtX.png)

なんかでてきましたね．

続いて`:Tutorial`とタイプしましょう
![tutorial](https://i.imgur.com/qbSkClH.png) 

なんか始まりました．これはチュートリアルです，~~記事内でチュートリアルを書くのが面倒なので~~20分で終わるのでこれをしてください，というかこの記事は環境構築がメインなので細かい使い方とかは各自ググってください．


## 信仰もまずは形から

vimは`.vimrc`というファイルにいろいろ書き込むことでどんな細かい設定も自分好みに変更することができます．
.vimrcファイルを作って以下のコードをコピペしてあげればとりあえず最低限どうにかなります．信仰もまずは形からです．

~~~
"エンコードの設定
set encoding=utf-8
set fileencodings=utf-8,iso-2022-jp,euc-jp,sjis
set fileformats=unix,dos,mac

"ファイルの設定
" バックアップファイルを作らない
set nobackup
" スワップファイルを作らない
set noswapfile
" 編集中のファイルが変更されたら自動で読み直す
set autoread
" バッファが編集中でもその他のファイルを開けるように
set hidden
" 入力中のコマンドをステータスに表示する
set showcmd

" 見た目系
" 行番号を表示
set number
" 現在の行を強調表示
set cursorline
" インデントはスマートインデント
set smartindent
" 括弧入力時の対応する括弧を表示
set showmatch
" ステータスラインを常に表示
set laststatus=2
" コマンドラインの補完
set wildmode=list:longest
" 折り返し時に表示行単位での移動できるようにする
nnoremap j gj
nnoremap k gk
" 構文ハイライトの有効化
syntax enable
"ビープを鳴らさない
set belloff=all
"右スクロールバーを非表示
set guioptions+=R
"コメントを読みやすくする
autocmd ColorScheme * highlight Comment ctermfg=3
"タブの設定
set tabstop=4
set expandtab
set shiftwidth=4

"最後のカーソル位置を記憶
augroup vimrcEx
    au BufRead * if line("'\'") > 0 && line("'\'") <= line("$") |
                \ exe "normal g`\"" | endif
augroup END

"操作系
"改行時の自動コメントアウトを無効化
autocmd FileType * setlocal formatoptions-=ro
"クリップボードから貼り付けができるようにする
set clipboard&
set clipboard^=unnamedplus
" 行末の1文字先までカーソルを移動できるように
set virtualedit=onemore

"検索系
"検索文字が小文字のとき、大文字小文字を区別しない
set ignorecase
"検索文字が大文字のとき、大文字小文字を区別する
set smartcase
"同期的な検索をする
set incsearch
"ファイルの最後まで検索したらファイルの先手王に戻る
set wrapscan
"検索語をハイライトする
set hlsearch
"ESCキー連打でハイライトを解除
nmap <Esc><Esc> :nohlsearch<CR><Esc>

~~~

.vimrcを再び読み込むと変更が反映されます．このコピペに気に入らない箇所があったらググって直してください．

# プラグインによる魂の浄化
上の変更はあくまでも**vimが元々持ってる機能の調整**でしかありません．なので**プラグイン**を入れてより便利にしましょう．
そのために，プラグインを管理するためのツール`dein.vim`をインストールします．
## プラグイン管理ツールdein.vimのDark Powerを授かる
`dein.vim`は
>Dark Powerを持つvim/Neovimプラグインマネージャ

です(公式readmeより翻訳)．これによって，欲しいプラグインが置いてあるgithubのレポジトリ名を書くだけでそのプラグインを自動的にvimに導入することが出来ます．

### インストール
まずはホームディレクトリに`.cache/vim`というディレクトリを作成し，そこにcurlでdein.vimのインストーラを持ってきます．

```
$ mkdir -p .cache\dein
$ cd .cache\dein
$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
$ sh ./installer.sh ~/.cache/dein
~~~

実行すると以下の文章が出てきます

```
"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=/c/Users/$HOME/.cache/dein/repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('/c/Users/$HOME/.cache/dein')
  call dein#begin('/c/Users/$HOME/.cache/dein')

  " Let dein manage dein
  " Required:
  call dein#add('/c/Users/$HOME/.cache/dein/repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here like this:
  "call dein#add('Shougo/neosnippet.vim')
  "call dein#add('Shougo/neosnippet-snippets')

  " 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

"End dein Scripts-------------------------

```

このコードを先ほどの.vimrcの末尾に加えて上げましょう．またこの時についでにインストールした`installer.sh`はrmしておきましょう．

### tomlファイルの設定
本来は.vimrcに欲しいプラグインをドコドコ書いてあげるだけでいいのですが，せっかくなので必要なプラグインを別ファイルにまとめ，そちらで管理できるようにしてあげましょう．`.cache/dein/`に`toml`という名前のディレクトリを作ってあげ，その中に`plugins.toml`と`plugins_lazy.toml`の二つファイルを作ってあげます．plugins.tomlはvimの起動と同時にファイルが読み込まれます．一方，lazyは起動よりやや遅延してロードが発生する仕組みを持っているので，例えばビジュアルモードの時にのみ読み込まれるプラグインなんかはこちらに書いたりします．よくわかんなかったら気にせず`plugins.toml`にプラグインを書いていけばいいと思います．

```
$ mkdir ./cache/dein/toml
$ cd ./cache/dein/toml
$ vim plugins.toml
$ vim plugins_lazy.toml
```
plugins.tomlファイルの方に欲しいプラグインを書いていきます．今回は例として，vim内でディレクトリを移動できるようになるプラグイン`VimFiler`，インデントを可視化する`indentLine`を入れてあげましょう．`hook_add=''''''`で囲った部分は.vimrcと同じようにプラグインが持つ変数を変更できます．
以下`plugins.toml`の中身

```
[[plugins]]
repo = 'Shougo/unite.vim'

[[plugins]]
repo = 'Shougo/vimfiler'

[plugins]]
repo = 'Yggdroot/indentLine'
hook_add = '''
    let g:indentLine_Char = '|'
'''
```

最後に`.vimrc`に先ほど追加した部分の一部書き換えます．数行追加して，最後の部分のコメントを外してやります．

```
"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=/c/Users/$HOME/.cache/dein/repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('/c/Users/$HOME/.cache/dein')
  call dein#begin('/c/Users/$HOME/.cache/dein')
" tomlファイルのディレクトリを変数に持たせる
  let g:rc_dir = expand('~/.cache/dein/toml')
  let s:toml = g:rc_dir . '/plugins.toml'
  let s:lazy_toml = g:rc_dir . '/plugins_lazy.toml'


  " Let dein manage dein
  " Required:
  call dein#add('/c/Users/$HOME/.cache/dein/repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here like this:
  "call dein#add('Shougo/neosnippet.vim')
  "call dein#add('Shougo/neosnippet-snippets')

   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

"End dein Scripts-------------------------
```
書き終えてあと一度.vimrcを閉じ，再び開くとプラグインのインストールが自動で始まります．VimFilerがどんなものかはググってね．

# これであなたもvimによって救われた
# おわり

[都市大アドカレ2019](https://adventar.org/calendars/4282)の6日目記事ということで書いたけど，新規性なことは全くないので多分これまでの中でも一番内容がゆるゆるなんじゃないでしょうか．本当は学内PCでこれらをやろうとしたけどgitもなければbashもない，それらを導入しても起動のたびにパスがなくなってしまう．そんな不便なもん使うんじゃねぇ！ということで諦めました．B4生にはあるまじきょゎょゎ記事なのですが備忘録のついで残す次第でありました．

明日は[うちのかわいい学科の後輩ちゃん](https://adventar.org/users/27641)の担当です．