uX02.ファイル編集

uX02.ファイル編集

ファイルの編集

PG,NE,SVにはエディタが必須!

正式な呼び方をすればテキストエディタですが、ここではエディタと省略して説明します。正式名称からわかるように、テキストファイルを作成したり、編集したり、保存するために使うソフトのことを指します。
マイクロソフトのWordは誰もが一度は使ったことがあるソフトだと思いますが、これは厳密に言えばエディタではありません。Windowsでいえばメモ帳などがエディタに該当します。
プログラミングはプログラムをテキストによって構築します。プログラマーの作業しているシーンを想像してみましょう。黒い画面に向かって何かを必死に打ち続けているイメージがありますよね。
これがまさにエディタを使ってプログラムを書いている場面です。
エディタと上手く付き合えるか、言い換えればエディタを使いこなせるかがプログラマーの生産性を大きく左右します。
プログラマーがエディタを使っている時間は全作業時間のうちの多くを占めます。いかにショートカットを使えているか、いかにエディタに搭載されたツールで時間短縮ができているか等、生産性に直接関わってくるものなんです。
例えば、一行まるまるコードを削除するときにDeleteキーをずーっと押し続けているプログラマーと、ショートカットで一発で消してしまうプログラマーとでは明らかに作業効率が変わるか、想像が容易ですよね。
つまり、プログラマーとして仕事をする上でエディタの存在は切っても切れない関係であり、重要なツールというわけです。
気をつけておかないといけない点として、1つのエディタをしばらく使い続けていると、他のエディタを使おうとしたときに乗り換えコストがとても大きいという問題があります。
上述したようにエディタにはショートカットコマンドや各種ツールなどが存在し、そのショートカットの方法はエディタごとで統一されていません。
つまり、Aというエディタで作業することが慣れたあとに、Bというエディタに乗り換える場合はほぼ一から使い方を覚えなければいけないわけです。

以上のお話は、サーバ技術者、ネットワーク技術者も同様です。なぜならば、サーバー技術者はエディタを使って各種サービスの設定ファイルを書き換える必要があります。ネットワーク技術者もスクリプトを作ってネットワークの監視処理等を自動化する必要があるからです。

viまたはvim(ヴィム)について
長所
  • サーバー機にはほぼ間違いなくインストールされている
  • サーバーやネットワーク機器をイジる時にすんなり使える
  • ターミナルで作業が完結する
  • コマンドを覚えればキーボードで作業が完結する

短所

  • CUIなので最初は操作方法に戸惑う
  • 操作方法で覚えることが他に比べると多い

まとめ
GUIと呼ばれるエディタとは異なり、VimはCUIであるためマウスなどは使わず基本的にはキーボードを使ってコマンドによる操作を行います。例えば、上の行に移動するときはマウスや矢印キーを使うのではなく「k」を使ったりします。GUIエディタに比べると操作方法に関して覚えることが非常に多いため、使いこなせるようになるまでは時間を要します。なぜそんな面倒なエディタを使う人がいるのかというと、そういったコマンドを覚えてしまえば非常に効率的に作業ができる点や、サーバーでの作業をするときにはVimの仲間であるViというエディタを使うため、その時に苦労せずに済むといった点があります。

vi     スクリーンエディタ(モードの概念を有する)

vi モード変更



基本形

vi ファイルを開く

vi filename         ファイルのオープンまたは作成(通常)
vi +21 filename     ファイルをオープンし、行21に位置づける
vi +/hoge filename  ファイルをオープンし、hogeの行に位置づける


vi 保存と終了

:w            修正内容を保存
:w!            修正内容を強制保存  → rootであれば書込み権が無くても書込み可)
:w filename     修正内容をfilenameへ書き込む
:q!             修正内容を保存せず終了(強制終了)
:wq             修正内容を保存してviを終了
:wq!            修正内容を強制保存してviを終了(強制保存&強制終了)  → rootであれば書込み権が無くても書込み終了可)


vi カーソル移動

