vi の基本的使い方
                         2006-05-13
                         2006-05-23 アンドゥを追記
                         2008-04-03 正規表現を追記
                         2008-05-27 スワップファイルについて追記
                         2011-02-18 インサートモードでのカーソルキーについて追記
                         2013-12-19 開発者について追記
                         2016-06-01 .exrcの例ついて追記

vi とは? vi とはビル・ジョイが開発したUNIXで最も基本的なテキストエディタです。 インストールや、バックアップ、復旧時、minirootなど環境がまだ十分に整ってな い時にも使えますし、サイズも小さい。100万行以上の巨大ファイルを開いても平気。 管理権限を良く使うユーザは vi に慣れておくべきです。 vi のツボ vi にはコマンドモードと入力モードがあり、この2つの動作モードを行ったり来たり しながら編集を行います。 vi 使いかどうかを遠くから見て判断するポイント やたら [Esc] キーを連打する香具師。 起動 vi [file name] 例: $ vi hoge.html カーソル移動コマンド [↑][↓][←][→]キーでも移動できるが、場合によっては矢印キーが使えない場合がある。 そのような時は以下の4つのキーを使って移動する。    h 1文字左に移動する。[←]キーと同じ    l 1文字右に移動する。[→]キーと同じ    k 1文字上に移動する。[↑]キーと同じ    j 1文字下に移動する。[↓]キーと同じ その他のカーソル移動コマンド(主なものだけ)    ^  その行の先端(一番左側)に移動    $  その行の最後端(一番右側)に移動    G 最終行へ移動 nG n行目に移動。 例: 1G と入力すると1行目に移動する    [Ctrl]+[d] 1ページ(1画面)進む [Ctrl]+[b] 1ページ(1画面)戻る 編集コマンド    (vi で文字削除に Deleteキーや Backspaceキーを使うのは邪道である!     いつもDeleteキーや Backspaceキーが使えると思ってはならない!)    x カーソルの示している文字を削除    dd カーソルのあるその行を削除    yy カーソルのあるその行をメモリにコピーする    p カーソルのあるその行の下にメモリの内容をペーストする D カーソルのあるその行の内容を削除するが、行そのものは残る(改行コードが残る)    ちょっと応用    50yy とすると、カーソルのある行以下50行をメモリにコピーする    6dd とすると、カーソルのある行以下6行を削除する    J  カーソルのある行の最後に次の行を結合。 u 直前の操作の取り消し(アンドゥ)。何回前でも戻れる。 検索コマンド    :/パターン  カーソル位置から下に向かってパターンにマッチするものを検索 続いて n キーを押すと次にマッチするパターンを検索する。           N キーを押すと逆方向(上に向かって)パターンを検索する 使用例: Hack という文字列を探すため :/Hack とキーを打った直後の画面        一番下の行に打ったキーが表示されている。この後 [Enter] キーを        打つと Hack という文字列を検索する。n キーを押すとどんどん        次にマッチするものを探す。     置換コマンド 正規表現が使えるのでかなり複雑なことができるが、ここでは良く使う置換方法だけを 書いておく。    :%s/文字列1/文字列2/g   ファイル中の文字列1を全て文字列2に置換する 使用例: ファイル中の UNIX という文字列全てを WindowsXP に置換するため        :%s/UNIX/WindowsXP/g と打ち込んだところ           その後 [Enter] キーを打って実際に置換が行われた直後の画面     入力モードへの移行(主なものだけ)    i カーソルの位置から入力を始める    a カーソルの右から入力を始める    o カーソルのある行の下に空白行を挿入し、その行から入力を始める 入力モードからコマンドモードに戻る方法 [Esc] キーを押す。 今自分がどのモードにいるかわからなくなったらとりあえず [Esc] キーを押して コマンドモードに戻ること。 終了コマンドなど    :q ファイルを保存せずに終了する。       ファイルをいじらず vi で閲覧しただけならこれで終了できるが、ファイルを       いじった後にこのコマンドを入れると       「保存せんでええのんかい!?」というエラーが表示されて終了できない。    :q! 編集したファイルを保存せずに終了する。    :w  編集中のファイルを上書き保存。終了はしない。    :w [file name] 編集中のテキストをファイル名をつけて保存。    :wq 編集中のファイルを上書き保存して終了。    :wq! 書き込み権のないファイルは :wq で書き込みできないが、そのファイルの所有者       が自分であれば ! をつけることによって強制書き込みできる。    :!  1回だけ、何かシェルコマンドを実行する。       例: ファイル編集中にディレクトリーのファイル一覧を見たいとき        :!ls -la その他便利なコマンド    :set number 行番号を表示    :set nonumber 行番号を非表示    :sh シェルを起動する。viに戻りたいときはexit    :r file_name 現在の行の次にファイル file を読み込む vi で複数のファイルを編集 $ vi foo.txt bar.txt (最初にfoo.txtが開く) :next (bar.txtに移る) :prev (foo.txtに戻る) yy p で互いにコピペできる。 Vine付属Vimの気に食わない点 Vineのvi(Vim)でコピペすると変にオートインデントする件。 set noautoindent するとかなりよくなるが、それでもやはり中途半端にインデントする。 どうも編集するファイルの拡張子で勝手に判断しているようだ。(余計なことするなよ!) .f .c .java .html だとオートインデントする。しかし[拡張子なし]や .conf .txt だとインデントしない。いろいろやったがどうもうまくいかない。 よって、.exrc に  set nobackup  set noautoindent  set paste  set ruler syntax off と記述したら一応満足のいく動作(original の vi と同じような動作)を得られた。 勝手にファイル名最後に"~"のついたバックアップファイルを作成するのもウザイので set nobackup としている。 また、勝手にいろんな色のフォントを使うのも迷惑で、 syntax off としている。 もしインデントで使うTABの幅が気に食わないなら  $ echo 'set tabstop=2' >> ~/.exrc 一部のLinuxディストリビューション(Vine5.X, Ubuntu など)では vim-tiny がインストール されていて、インサートモードで上下左右(↑↓←→)カーソルキーが使えない。 viで上下左右にカーソルを移動するときはカーソルキーではなく kjhlキーを使うのが普通だし、 ましてやインサートモードでカーソルキーを使うなど邪道である。しかし vi初心者がどうしても インサートモードでも上下左右(↑↓←→)カーソルキーを使いたい場合は、以下のコマンドを 打つと使用可能になる。  $ echo 'set nocompatible' >> ~/.exrc 普通の人は set paste, set nohlsearch, set nocompatible, syntax off だけを設定 すると使いやすいだろう。お勧め。  $ echo 'set paste' > ~/.exrc  $ echo 'set nohlsearch' >> ~/.exrc $ echo 'set nocompatible' >> ~/.exrc $ echo 'syntax off' >> ~/.exrc 文字コードの異常について Vine6.3の vi はデフォルト設定で日本語文字コード設定がおかしいようなので、 vi の設定ファイル .exrc で強制的に UTF-8 にすること。 参考:森口の .exrc ファイル 上記設定後に、  一からファイルを編集せよ。  あるいは、変な日本語文字コードを含むファイルを開いて日本語部分を全て消して  保存し、もう一度開いて日本語入力せよ。 異常終了でできるスワップファイルについて vi で何か編集中に、そのプロセスが異常終了するとスワップファイルができることがある。 参考画像 不要なら rm -f .hoge.swp などとして消しなさい。 編集途中を復活させたいなら、mv .hogege.swp hogege などとして復活させよ
おまけ  ・正規表現 検索や置換での文字列パターン表現    . 任意の1文字    ^ 行頭    $ 行末    * 直前の文字の0回以上の繰り返し    [] 囲まれた文字のうちの任意の1文字    \ 直後の1文字を通常の文字として処理    & 前に一致した文字列