vim色に染まれ．機能紹介のついでにbashをvi仕様に．

vim色に染まれ
============================
vim色って何なんだろうね？

環境
-----------

- lenovo-S21e
- ubuntu16.04LST
- vimにプラグインは入れたくない派


目的
=====================
vimは素晴らしいエディター

秘められた可能性が大きすぎるため，
デフォルトの機能ですら使いこなすのが難しい．

また，bashをvi仕様にする記事が意外と少ない．

そこで，あんまり紹介されていない系の便利（？）機能と愚痴の数々を紹介したい．


(´・ω・｀) < 紹介されてないってことは常識？

(´・ω・｀) < つまり最近まで知らなかった(´・ω・｀)は常識人ではなかった？．．．

(´；ω；｀) < ｳｯ… ぼやいてばっかだし．．．

vim以外でも使えるものもいっぱいあるので．


1. おすすめ編
	- bashをvi仕様に
	- bashの画面をウィンドウに(new)
		- vimを8.0にアップデート
	- 代替できるキー編(update)
		- ESCはいらない子 		→`ctrl-[`
		- BSはいらない子 		→ `ctrl-h`
		- Tabキーはいらない子 		→ `ctrl-i`
		- Enterはいらない子 		→ `ctrl-m`
		- 矢印キーはいらない子 		→ 意外と難しい
	- テンプレートを自動で読み込もう
	- undoやviminfo，バックアップをまとめて管理しよう
1. ここから先は有名どころ編
	- タグを使おう
	- ファイルへジャンプ
	- 別ウィンドウで開きたいとき
	- デフォルトの補完機能を上手に使おう
	- vimって実はファイラーでもあるんだよ
1. あったらいいな編
	- 欲しい機能


bashをvi仕様に set -o vi
=================

```bash
export EDITOR=vim
```

の設定をしているであろうか．
きちんと設定ファイルに書き込んでおこう．

そうでないと，gitとかのエディターがvim以外に設定されることがある．nanoとかemacsとか．

bashはデフォルトではemacsに似たキーバインドになっている．
一例はこんな感じ．

```
ctrl-f %次の文字へ
ctrl-b %前の文字へ

ctrl-a %先頭の文字へ
ctrl-e %末尾の文字へ

ctrl-p %前のコマンド履歴へ
ctrl-n %次のコマンド履歴へ

ctrl-k %カーソル位置から行末まで削除
ctrl-u %カーソル位置から行頭まで削除

ctrl-d %カーソル位置の文字を削除
ctrl-h %BSC
```


(´；ω；｀) < せっかく覚えたのにemacsのキーバインドだったとは．．．

しかし，この辺もしっかりvim仕様にしておきたい．

プラグインなど入れずとも， bash上で 

```bash
set -o vi
```

と叩くだけでよい．

~/.bashrcにでも書いておけば勝手に呼び出される．

ただし若干通常のvimと違う動作をするので，重要なところだけピックアップしておこう．



履歴の辿り方
-------------------------
bashのコマンドラインを，historyのように過去のコマンドが上に隠れているファイルと捉えると操作を捉えやすくなる．
つまりコマンドの履歴を辿りたければ，コマンドモードに入って上の行を見てやれば良い．

```
k %前のコマンド履歴へ
j %次のコマンド履歴へ
```

ただし，ctrl-eやctrl-y とかctrl-f, ctrl-b, ctrl-u, ctrl-dは使えない．
次で紹介するvisual modeでは使うことができる．

愚痴

(´・ω・｀) < vimのコマンド履歴はctrl-pやctrl-nで辿れるのになんで？

(´・ω・｀) < 補完機能のコマンドないんだから，空いてるやん．．．


コマンドラインでは，直接は使えないコマンド（実は使えるよ）
------------------
行内の移動に関するコマンドはほとんど使えるので，これだけでも十分便利だが使えないものがある．

```vim
ci"
```

とか，visual modeの選択系のコマンドだ．
ただし，

```vim
2cw
```

とかは使える．