h          左へ1文字分移動(←キー
j          下へ移動(↓キー
k          上へ移動(↑キー
l          右へ1文字分移動(→キー

w          右へ1単語分移動
W          右へ1単語分移動(区切り文字を越える)

b          左へ1単語分移動
B          左へ1単語分移動(区切り文字を越える)

e          次の単語の末尾へ移動
E          次の単語の末尾へ移動 (区切り文字を越える)


[Return]     下の行へ移動
[Space Bar]  右へ1文字分移動
nG           ファイル全体の最初から n 行目へ移動
G           ファイルの最終行へ移動
:n           ファイル全体の最初から n 行目へ移動
:+n          カレント行からn行下に移動
:-n          カレント行からn行上に移動



vi 画面スクロール

Shift+H          画面上端へ移動(High)
Shift+M          画面中段へ移動(Medium)
Shift+L          画面下端へ移動(Low)

Ctrl+F          1画面分下へスクロール(Forward)
Ctrl+D          半画面分下へスクロール(Down)
Ctrl+B          1画面分上へスクロール(Back)
Ctrl+U          半画面分上へスクロール(Up)


vi 文字・行の挿入

a     カーソルの右にテキストを追加
A     カーソルがある行の最後尾にテキストを追加
i     カーソルの左にテキストを追加
I     カーソルがある行の先頭にテキストを追加
o     カーソルがある行の下の行にテキストを追加
O     カーソルがある行の上の行にテキストを追加


vi 文字・行の削除

x          カーソル上の1文字削除
X          カーソルの左の文字を1文字削除
dd         現在の行を削除
ndd        n 行、削除
dw         カーソル上の一語を削除
df字       カーソル位置から指定した1文字(chr) までを削除
d$         カーソル位置から行の最後までを削除
d^         カーソル位置から行の先頭までを削除
:nn,mmd    nn からmm を削除


vi 文字・行の複写

yw         カーソルのある単語をバッファに複写
yy         カーソルのある行をバッファに複写
nyy        カーソルのある行から n 行をバッファに複写
p          カーソルのある行の下にバッファから複写
P          カーソルのある行の上にバッファから複写

部分コピー いったん v でビジュアルモードにして選択範囲をヤンク(y)

      必要な個所でプット(p)


vi 文字の置換

r          カーソルのある1文字を次に指定した文字で置換
R          カーソルのある位置から複数個の文字を置換。
s          カーソルのある1文字を複数個の文字で置換
S          カーソルのある行全体を置換
cc         カーソルのある行全体を置換
cw         カーソルのある位置からこの語の最後まで置換
cf字       カーソルのある位置から指定した1文字( chr )まで置換

(自信がない間は使わないほうがよい!)


vi 文字列の検索と置換

/string               stringを検索(nで下方向に検索、Nで上方向に検索)
?string               stringを検索(nで上方向に検索、Nで下方向に検索)

:[範囲]s/検索文字列/置換後の文字列[オプション]

[g]オプション 同じ行の中に検索文字列が複数存在していた場合でも初期状態では最初に見つかった文字列のみが置換される
        検索文字列にマッチするすべての文字列を置換したい場合は最後に[g]オプションを指定する

[c]オプション 置換時確認が行われる yで置換の実行、y以外で置換せず


:s/str1/str2/          カレント行の最初のstr1をstr2に置換
:s/str1/str2/g         カレント行の全て(global)のstr1をstr2に置換
:s/str1/str2/gc        カレント行の全てのstr1をstr2に確認しながら置換確認は、yで置換の実行、y以外で置換せず

:n,m s/str1/str2/      nからm行の各行内の最初のstr1をstr2に置換
:.,+n s/str1/str2/     カレント行からn行後までの行内最初のstr1をstr2に置換
:.,$ s/str1/str2/      カレント行から最終行までの行内最初のstr1をstr2に置換
:1,. s/str1/str2/      1行目からカレント行までの行内最初のstr1をstr2に置換
:1,$ s/str1/str2/g     1行目から最終行までの全てのstr1をstr2に置換
:% s/str1/str2/g       同上

str1やstr2は正規表現が使えます 例えば   % s/:[0-9][0-9][0-9]://g  を実行すると :〇〇〇: 形式の行番号を削除できます

(自信がない間は使わないほうがよい!)


vi 現ファイルに新ファイルを追加

:r filename     カーソルの下に指定されたファイルを挿入



vi 処理の繰り返し・取り消し

.          直前のコマンドの繰り返し
u          最後の修正を取り消す
Ctrl+R     取り消しの取り消し

U          この行に対して行ったすべての修正を取り消す


vi 設定値

:set             現在のオプションを表示
:set all             全オプションの設定値を表示
:set autoindent    インデントモード (:set ai)
:set number         行番号 (:set nu)
:set tabstop=n     タブ間隔を n に設定する
:set autowrite       ファイル保存が必要な時 は自動的に保存     (:set aw)
:set ignorecase      検索時に大小文字を区別しない    (:set ic)
:set showmode      入力モードの表示をする
:set showmatch     () や {} の対応の報告をする(:set sm)

:set nonumber または、:set nonuのようにnoを付けることでその機能を無効にできる。


vi 設定ファイルの作成



"#####表示設定#####

set number "行番号を表示する
set title "編集中のファイル名を表示
set showmatch "括弧入力時の対応する括弧を表示
syntax on "コードの色分け
set tabstop=2 "インデントをスペース2つ分に設定


以下のファイルを作成してviの動きを確認してください

vi .vimrc