viに関する世界観です。ncursesも参照のこと。
viは、UNIXの標準的テキストエディタ。特に、サーバーなどの最小限のシステムで使われることが多い。(Emacsは、サーバーでは入っていない場合がある。)
モードを切り替えることによって効率的な入力が可能。キーボードによるコマンド操作が豊富。
そのありえないキーバインドから、UNIX界では「もっとも操作方法を覚えるのが難しいエディタ」として知られている。また、ラインエディタexをベースにしており、exのコマンドを使うことができる。これによって、さまざまなモードを切り替えながら、色んなことを簡単にできて入力や操作もしやすい最強のエディタとして知られている。
Emacsとviはテキストエディタ界の二大勢力として宗教戦争をしている。僕は昔はvi派だったが、今はEmacs派。昔はviに拘っていたが、今はWindowsでxyzzy(EmacsライクなWindowsエディタ)を使うようになった。
viの操作方法がどうしても覚えられないと言う人は、コマンドラインで使える小さなnanoと言うエディタがある。初心者が設定ファイルの編集をするには、nanoがおすすめ。
Vimを使うのであれば、公式のメインヘルプファイルを読みましょう。以下に日本語に訳されたページがあります。
後日注記:Vimでは:helpからマニュアルを読むことができます。とてもよくできていて便利であると好評です。ただしデフォルトは英語です。日本語にするためにはvimdoc-jaをインストールします。あるいはHTML版もあります。
2023.06.07編集
viのようなビジュアルモードのテキストエディタが生まれる前、UNIXなどではラインエディタと呼ばれる、行番号を指定してその行だけを編集・プリントするエディタが使われていた。
viのもとになったのは、ラインエディタex。viはexのビジュアルモードとして開発された。
このラインエディタexは、今でも便利に使うことのできる高度な機能がたくさんある。viから、今でもexの機能を使うことができる。
exの操作の基本は、アドレス指定とコマンド。exでは
:[アドレス]コマンド[オプション]
という形式でアドレスに続いてコマンドを付加する形式で操作を実行する。
アドレス指定に使うアドレスシンボルは、
シンボル | 説明 |
---|---|
x,y | x行からy行までを処理することを表す。 |
0 | ファイル先頭 |
$ | 最後の行 |
% | 全ての行 |
/pat/または?pat? | これより後またはこれより前にpatにマッチする行 |
となる。
(詳しくは入門vi 第6版を参照のこと。)
UNIX使いにとって、viを習得するのは絶対に必要である。
コマンド | 説明 |
---|---|
挿入モードに入る | i, a, o, O, A, Iのどれか。 コマンドによって現在位置の左、右、上、下などの挿入場所が違う。 aは右、Aは行末、iは左、Iは行頭、oは下の行、Oは上の行に挿入する。 「viの入力は青い(a, o, i)」と覚えよう。 |
基本的移動 | h(左), j(下), k(上), l(右)。 |
その他の移動 | wで次の単語、bで前の単語。 0で行の先頭へ、$で行の終端へ。 Hで画面最上行先頭、Mで画面中央行先頭、Lで画面最下行先頭に移動。 |
ロールアップ | Ctrl+fで一画面下へ、Ctrl+bで一画面上へ。 Ctrl+dで半画面下へ、Ctrl+uで半画面上へ。 |
ヤンク | ヤンクとはバッファへのコピーのこと。 ylで一文字ヤンク, ywで一単語ヤンク、yyでカーソル行のヤンク。 複数行ヤンクしたい場合は3yyなどとする(3行ヤンク)。 |
プット | pあるいはPでプット(バッファから貼り付け)。 pの場合、文字や単語はカーソル右に、行は行の下にプットされる。 Pの場合は逆。 |
カット | xで一文字削除、dwで一単語削除、ddで一行削除。 ddなどで削除した内容はヤンクと同様バッファに入れられるため、pなどで貼り付けすることができる。 |
検索 | /文字列で下方に検索、?文字列で上方に検索、nで同方向に次の検索、Nで逆方向に次の検索。 |
アンドゥ・リドゥ | .で直前の動作を繰り返し、uで直前のコマンドの取り消し、Uでカーソル行に行った編集の取り消し。 |
また、:に続いてコマンドを入力することで、exコマンドが実行できる。
exコマンド | 説明 |
---|---|
:wq | 保存して終了 |
:q! | 破棄して終了(!は問答無用でやれという意味) |
:w ファイル名 | ファイルに保存 |
:w! ファイル名 | 強制的に上書き |
:r ファイル名 | カーソル位置にファイルを読み込む。 |
:s/foo/bar | カーソル行の中の最初のfooをbarに置き換え。 このコマンドの最後に/gをつけると、カーソル内の全てに対して置換を行う。 |
:%s/foo/bar/g | ファイル内の全てに対して置換を行う。 ある行からある行までの置換を行いたい時は、:5,80s/foo/bar/gのように行番号でアドレス指定を行う。 |
(以上は「情報基礎概論 第4版 喜久川政吉・殿塚勲 共著(学術図書出版社)」を参考に執筆しました。)
検索と置換のコマンドを上手く使うことで、どこからどこまでのどんなパターンに対して、正規表現による置換をかけることが出来る。
ちなみに、記法として/以外の記号を使うことも出来る。
:%s;/usr/bin;/usr/local/bin;g
正規表現については正規表現を参照のこと。
:!コマンド
でUNIXコマンドを実行できる。
たとえば
:96,99!sort
などとすれば96~99行目をソート(並び替え)する。このように、テキストブロックをUNIXのフィルタ処理にかけることもできる。
(詳しくは入門vi 第6版を参照のこと。)
文脈依存置換とは、あるパターンを含む行を探し、見つかったら別の文字列を置換することのできる構文。
たとえば、mapから始まる行に出現するAltだけをESCに変えるには、
:g/^map/s/Alt/ESC/g
とする。
(詳しくは入門vi 第6版を参照のこと。)
作業中の編集を破棄して、最後に保存された状態に戻したければ、:e!コマンドが使える。
:e!
(詳しくは入門vi 第6版を参照のこと。)
2023.05.10
viでシェルを実行するには、
:sh
とする。たくさんのUNIXコマンドを実行する際に、何度も:!を実行する代わりにシェルを利用できる。
(詳しくは入門vi 第6版を参照のこと。)
2023.05.10
単にexコマンドを複数同時に実行したい場合は、|を使えばよい。
: %s/hoge/fuga/g | %s/foo/bar/g
(詳しくは入門vi 第6版を参照のこと。)
2023.05.10
Vimでは、プログラミング言語のソースコード(たとえばCSS)などで、全体のインデントがそろっていない時などに、gg=Gとすると自動でインデント整形してくれます。便利です。
僕がDebianでvimを最初に使おうとして驚いたのが、シンタックスハイライトの設定を読み込まないこと。
syntax enableと書いていても、エラーがでてシンタックスハイライトの設定が無効になるため、なぜだろうとネットを見ていたら、どうやら標準で導入されているのはvim-tinyと呼ばれる最小ビルド版だったようです。
サーバなどの制限された環境で使うなら、このvim-tinyでも我慢できるかもしれませんが、趣味用のマシンで使うならvimを導入しましょう。aptで簡単に導入できます。
# apt install vim
以下の書籍・ページが参考になります。
軽量なviクローン。*BSDで標準(デフォルト)のviとして使われている。
Wikipedia
2023.06.07編集
viの改良版。Linuxでは多くの場合このvimを使う。
Wikipedia
ソースコード
NeovimはVimの改良版。Vimにはないさまざまな機能が追加され、愛好者が多い。
後日注記:Neovimでは設定やプラグインをVim scriptだけではなくLuaでも書ける。Luaも参照のこと。
後日注記:Neovimはツイッターでも度々言及されるなど、最近急速に利用者を増やしている。一昔前はテキストエディタはAtomの時代だったが、今やNeovimの時代と言っても過言ではなく、覇者であるVS-Codeにエディタのクオリティから言って完全に負けていない。
2023.06.07編集
以下のVIM USER MANUALの設定についての章は読んでおこう。設定やプラグインに関する基本的なことが記述されている。
vimの設定は~/.vimrcにおいて行う。基本的な設定は以下が参考になる。
特に、行番号を多用するvimerとして、行番号の表示設定は必須。
set number
UNIXの場合~/.vim/plugin/がプラグインディレクトリになる。プラグインについては以下が参考になる。
後日注記:おすすめのプラグインはさらに以下のようなページが参考になります。特にfzf(Golang界隈で有名)やヘルプの日本語化は不可欠です。
2023.06.07編集
基本的に、.vimrcに
syntax enable
と書いておけばよし。
シンタックスハイライトについてはVIMリファレンスマニュアルに専用の文書があります。
viでコードを記述している際に自動的にインデントを行うには、viではautoindentを設定する。
またvimではこれに加えてsmartindentとcindentがある。特にcindentではC言語のコード記述においてとても賢い自動インデントを行ってくれる。
set autoindent set smartindent set cindent
(詳しくは入門vi 第6版を参照のこと。)
2023.05.10
viから設定を変更するには、:setコマンドを使う。
:set オプション
すべての設定可能なオプションは以下のコマンドで一覧表示できる。
:set all
(詳しくは入門vi 第6版を参照のこと。)
2023.05.10
Vimのプラグインとして僕がおすすめなのはGNU Grobal。関数が使われているところから関数の定義にジャンプしたりできる。これがないと、自分でヘッダファイルの中を探し回ることになってしまう。
詳しくはctagsの世界観を参照のこと。
移動はhjklで行う。
挿入モードに移動するにはiあるいはaなど。押した瞬間から文字入力が始まる。ESCでコマンドモードに戻る。
検索は/hogeなど。
正規表現による置換は
:%s/foo/bar/g
など。
「:」で始まるコマンドはexコマンドという(viはラインエディタexのヴィジュアルモードとして開発された)。
文脈依存置換という面白い機能もある。その文脈における検索・置換ができる(たとえばhogeが含まれている行の中のfooをbarに置換する)。オライリーの「入門vi」に書いてあるので参考にしてほしい。
UNIXコマンドはviで使うと真価を発揮する。たとえば特定ブロックにsortをかけるなど。
外部sortコマンドは
:2,30!sort
などで実行できる(2~30行目のブロックにsortコマンドをかける)が、内部sortコマンド:sortを使うこともできる。
vimを使う際は行番号だけは表示するように設定しよう。行番号が表示されないviは使えないから(ほとんどのアドレス指定が行番号)である。また、シンタックスハイライトもあると便利。
使い方はVim公式のヘルプを見よう。
Linuxの標準的で入力や操作の効率の良いテキストエディタ。
Vim
以下は技術系VTuberの方のツイッターアカウントとYouTubeチャンネルで、Vimの応用的な使い方(やその他の技術的なこと)を動画で教えてくれる。「なぜviが最強のエディタと言われるのか」という問題の答えの一端が見える。僕のようなニワカVimmerにはちょうどいい。
2023.05.19
viは、BSDやcshの開発者の一人でSunでNFSやJavaの開発にも関わったとされる、ビル・ジョイが開発した。彼はUNIX界ではカリスマのように崇拝されている一人である。
特にcshについては、今でも*BSD系のOSで標準的に使われている(cshを改良したtcshが使われていることが多い)。LinuxではBashを用いることが多いが、viも標準的に搭載されている。
UNIXのエンジニアなどでは、cshなどのCシェルの使い方に慣れている方が多く、LinuxやMacなどでbashが使われていると嫌な顔をされることがある。cshはCライクな構文で知られ、Cライクな文法でシェルスクリプトを書くことができる。