トップページ 組込みソフト Linux搭載ボード viエディタ

Viエディタって?
 UNIXやLinuxでは標準に実装されているエディタです。昔、UNIXなんてほとんどの人が知らなかった頃、開発装置でUNIXを導入しました。viを使ってみて「なんて使いにくいんだ。」皆がそう思いました。そして開発装置メーカーに今まで使っていたエディタと同じものをUNIXに入れてもらいました。
 今ではUNIXマシンも昔のように高価ではなくなり、またLinuxというフリーのOSまで登場するとソフトを書く人はUNIX,Linuxのエディタにどっぷりつかるようになるわけです。入社したときからず~~とUNIXという人も多くいると思います。このような人たちは、

目指せviの達人!

かも知れませんが、オラはそんなの目指しません。viなんかなくても秀丸エディタがあれば十分です。また、短い文章ならメモ帳でも何とかなっちゃいます。

なぜViを?
 LinuxでもX Windowを使えばgeditなどのGUIのエディタが使えます。ふつ~~のテキストだけを書くならこれで問題ありません。ところがLinuxの設定を変更するためルート権限のファイルをgeditではできないことがありました。
sudo gedit root_file.txt
でgeditが実行できませんでした。
 また、カメラやLCDを実装したソフトを作るにはX Windowが必要ですがそれ以外はCPUの処理速度に負担を掛けないようにコマンドライン(つまりCUI環境)にしたほうがよさそうです。そこでCUIでのエディタが必要になります。

最近はnanoというエディタが流行りなのでしょうか?UbuntuでもDebianでも標準で実装されていました。操作性もviよりはよさそうです。しかし、却下です。理由は、自分以外のマシンを使う場面があったとき、nanoがインストールされいるかわからない。
折角覚えても、nanoがいつまで続くかわらない。

emacsというviと同等のエディタもありあす。しかし、別途インストールしなければならない。よってnanoと同じく、自分以外のマシンを使う場面があったとき、emacsがインストールされいるかわからない.。

よって、
昔から今まで続いている
標準でインストールされている(と思われる)
という消極的な理由で、viを使うことにします。

viとvimがある!
 たとえばUbuntuでインストールされているのはviです。そこで
vim
とタイプしてみると、
sudo apt-get install vim
でvimをインストールしなさいと助言されます。
ということは、viとvimは別物ということになると推定できます。
面倒なのであまり調べませんでしたが、最初
vimはviの何ちゃってエディタ
のような感じだったのでしょうか?
それが年月を経てviの高機能版という位置付けになったような?
実際、vimをインストールした後、
vi
とタイプするとvimが動いています。
なんだか同じコマンドでも、できの良い子供が親の変わりに出てきたような感じです。

前述したように、
目指せviの達人!
なる気はさらさらないので、viの最低限の操作をモノにするというコンセプトでいきます。本当はvimまでやったほうがいろいろ便利に思えるようになったのですが、深追いはしません。

なぜviはわかりにくい?
 Windowsで使うワープロなどではモードは1つです。文字を入力しながら間違ったらback spaceキーやdeleteキーで修正できます。また、自由に矢印キーで文書の位置を移動できます。
 しかし、viではは2つのモードがあります。コマンドモードと入力モードがあり、それぞれ使えるキーが違ったりするのですごくわかりにくいです。マニュアルをよく読まないと入力できません。特に矢印キーやback spaceキーなどが使えたりダメだったり。
大事なこと:

矢印キーやback spaceキーなどを使うな!マウスも使うな!

使わなければ思ってもいない操作ミスは起きません。
そして、この2つのモードの設計思想は次のように考えればviがわかりやすくなります。
入力モード
 これはほとんど入力ミスをしないようなオペレータを想定していると考えるとわかりやすいです。すなわちミスをしないのだから、
矢印キー
back spaceキー
deleteキー
を使うことはない。実際には使えない!
また、ワープロなどでいうところの挿入モードだけです。上書きモードはありません。
よって、入力モードは、
間違えずどんどん文字を挿入していってくれ!
というのが前提です。
コマンドモード
 このモードでは入力モードのように文字を入力することはできません。入力モードでできなかった文字位置の移動、文字の削除、検索、置換、ファイルのセーブなどができます。
アバウトに言えば、

入力モードでじゃんじゃん打ち込んで
間違ったらコマンドモードで直せ


です。

viの起動
 viが起動された直後はコマンドモードになっています。
vi  新規ファイルの作成になります。
vi filename.txt filename.txtを読み込んで編集します。

