Linux標準教科書　第6章まとめ

# はじめに
こちらの続きです。
[第1章](https://qiita.com/sasao3/items/730a579f2710660195eb)
[第2.3章](https://qiita.com/sasao3/items/1dca5a44ce9898b178b1)
[第4章](https://qiita.com/sasao3/items/69f334d1ee73327dc97e)
[第5章](https://qiita.com/sasao3/items/0b74144123f2a5a4226d)

# viエディタ
本章では、Linuxの設定をするために利用されるvi(vim)の機能のうち、ファイルの開閉やテキストの検索、置換、ページ移動や編集ほほうなど基礎的な操作を学ぶ。

## viの基本操作
viはページャであり、エディタでもある。
viには、コマンドモードとインサートモードの2つがある。

***○コマンドモード***
→行やページ単位の移動、行の削除、コピー、カット、ペーストなど編集操作ができる

***○インサートモード***
→文字入力を受け付けるモード

コマンドモードからインサートモードに切り替えるには「i」または「a」
インサートモードからコマンドモードに切り替えるには「escキー」

インサートモード中は下部分に`-- INSERT --`と表示される。
また、インサートモードの「i」はinsertのことで、カーソルがある位置（文字の前）にテキストを入力する。「a」はappendのことで、カーソルのある文字の後ろにテキストを入力するという違いがある。

また、インサートモードに切り替える際に行の最後に入力したい場合は、「A」コマンドでできる。

### ファイルを開く
書式：`vi ファイル名`

### ファイルを閉じる
ファイルを何も編集していない場合は、コマンドモードで「:q」を実行。
qはquitの略。

編集した状態で、「:q」を押すと、下記エラーがでる

```
No write since last change (add ! to override) //最後の変更が保存されていないとのこと（！をつけて変更を破棄できる、つまりq!のこと）
```

「:q」はただ閉じるだけで、保存をしているわけではないため上記の場合のように、編集をしたのに保存していないでファイルを閉じようとするとこのようなエラーがでる。

この場合、選択肢は2つ。
ファイルを保存しないで終了するか、ファイルを保存（して終了する）。

保存せず強制終了するには、「:q!」を実行する。

ファイルの保存は2つあり、保存するだけの場合は「:w」、保存してファイルを閉じる場合は「:wq」を実行する。
wで保存、qでファイルを閉じるということ。


## インサートモード・コマンドモード

### カーソルの移動
viでのカーソル移動は、h:左/j:下/k:上/l:右 となっている。
CentOS7で利用できるviコマンドでは、カーソルキーでの移動もできる。

また、カーソルキーでの移動だけではなくコマンドを使った移動もある。

`0`:現在の行の行頭へ移動
`$`:現在の行の行末へ移動

他にもたくさんコマンドはあるので、コマンドを駆使することで作業効率があがるのかと思います。

## 編集中の大きな移動
1画面に収まらない大きなファイルを編集する場合は、1文字ずつカーソルを移動するのは非常に大変。ページ単位で移動するコマンドや指定の行へ移動するコマンド、目的の文字列へ移動するコマンドなどがあるためそのコマンド使う。

### ページ単位の移動
次のページへの移動コマンド：`Ctrf + f`
前のページへの移動コマンド：`Ctrf + b`

### 指定の行への移動
指定の行への移動コマンド：`:n`（nは指定行数）
10行目に移動したい場合は、`:10`とすればよい。

### 文書頭、文書末への移動
文書頭への移動コマンド：`gg`
文書末への移動コマンド：`G`

## 様々な編集操作
### 文字や行のカット・アンド・ペースト

カット・アンド・ペーストで使うコマンド

| コマンド | 詳細 | 
|:-----------:|:------------|
| x       |  1文字削除       |
| dd       | 1行削除        |
| yy       | 1行コピー       |
| nyy       |  n行コピー      |
| p       |  カーソルの文字の次または次の行にペースト      |
| P       |  カーソルの文字の前または前の行にペースト      |
| u       |  カット、ペーストを一回取り消し      |

もし間違って文字を消してしまった場合は、`u`を使うことでカットを取り消すことができる。

また、xコマンドで削除した最後の文字（または、ddコマンドで削除した行）はバッファと呼ばれる一時的な箱に入る。そのためpコマンドを実行するとバッファに保存された文字を取り出すことができる。
あくまでも削除した最後の文字（行）のみなので、2つ前に削除した文字は取り出せない。

## 置換と検索
大きなファイルの場合、コマンドを使った移動やページングだけでは目的のものを探すのは大変。
そこで、テキストファイルの中にある文字列を検索するコマンドを使うことで、より素早く移動ができる。

検索と置換に関するコマンド

| コマンド | 詳細 | 
|:-----------:|:------------|
| /検索文字列       |  文字列の検索       |
| n       | 下方向へ再検索        |
| N       | 上方向へ再検索       |
| :対象の行s/検索文字列/置換文字列/オプション       |  文字列を置換する      |

検索した際に、ファイルの中に同じ検索文字列が複数ある場合`n`コマンドや`N`コマンドで繰り返し探すことができる。


### 文字列の置換
先ほどの検索と置換に関するコマンドで紹介したように、文字列を置換するコマンドがある。

書式：`:対象の行s/検索文字列/置換文字列/オプション`

オプションを使用しない場合、最初の対象文字列のみ置換する。複数置換したい場合は、`gオプション`を使用する。

対象の行を省略した場合は、現在のカーソルがある行だけ置換対象にある。

オプション

| オプション | 詳細 | 
|:-----------:|:------------|
| g       |  行全体の対象文字列を置換       |
| gc       | 対象文字列を置換するたびに確認を求める        |


```
//gcオプションを使用した場合、下記のように確認が求められる
replace with t (y/n/a/q/l/^E/^Y)?
```



コマンド実行例

```
$ cat text
aaaaa
bbbbb
text

//実行コマンド　:1s/a/t/g　
//「g」オプションを使うことで、複数の文字列を置換（オプションなしの場合、最初の文字列のみ置換）
ttttt 
bbbbb
text

//実行コマンド　:%s/t/A/g　
//「%」を用いることで、ファイル全体の検索語句を置換している
AAAAA
bbbbb
AexA
```

# まとめ
今回は第6章についてまとめました。
viは慣れは必要ですが、慣れたらキーボード内で完結するため便利なのかなと思います。
基本的な操作について、知ることができ勉強になりました。

以上