糞だな思ったあなた，実はそんなことはない．
次で紹介する機能を使えば良い．


の前に，愚痴を

(´・ω・｀) < ci"とかvのコピペとか，見てわかるから便利なのに．．．

(´・ω・｀) < dt"とかcf}とかでギリ代用はできるけど．．．

(´；ω；｀) < 2cwとか数字で指定する系のコマンドは苦手なの．．．


visual modeでファイルとして開き編集できる
-------------------------

コマンドモードで__v__を押すと，
visual modeもとい，ファイルのように編集できるモードに切り替わる．

ここではbash scriptをファイルとして編集し，最後に`ZZ`や`:wq`で保存すると，
ファイルに書いたスクリプトが実行されるのだ．
もちろん，コマンド履歴（history）にも保存されるので安心だ．

vimの機能が存分に使える．


bashの画面をウィンドウに(new)
=====================

h_eastさんよりとっても有用な情報をいただきました．
ずっとできないと思ってたbashを横に開くという機能がデフォルトでありました．


```vim
:terminal
```

これでbashが別ウィンドウで開く．．．

と思いきや，ubuntuのvimのバージョンは7系だった．．．しかも，`apt update`にも入っていないよう．


cygwinで記事を書いてたから普通に使えたのに．．．cygwinのほうが進んでる？


まあいい，ubuntuにvim8.0をインストールしよう．


vim8.0にアップデート
----------------------

```bash
sudo add-apt-repository ppa:jonathonf/vim
sudo apt update
sudo apt upgrade
```

最後は`sudo apt install vim`でもよい．．．