viの終了
 viがコマンドモードになっているとき、
:wq ファイルを保存して終了。
:q! ファイルを保存しないで終了。
:wq filename 指定したファイル名で保存して終了。

コマンドモードと入力モードの切り替え
 viを起動した直後はコマンドモードになっています。最初に次のコマンドを実行してください。
:set showmode
現在の入力モードのとき一番下の行にI-- NSERT --と表示されます。

これで現在入力モードかわかります。逆にいうと上記コマンドをやらないと現在のモードがわかりにくくなり、誤操作の連発を引き起こします。

モードの切り替え図
i カーソルの前に入力します。
a カーソルの後に入力します。
カーソルを行頭に移動して、カーソルの前に入力します。
A カーソルを行末に移動して、カーソルの後に入力します。
O カーソル行の上に空白行を挿入します。
o カーソル行の下に空白行を挿入します。
s カーソルのある1文字削除し、カーソルの前に入力します。
ESC コマンドモードに変わります。

コマンドモードでの編集
カーソルの移動
 入力モーではback spaceキーなどが使えずひたすら文字を打ちます。間違いや訂正などが起きたらどうするか?コマンドモードで修正します。


右手のホームポジションを基本としています。
実際これでやらなくても矢印キーが使えるようです。
ctrl+F 1ページ下に移動します。
ctrl+ B 1ページ上に移動します。
0 オーではなくゼロです。行先頭へ移動します。
$ 行末へ移動します。
:0 オーではなくゼロです。1行目の1文字目に移動します。
:$ 最終行の行末に移動します。
:123 123行に移動します。
削除
 viエディタでおやっ!と思ったこと。
改行が削除できません。
例)
本日は、
晴天なり。
→本日は、晴天なり。
と変更したいとき、改行を削除すれば終わりです。しかし、viではできません。1行全部削除はできるので、
削除:晴天なり。
本日は、の後に再度打ち込み:晴天なり。
改行の削除をすることはできないが、別の方法で削除したのと同じことができるがわかりました。
置換で改行を空文字にすることでできる。
:s/\n/
直感的でないよね。
x カーソル位置の1文字を削除。deleteキーと同じ。
X カーソル位置より前の1文字を削除。back spaceキーと同じ。
dw カーソル位置より単語単位で削除。
dd 行を削除。3ddでカーソル行から下の3行削除。
コピーと貼り付け
yy 行のコピー。3yyでカーソル行から下3行をコピー。
yw カーソル位置より単語単位でコピー。
P カーソル行の上の行に貼り付け。
p カーソル行の下の行に貼り付け。
検索
/string 文字列の検索。
n 順方向検索。
N 逆方向検索。
置換
:s/str1/str2 文字列str1を文字列str2で置換する。
:%s/str1/str2 全行で文字列str1を文字列str2で置換する。
:3,5s/str1/str2 3行から5行で文字列str1を文字列str2で置換する。
:%s/str1/str2/g /gは同一行に置換対象文字が複数あったとき、全て置換する。
その他
. ピリオド。繰り返し操作。
U 取り消し。
:!コマンド Linuxコマンドの実行。 例):!ls
:!r filename ファイルの取り込み。全部取り込まれるので不要部分を削除する。
:set nu 行番号の表示。
:set nonu 行番号の非表示。
:set ts=4 タブの文字幅を4文字にする。
:set ts タブの文字幅を確認する。
番外編
タブの文字幅などを毎回セットするのは面倒!何とかならない?
ユーザーのホームディレクトリに以下のファイルを用意すれば、Viは起動時にそれを読み込みモードをセットします。
ファイル名  .exrc
記述内容
set number
set tabstop=4
set autoindent
set showmode
これでviが立ち上がると行番号の表示、タブが4文字、自動インデント、モードの表示をします。
範囲を指定してコピーや削除をしたい。
削除dd、コピーyyと行単位での操作をしろとviのコマンドは行っています。これってあまりに不親切です。なぜなら行数が長くなるといちいち数えるのが大変です。Windowsのエディタのようにシフトキーを押しながら矢印キーで範囲が指定できると行数を数えるという非生産的なことに頭を使わなくてすみます。
viではVISUALで対応できます。
編集モードでVキーを押します。
H,J,K,Lキーでカーソルを移動します。

範囲の指定が終わったら、

コピー:Yキーを押します。
貼り付けは、貼り付けしたい位置に移動して
Pキーを押します。

削除:Dキーを押します。
指定範囲が即削除されます。