viで翔ぶが如く編集する - HondaLab/Robot-Intelligence GitHub Wiki
子供の頃に自転車に乗る練習をしたと思う. 三輪車に乗っていると,2輪だと倒れてしまうと直感的に理解する. 補助輪は自転車初心者にやさしいし,降りても倒れないから便利だ. だが,2輪のようにスイスイはしれない.
Windowsのメモ帳やJupyter Notebookのdefaultエディターのようなエディターは, 言わば補助輪付きの自転車みたいのものだ. 直感的で初心者にはやさしい. しかしスイスイ編集できない.
Linux (Unix) で用いられる標準エディターがviである. また,その便利さから,WindowsやMacOSにも移植されたviアプリが存在する. つまりLinux以外のOSを利用するとしても, viを使いこなしてプログラミングなどで得をすることはあっても, 損をすることは全く無い.
世界に補助輪付きの自転車しかなければ,いつまでもそれを使い続けるしかない. しかし,眼の前で2輪の自転車が翔ぶが如く走っているので,いつしかだれしも 補助輪をはずして自転車に乗るようになる. (2020.8)
編集速度を思考速度とシンクロさせる
マウスを使わずに,キーボードだけで高速なファイル編集が出来る. ファイル編集において,マウスは,さしずめ自転車における補助輪みたいなものだ. 便利で直感的に利用出来るが,まどろっこしい.
ここに示すコマンドを用いることで,補助輪なしでスイスイ編集できるようになる. なれてしまえば,思考の速度とファイル編集がほぼシンクロする程度に高速な編集が可能である.
コマンドをたくさん覚えなければならないように見えるが, キーボードのホームポジションから行える自然なかたちのコマンドなのである. 削除など行番号などと組み合わせてつかうコマンドも多いので,実は覚えるのはそれほど数多くない. スイスイ編集するための最小限のセットである.
複数のコマンドを組み合わせてひとつの文字に割り当てるなど, さらに高速編集を可能にする便利な機能が他にも多数あるので, 調べてチャレンジしてみるのも面白い.
WordとExcelの効率の悪さに苦しめられるくらいなら,いっそviを使って 真の意味での働き方改革を行ってはいかが.
起動と終了方法
ターミナルから起動
mate-terminalなどのshell窓から直接すばやく起動できる.
vi ファイル名
他のエディターなどのように起動に数秒かかるということもなく,目にも止まらぬ速さで起動する. この起動の速さも,思考とシンクロ効果を生む要因である.
ファイル名として存在しないファイル名を指定すると,その名前の新しいファイルが出来る. 既存のファイル名を指定すると,そのファイルの編集がはじまる.
起動直後のviは,コマンドモードである.
その他のvi利用方法
たとえばこのdokuwikiの編集画面が起動すると,Windowsのメモ帳の様な低機能なデフォルト編集画面が起動する. しかし,CodeMirrorというプラグインをインストールして,右下のギアアイコンから 「キーボードマッピング」にマウスカーソルを合わせると,vimが選択できる. vimというのは,viの上位互換エディターなので,ここで説明するコマンドなどすべて同じ様につかう ことができる.
CUIのターミナルからは前節の方法でviを起動するが,gvim というGUI を持ったアプリケーションも存在する. マルチウィンドウにして比較編集が簡単にできたりしてとても便利であるが, 基本操作はここに挙げたものと同じである.
Jupyter Notebookの編集機能の中でもデフォルト以外に,viモードを選ぶことも出来る.
また,ファイルマネージャの中で,マウス右クリックからviやgvimでファイルを開けば編集が起動する.
いずれの起動方法を用いたとしても,ここに説明するviの機能をすべてつかうことが出来る ので安心してほしい.
終了
最低限 :wq を覚えておけば,編集の保存終了が可能である.
コマンド | 機能 |
---|---|
:q | 終了 |
:wq | 保存して終了 |
:w | 保存して編集継続 |
:q! | 編集を破棄して終了 |
ちなみにコロン「:」はexモードに入るためのコマンドである. 後に述べる置換なども,exモード内で行う.
このexモードと検索モードのときには,入力位置が編集画面の一番下に移動する.
コマンドモードと入力モード
起動直後のviは,コマンドモードなので, 文字を入力するためには,iなどのコマンドをもちいて入力モードに入る必要がある.
この,いきなり文字を入力できない面倒くささが初学者に敬遠される理由であると考えられる. 逆に言うと,コマンドモードと入力モードが分かれているからこそ,他のエディターに くらべて高速編集が可能であるとも言える.
コマンド | 機能 |
---|---|
ESC | コマンドモードへ |
i | その位置で入力 (Input) |
a | 右となりの位置から入力 (Add) |
o | 次の行から入力 (Open) |
R | 上書き (Replace) |
ESCキーを複数回押しても1回おしたのと同じことで,特に編集上わるいことは起こらないので, 「いまESCを何回おしたかな?」と不安がる必要はない.
文字入力以外の編集はすべてESCキー入力後のコマンドモードにて行う.
カーソル移動
キーボードのホームポジションに両手を置く. viのカーソル移動コマンドは,ホームポジションから手を移動させないで 右手をつかう仕様になっている.
カーソル移動に矢印キーやマウスを使わないということが,viの高速編集を可能にしている理由のひとつである. ホームポジションから,矢印キーやマウスまでの10数センチの右手の動きが無駄な時間を生む.
viをつかえば,1日に何時間ファイル編集を続けても,筋肉痛や肩こりとは無縁である.
1文字カーソル移動
右手を移動させずに,人差し指,中指,薬指を動かすだけで,カーソル移動が可能である.
コマンド | 機能 |
---|---|
j | 下に移動 (人差し指) |
k | 上に (中指) |
h | 左に (人差し指左隣) |
l | 右に (薬指) |
n文字移動
上記j,k,h,lの前に移動量の数値を指定すれば,その分量だけカーソルが翔ぶ.
コマンド | 機能 |
---|---|
nj | n行下に移動 |
nk | n行上に |
nh | n文字左に |
nl | n文字右に |
行をまたいで翔ぶが如く移動
維新の志士に負けないように翔ぼう(司馬遼太郎「翔ぶが如く」参照)
コマンド | 機能 |
---|---|
G | ファイル最終行へ翔ぶ |
1G | ファイル先頭行へ |
nG | n行目へ |
nは行番号の数字であることに注意. プログラミングをしていると,メインループ(main関数)と関数やクラス定義部分の間を行ったり来たり することが頻繁に起こる. そのときに,それぞれの編集部分の大体の行番号を覚えておけば,まさに翔ぶが如く編集をすることが出来る.
矢印キーは「徒歩」,Gコマンドは「ワープ」ぐらいの違いがある.
削除
編集速度と言うと文字の入力速度のがまず思い浮かぶが, 削除の速度も大きく影響する.
削除に関係するコマンドは x と d(D)である. dnGを覚えるだけで,編集速度は激的に上がる.
コマンド | 機能 |
---|---|
x | カーソル下の1文字削除 |
nx | カーソル下からn文字削除 |
D | カーソルから行末まで削除 |
dd | 1行削除 |
dnG | カーソル行からn行目までを削除 |
列挙してみると,複雑なコマンドを覚えなければならないように見えるが, 行移動などと考え方が共通なので,それほど覚えるのに苦労しない.
これはviの機能とは異なるが, 入力モードで文字入力中にBackSpaceを入力して1文字だけ文字を消去することも可能である. また,入力モード中に矢印キーでカーソル移動することもかのうなので,メモ帳の様な編集方法 もやろうと思えば出来てしまう.
しかし,その様な低速エディターのような使い方は早く卒業してviで翔ぶが如く編集をする ことを強く推奨する.
コピー=ヤンク&ペースト
削除と並んでよくつかう機能がヤンク&ペーストである.
ヤンクとはバッファにコピー部分を読み込む事を指す. 一般的にはコピー&ペーストと呼ばれることがあるが,ヤンク&ペーストが正しい.
コピー=ヤンク&ペーストである.
コマンド | 機能 |
---|---|
yy | 1行ヤンク |
yny | n行ヤンク |
ynG | n行目までヤンク |
p | ペースト |
その他に文字列検索と組み合わせて,検索文字までヤンクする方法などがある. それを使いこなせばさらに高速編集が可能になるが,ここに上げたものを瞬時につかう だけでも十分に高速である.
検索と置換
viによる翔ぶが如くファイル編集の醍醐味は,この検索と置換にある. この機能を知ってしまったら,Wordなどの他のソフトウェアで編集するのがバカバカしくなってくる.
検索
コマンドモードで / を入力するだけで,検索が開始される.
コマンド | 機能 |
---|---|
/文字列 | 文字列を検索する |
n | 次を検索 |
N | ひとつ前を検索 |
文字列を別の文字列に置き換えていくには,次の置換機能の方が便利である. この検索機能で多用する使い方としては,カーソル移動に応用すると翔ぶが如く編集が進む.
プログラミングの際には,メインルーチンと関数やクラス定義部分とを行き来することがよくある. 関数名を覚えておけば,「/関数名」と入力するだけでその関数の頭部分に翔ぶことができる.
全置換
置換はexモードで行うので,最初に:を入力する. ファイル内すべてに渡って置換を実施する場合は,%sをしていする.
コマンド | 機能 |
---|---|
:%s/文字列/置換文字列/ | 文字列を置換文字列に置換 |
:%s/文字列/置換文字列/g | 行内すべてに対して置換 |
:%s/文字列/置換文字列/c | 置換前に確認 (y/n) |
:%s/文字列/置換文字列/gc | 置換前に確認しながら行内のすべてに対して置換 |
gオプションを付けないと最初にマッチした文字列だけ置換される. g オプションを付けると,1行の中に複数マッチする文字列があってもすべて置換される.
場合に寄っては置換したくない箇所もあるかもしれない. その様なときには,cオプションをつけるとよい. y/nで確認しながら置換を実行してくれるので,置換したくない箇所では,nを入力すればよい.
行を限って置換
を実施することもできる. %の代わりに,開始行,終了行をしていする.
コマンド | 機能 |
---|---|
:m,ns/文字列/置換文字列/ | m行目からn行目までの中で文字列を置換文字列に置換 |
g, cオプションについては,全置換の場合と同じである.
便利な機能
便利な機能は多数あるが,よくつかう代表的なものを挙げる.
コマンド | 機能 |
---|---|
$ | 行末に移動 |
^ | 行頭に移動 |
J | 行の連結 |
. | 同じことを繰り返す |
u | 直前の編集を取り消し |
行の連結「J」はヤンク&ペーストと組み合わせてつかうと非常に強力である.
編集に失敗しても,uを押すだけで元に戻る. :q! を実行すると,すべての編集が一気に破棄されるが,u を用いると1段階ずつ 元に戻ることができる.
行の頭にコメント文字#を大量に入れたくなるときもある. そういうときには,ピリオド「.」とjを交互に入力するだけで,行頭に#が入力される.
viの略歴と未来
viはLinuxの祖先であるUNIXが作られたころ(1970年代)から基本機能は変化せず,40年以上つかわれ続けきた エディターである. ちまたには一見便利そうなGUIをもったファイルエディターが他にも多数あるが, 40年の長い利用年月を経て,その有用性が改めて見直されている.
筆者も,こんな便利なエディターをなぜみんな使わないのだろう?と思いながら30年以上使い続けてきた. viが一番便利で高速だよ,と他の人に勧めても目を白黒されるばかりで,長年理解してもらえなかった. しかし,最近201x年代になって,「vimが最高!」という若者も現れる. 良いものが生き延びることもあるのだ.
この稿を書いている最中にもdokuwikiの編集画面でもvi機能を使って編集できないものかなと思いついた. 調べてみると,ちゃんとCodeMirrorというプラグインの中にviキーマップが存在することが判明した.
近年,人工知能プログラミングで人気を集めているのがPythonである. Pythonのプログラミング環境であるJupyter Notebookにもvimモードが存在する. やはりviを利用しつづけている開発者は間違いなく存在するのだ.
これからもviで,翔ぶが如くプログラミングライフを満喫できるとおもうと,最高である.