Vim
Bash

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,バックアップをまとめて管理しよう
  2. ここから先は有名どころ編
    • タグを使おう
    • ファイルへジャンプ
    • 別ウィンドウで開きたいとき
    • デフォルトの補完機能を上手に使おう
    • vimって実はファイラーでもあるんだよ
  3. あったらいいな編
    • 欲しい機能

bashをvi仕様に set -o vi

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上で

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で辿れるのになんで?

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

コマンドラインでは,直接は使えないコマンド(実は使えるよ)

行内の移動に関するコマンドはほとんど使えるので,これだけでも十分便利だが使えないものがある.

ci"

とか,visual modeの選択系のコマンドだ.
ただし,

2cw

とかは使える.

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

の前に,愚痴を

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

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

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

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

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

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

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

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

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

:terminal

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

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

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

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

vim8.0にアップデート

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

最後はsudo apt install vimでもよい...

ppaが嫌なら,git cloneで持ってきてもいいが...

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

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

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

すごよこれ

:terminal

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

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

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

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

ありがとうvim.

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

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

(´;ω;`) < と思ったらインライン画像表示ができないよ~

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

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

(´;ω;`) < ウッ… 画像が侵略してきた...

代替できるキー編

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

もちろんほとんどが,vim以外でも使える.

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

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

ESC(エスケープキー)はいらない子

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

今すぐにやめ,

ctrl-[

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

ちなみに

ctrl-c

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

BS(バックスペースキー)はいらない子

insert modeで左の文字を消したいとき,BSを押すユーザーが存在すると思う.

今すぐにやめ,

ctrl-h

を使おう.

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

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

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

(´;ω;`) < 苦労して書いたんだろうな...

AutoHotKey

Windowsを使っているのなら,AutoHotKeyを使おう.

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

^h::Send {Backspace}

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

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

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

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

Tabキーはいらない子

tabキーはさほど押すのに苦労しないが,
あえて

ctrl-i

で代用しよう.

意外と便利だったり?

(行の先頭に挿入のIと併用することが多いので,紛らわしかったり...)

Enterはいらない子

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

  • 改行?
  • 変換決定?

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

ctrl-m

改行

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

ctrl-m

もしくは

ctrl-j

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

変換決定

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

でも,実はなんとかなったりする.

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

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

3つを上手く使い分けるのがよいが,ctrl-monlyでもいいと思う.

矢印キーはいらない子

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

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

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

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

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

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

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

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

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

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

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

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

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

    return 0;
}

これを適当な場所(ここでは~/Templetes/)に置いておいたとする.

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

~/.vimrc
autocmd BufNewFile *.c 0r ~/Templates/c.c.

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

~/.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に

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

とでも書いておいて,

mkdir ~/.vim/undo

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

viminfo

viminfoも同様に

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

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

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

バックアップ(~チルダのついたファイルね)

バックアップファイルについては.

(´・ω・`) < 紛らわしいし,ファイル整理の邪魔になるし...

(´・ω・`) < 気になるから確認しちゃうし,diff取ってみちゃうし...

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

set nobackup

で消せる.

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

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

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

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

番外編swap

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

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

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

タグを使おう

ctags -R

もしくは

ctags -R *

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

:set tags=./tags

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

また,~/.vimrcに

set tags=./tags;,tags;

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

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

ctagsで-Rを使っても再帰的にタグが作られない

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

ctrl-]

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

複数の候補がある場合は

g ctrl-]

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

<number> ctrl-]

でも代用可能.

戻るときは

ctrl-t

だ.

特にこのコマンドは,

ctrl-o
ctrl-i

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

ちなみに

ctrl-o

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

ctrl-i

はctrl-o に対するredo

ファイルへジャンプ

gf

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

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

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

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

ctrl-w

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

例えば,

ctrl-w ctrl-]
ctrl-w gf

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

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

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

補完候補を常に表示させる.

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

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

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

~/.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を

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

とかすると,めっちゃ遅かった.

#include<opencv2/opencv.hpp>

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

通常の補完

ctrl-p
ctrl-n

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

タブはどうだったかな?

特定の補完を行う

ファイルパス補完

ctrl-x f

こいつの欠点は,

PATH=/usr/local/

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

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

愚痴

(´・ω・`) < マジ,めんどくさす

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

対応策として,

"path"

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

あるいは

PATH= /usr/local

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

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

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

~/.vimrc
set isfname-==

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

行補完

ctrl-x l

意外と便利.

パスパターン補完

ctrl-x i

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

タグ補完

ctrl-x ]

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

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

定義もしくはマクロ補完

ctrl-x d

あんまり使わないな.

vimのコマンドライン補完

ctrl-x v

その他の補完

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

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

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

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

vim <directory>

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

vim ./

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

rangerほど高機能ではないが,:sp:vsとかと組み合わせて,別ウィンドウでディレクトリが見れる.

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

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

欲しい機能

今のvimだと,:shでbashに入れるけど,
全画面でしか入れない.

vimの隣のウィンドウだけbashにするとかできないのかな....もちろん,プラグインは無しで

できました

ただしvim8.0以降

非常に有用なので,上に上げておきます.

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

もちろん,プラグインは無しで.

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

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

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

[参考文献]