- [How To Install Vim 8.0 On Ubuntu 16.04](https://itsfoss.com/vim-8-release-install/)
- [Vim 8.0 Released! How to install it in Ubuntu 16.04](http://tipsonubuntu.com/2016/09/13/vim-8-0-released-install-ubuntu-16-04/)


ppaが嫌なら，`git clone`で持ってきてもいいが．．．

- [既存のvimをluaオプション付きのvim8.0に入れ替える。](https://qiita.com/Fendo181/items/8a5545cd7550bd9a3c91)

(´・ω・｀) < ./configureとかmake installってアンインストールがめんどくさいんだよね．．．

(´・ω・｀) < checkinstallを使えばちょっとマシだけど．．．

(´・ω・｀) < w3mのコンパイルでドハマリしていい思い出がない．．．


すごよこれ
----------------

```vim
:terminal
```

だけだと上下に別れるから．

```
ctrl-w
H     % HJKLでそれぞれの方向にカーソルのあるウィンドウが行く
```

で左右分割にして右や左に寄せたりして．．．


ずっとvimの横にw3mの画面広げたいと思ってた．．．．

ありがとうvim．


(´・ω・｀) < w3mと相性抜群やな


仮想コンソールのfbterm上でインライン画像表示ができるように，必死こいた努力が報われるというもの．．．．

- [w3m（w3m-img）をfbterm対応にして，インライン画像表示．ついでにrangerのサムネイルも](https://qiita.com/Pseudonym/items/310bc76fdbdeca76b903)


(´；ω；｀) < と思ったらインライン画像表示ができないよ～

(´・ω・｀) < `echo $TERM`したらxterm-256colorsか．vimがTERMを書き換えてるのか？．．．

(´・ω・｀) < `export TERM=fbterm`

(´；ω；｀) < ｳｯ… 画像が侵略してきた．．．

代替できるキー編
===========
意外と表立って紹介されない代替できるキーをここで紹介しておこう．

もちろんほとんどが，vim以外でも使える．

vimに特化した全部のコマンドはここでまとめてくれている．

- [vimのnormal modeでctrlキーを使うキーマップ一覧](https://qiita.com/34ro/items/e20fa0831d78566981d3)
- [vimのinsert modeの全てのキーマップ一覧](https://qiita.com/34ro/items/6163f595785ae99a632a)

(´・ω・｀) < 本当に使わないのはaltキーだったり


ESC（エスケープキー）はいらない子
---------------

insert modeから抜けるのにESCキーを押すユーザーが存在すると思う．

今すぐにやめ，

```bash
ctrl-[
```

を使おう．
普通ESCキーは一番左上に配置されていると思う．
こんなホームポジションからかけ離れたキーなんて押していられない．

ちなみに

```bash
ctrl-c
```

でも似た動作をするが，微妙に動作が違うので`ctrl-[`を使うようにしたい．
また，キーマッピングで他のキーに割り当ててもよい．

BS（バックスペースキー）はいらない子
---------------
insert modeで左の文字を消したいとき，BSを押すユーザーが存在すると思う．

今すぐにやめ，

```vim
ctrl-h
```

を使おう．

普通BSキーは右上に配置されていると思う．
こんなホームポジションからかけ離れたキーなんて押していられない．

ちなみにctrl-hになれると，他のソフトでもこれで文字を消そうとしてしまう．
ソフトによってはHELPが表示され鬱陶しいことこの上ない．

(´・ω・｀) < そんなにHELPを開いて欲しいのか．．．

(´；ω；｀) < 苦労して書いたんだろうな．．．


###AutoHotKey


Windowsを使っているのなら，AutoHotKeyを使おう．

AutoHotKeyをインストールし設定ファイルを作ろう．

```autohotkey
^h::Send {Backspace}
```

これで煩わしさから開放される．

調子にのって他のソフトでもvimっぽい動作をさせようと，ゴリゴリ書いていると，
本当のvimの動作がおかしくなるのでほどほどにね．

以下で紹介するキーたちは登録し直してもいいかもしれない．

特に，`ctrl-m`は変換決定には使えるけど，検索とかには使えなかったので．(Windowsの場合)



Tabキーはいらない子
---------------
tabキーはさほど押すのに苦労しないが，
あえて

```bash
ctrl-i
```

で代用しよう．

意外と便利だったり？

（行の先頭に挿入の__I__と併用することが多いので，紛らわしかったり．．．）


Enterはいらない子
---------------------

enterキーを押すのはいつだろうか

- 改行？
- 変換決定？

指に染み付いていてなかなか改善するのは難しいが，どちらであってもenterキーは代替できる


```bash
ctrl-m
```

###改行

通常インサートモードで改行すると思う

```bash
ctrl-m
```

もしくは

```bash
ctrl-j
```

で代替していこう．お薦めは`ctrl-m`次の日本語変換の決定でも使えるからね．
これからは`ctrl-m`で改行しよう．

###変換決定

日本語の変換決定にenterキーを__ッターンッ__ってするのは常識．

でも，実はなんとかなったりする．

1. 変換候補を選び終わったら，enterを押さず次の文字を打ち始める
1. 直接入力モードに戻る．(uimだと上手くいかないので，注意)
1. `ctrl-m`を押す．

これで変換決定が可能だ．

3つを上手く使い分けるのがよいが，`ctrl-m`onlyでもいいと思う．

- [CTRL + M ってリターンキー (エンターキー) なんだ](http://sonic64.com/2005-02-16.html)

矢印キーはいらない子
---------------------
ついつい矢印キーに手が伸びるのはよくあることだ．
のわりにホームポジションからめっちゃ離れているからなんとかしたい．

特に，insert modeでちょっと左に戻りたいとかいうとき．
今のところ，`ctrl-h`か一回ノーマルモードに戻るかしている．


ただ，使う場面が多いので，いつ使っているかを調査し，各自対応を考えるのがよい．


(´・ω・｀)の場合は，uim-anthyとuim-fepを使っているので，
変換候補の選択や，区切りの変更は矢印キーを使わないでできる．

- [uim-fepとuim-anthyの使い方と設定方法](https://qiita.com/Pseudonym/items/9ff0e9028dfd6bad5958)

(´・ω・｀) < fbtermかuimで動くmozcが欲しいな．

テンプレートを自動で読み込む
===================

とっても重要なコレを書き忘れてた．

例えば
- C言語でプログラミングしたい．
- TeXで原稿を書きたい．
- Beamerでスライド作りたい
- Makefile書きたい
などなどしたいとき，自分用のテンプレートが勝手に呼び出されると便利だ．

そんな機能は当然vimに備わっている．__デフォルトで__．


vimではテンプレートを登録し，ファイル名で（拡張子での判断も可能）テンプレートを自動で読み込んでくれる機能がついている．

例えば，C言語で次のようなテンプレート__c.c__を用意したとする．

```c:c.c
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char* argv[]){

	return 0;
}
```

これを適当な場所（ここでは~/Templetes/）に置いておいたとする．

~/.vimrcに次のように書いておくと，`.c`という拡張子のファイルが作成されたとき，
このテンプレートをあらかじめ書き込んだ状態でファイルを作ってくれる．

```vim:~/.vimrc
autocmd BufNewFile *.c 0r ~/Templates/c.c.
```

ちなみに (´・ω・｀) の場合はこんな感じ．

```vim:~/.vimrc
autocmd BufNewFile *.sh 0r ~/Templates/shell.sh
autocmd BufNewFile *.bash 0r ~/Templates/bash.bash
autocmd BufNewFile *.c 0r ~/Templates/c.c
autocmd BufNewFile *.cpp 0r ~/Templates/cplusplus.cpp
autocmd BufNewFile *.cc 0r ~/Templates/cplusplus.cpp
autocmd BufNewFile *.tex 0r ~/Templates/tex.tex
autocmd BufNewFile beamer.tex 0r ~/Templates/beamer.tex
autocmd BufNewFile Makefile 0r ~/Templates/Makefile
```

なんとなく何をしているかわかるだろう．

pythonとかbashだと，シェバンを書くのが面倒だし，TeXなんてもっと面倒だから便利だよ．

templateを`cp`する手間もいらない．
ファイルを作るだけでいいんだから．

undoやviminfo，バックアップをまとめて管理しよう．
==========================
- undoファイルがその場に作成されて面倒．
- いるんだけどそこにあるのは邪魔なんだよね．
- バックアップいらない．あるいは，欲しい
というときは

undo
-------------
~/.vimrcに

```vim:~/.vimrc
set undofile
set undodir=~/.vim/undo
```

とでも書いておいて，

```bash
mkdir ~/.vim/undo
```

としておけばそこにundoファイルを置いてくれる．
その場に作られないので便利．

viminfo
--------------
viminfoも同様に

```vim:~/.vimrc
set viminfo+='1000,\"1000,s1000,:1000,n~/.vim/viminfo
```

こんな感じにしておけばそこに.viminfoファイルを作ってくれる．


ちなみに，この解釈の仕方は，
- フラグ（'，\，s，:，n　などなど）と設定（1000とか~/.vim/vininfoとか）で一組
- コンマ区切りで条件を足すことができる．但し，nフラグは一番最後に設定しないといけない．
- 詳しくはここに解説がある ['viminfo' - VimWiki](http://vimwiki.net/?%27viminfo%27)

バックアップ（～チルダのついたファイルね）
----------------------
バックアップファイルについては．

(´・ω・｀) < 紛らわしいし，ファイル整理の邪魔になるし．．．

(´・ω・｀) < 気になるから確認しちゃうし，diff取ってみちゃうし．．．

(´・ω・｀) < ろくな思い出がないっす

```
set nobackup
```
で消せる．

この機能を使いたいなら．

```vim:~/.vimrc
set backupdir=~/.vim/backup
```

とでもしてまとめておこう．

まれに必要になることがあるかもしれない．

番外編swap
----------------

swapファイルについては．．．

(´・ω・｀) < swapファイルってたまに手動で消さないといけないんだよね．．．

(´・ω・｀) < だから，カレントディレクトリにあったほうが便利．見てわかるし．


タグを使おう
==================

```bash
ctags -R
```

もしくは

```bash
ctags -R *
```

で，そのディレクトリ以下のファイルをたどり，tagsファイルを作成してくれる．

```vim
:set tags=./tags
```

とかでタグをセットすると，そのタグが使えるようになる．

また，~/.vimrcに 

```vim
set tags=./tags;,tags;
```

とか書いておくと，その場所にあれば自動で読み込んでくれる．

h_eastさんより，お薦めの設定を紹介していただきました．

[ctagsで-Rを使っても再帰的にタグが作られない](https://ja.stackoverflow.com/questions/30705/ctags%E3%81%A7-r%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%82%E5%86%8D%E5%B8%B0%E7%9A%84%E3%81%AB%E3%82%BF%E3%82%B0%E3%81%8C%E4%BD%9C%E3%82%89%E3%82%8C%E3%81%AA%E3%81%84)



タグジャンプで縦横無尽に飛び回れ
-------------

```vim
ctrl-]
```

これで，タグにひもづけられた場所へジャンプできる．

複数の候補がある場合は

```vim
g ctrl-]
```

で，複数の候補の中から選択できるようになる．

```vim
<number> ctrl-]
```

でも代用可能．

戻るときは

```vim
ctrl-t
```

だ．

特にこのコマンドは，

```vim
ctrl-o
ctrl-i
```

としっかり区別して使った方が，思わぬ移動を防げる．

ちなみに

```vim
ctrl-o
```

は移動する前にいた位置に戻る．

```vim
ctrl-i
```

はctrl-o に対するredo



ファイルへジャンプ
===========================

```vim
gf
```

go to fileっていう意味だろう．
カーソルのある場所のファイルを開く．
ヘッダファイルとかだと，あらかじめパスが通って入れば，
ヘッダファイルを開いてくれる．

もちろん，ヘッダファイルだけでなく，shell scriptでかかれたパスとかにも移動できる．
別の設定ファイルへのジャンプに便利だったり．


別ウィンドウで開きたいとき
===========================

これが一番紹介したかった機能．

```vim
ctrl-w
```

これはウィンドウの操作に関連するコマンドで欲使われる．
これのすごいところは，他のコマンドとガンガン並用可能なところ．

例えば，

```vim
ctrl-w ctrl-]
ctrl-w gf
```

これ以外にも色々使える．

ちなみにデフォルトでは横分割．

デフォルトの補完機能を上手に使おう
==================

補完候補を常に表示させる．
----------------------

いやこれめちゃくちゃ便利．

チーズバーガー中毒: Vimで入力補完を常にオンにするvimrc[http://io-fia.blogspot.jp/2012/11/vimvimrc.html]

~/.vimrcに次のものを書き足そう．

```vim:~/.vimrc
set completeopt=menuone
for k in split("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_",'\zs')
  exec "imap " . k . " " . k . "<C-N><C-P>"
endfor

imap <expr> <TAB> pumvisible() ? "\<Down>" : "\<Tab>"
```

インクルードファイルが多くて検索が遅くなる時は，候補の検索開始の文字数を増やすとよい．（3文字とか）

あるいは，この機能をオフにして下の`ctrl-x`系の補完を使おう．

但し，cygwinでOpenCVを

```c
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
```

とかすると，めっちゃ遅かった．

```c
#include<opencv2/opencv.hpp>
```

こんなんにした時には．．．

通常の補完
-------------------

```vim
ctrl-p
ctrl-n
```

これで補完を行う．
隣でwindowを開いていたりすると，そこのファイルからも補完を行えるようになる．

タブはどうだったかな？

特定の補完を行う
------------------------

### ファイルパス補完

```vim
ctrl-x f
```

こいつの欠点は，

```bash
PATH=/usr/local/
```

とか入力したいときに現れる．
入力したいパスの前に=があると補完に失敗する．

これはPATH=もパスとして認識されているからだそうだ．

愚痴

(´・ω・｀) < マジ，めんどくさす

このせいでMakefileとかbash scriptとか書くとき，
すんごく面倒くさい．

対応策として，

```bash
"path"
```

のように"で囲んだり，一回改行してJやgJで詰めたりしている．

あるいは

```bash
PATH= /usr/local
```

のように，一度スペースを開けて最後に消す，というのもあり．

__ただし，bashの場合=の前後にスペースが有るとまずいので，消し忘れに注意．__


野蛮な解決法として，=をifsnameから抜くのもありだが，副作用が怖いのでやめときます．

```vim:~/.vimrc
set isfname-==
```



h_eastさんよりctrl-x fのパス補完に関する情報をいただき，更新しました．(2017/11/29)


### 行補完

```vim
ctrl-x l
```

意外と便利．

### パスパターン補完

```vim
ctrl-x i
```

インクルードファイルやインポートしたファイルとかから補完を行うモード


### タグ補完

```vim
ctrl-x ]
```

タグジャンプが ctrl-] だから連想しやすい．

（実は知らなくてあんまり使っていなかったことは秘密）

### 定義もしくはマクロ補完

```vim
ctrl-x d
```

あんまり使わないな．

### vimのコマンドライン補完

```vim
ctrl-x v
```


### その他の補完

- オムニ補完
- ユーザー定義補完
- スペリング補完

などなどあるが，別途ファイルを作る必要があるなど，ちと面倒なので使っていない．
使えば便利なんだろうけどねえ．


vimって実はファイラーでもあるんだよ
===========================

vimは簡易ファイラーとしても使える．
開き方は簡単で，

```bash
vim <directory>
```

と指定すれば良い．
current directoryを開きたければ．

```bash
vim ./
```

だ．
基本的な操作方法やヘルプへの入り方は，起動した時上の方に書かれている．

__ranger__ほど高機能ではないが，__:sp__や__:vs__とかと組み合わせて，別ウィンドウでディレクトリが見れる．

まあ，プラグインを入れればできることなんだけれど，デフォルトでも似たことは可能であるという意味で紹介したかった．

ウィンドウ系のコマンドと併用して他画面ファイラーとして使えたりするが，いかんせん機能がしょぼいのが難点．


欲しい機能
===============
今のvimだと，:shでbashに入れるけど，
全画面でしか入れない．

vimの隣のウィンドウだけbashにするとかできないのかな．．．．もちろん，プラグインは無しで
--------------------
__できました__

ただしvim8.0以降

非常に有用なので，上に上げておきます．


gitとの連携が簡単にできたらいいな．．．
--------------

__もちろん，プラグインは無しで．__

現在のところ，単なるクラウドドライブ扱いになっており，gitの意味がない．

```vim
:w |! git commit -am "great update by me"; git push origin master
```

このコマンドをctrl-pでちょちょっと探して実行．



[参考文献]
===============
- [yamazakiccs--のもっさもさ感がたまらないブログ bash vi 最強ですね、わかります。](http://d.hatena.ne.jp/yamazakiccs/20081207/1216817670)
- [Bashのコンソールで単語移動するショートカット](https://qiita.com/odacoh/items/b94be0deecaaa27b0263)
- [チーズバーガー中毒: Vimで入力補完を常にオンにするvimrc](http://io-fia.blogspot.jp/2012/11/vimvimrc.html)
- [WindowsでVimが勝手に作成する4つのファイルを作成されないようにするには。](http://momoiro-tj.hateblo.jp/entry/2016/04/11/190000)
- [How To Install Vim 8.0 On Ubuntu 16.04](https://itsfoss.com/vim-8-release-install/)
- [Vim 8.0 Released! How to install it in Ubuntu 16.04](http://tipsonubuntu.com/2016/09/13/vim-8-0-released-install-ubuntu-16-04/)
- [既存のvimをluaオプション付きのvim8.0に入れ替える。](https://qiita.com/Fendo181/items/8a5545cd7550bd9a3c91)
- ['viminfo' - VimWiki](http://vimwiki.net/?%27viminfo%27)
- [vimのnormal modeでctrlキーを使うキーマップ一覧](https://qiita.com/34ro/items/e20fa0831d78566981d3)
- [vimのinsert modeの全てのキーマップ一覧](https://qiita.com/34ro/items/6163f595785ae99a632a)
- [CTRL + M ってリターンキー (エンターキー) なんだ](http://sonic64.com/2005-02-16.html)