# TLCL 輪読会
### 12 – A Gentle Introduction to vi
2022/10/18 [@kdnakt](https://twitter.com/kdnakt)
---
## 今日の範囲
### 12 – A Gentle Introduction to vi
- Why We Should Learn vi
- A Little Background
- Editing Modes
- Moving the Cursor Around
- Basic Editing
- Search-and-Replace
- Editing Multiple Files
- Saving Our Work
---
### vi ("vee eye")
- Unixのコアプログラムの1つ
- テキストエディタ
- UIが難しい
- 達人のキーボード捌きは芸術的
- 本章では基礎を扱う
---
#### Why We Should Learn vi p.141
- viはGUIなしでも使える
- viは軽量で高速
- 高速タイピング向けデザイン
---
#### A Little Background p.142
- 1976年UCバークレイ校のBill Joyが開発
- 後にSun Microsystemsに入社
- "visual"に由来
- :no_good: ラインエディタ
- :no_good: プリンター・ターミナル
- ラインエディタexを内包
- Linuxディストロにはviでなくvimが同梱
- Bram Moolenaarが開発
- "vi imporoved"
- 以降、viと書くが実態はvim
----
##### Starting and Stopping vi p.142
- 起動する
```
$ vi
```
- 終了する
```
// コロンもコマンドの一部
:q
// 強制終了(未保存で終了できない時など)
:q!
```
----
##### Compatibility Mode p.143
- 通常デフォルトはviに近い動作モード
- vimとしての高度なモードも利用可能
```
// .bashrcファイル
alias vi='vim'
// .vimrcファイル
set nocp
```
- ディストリビューションによっては最小機能のみ
- フル機能バージョンをインストール可能
---
#### Editing Modes p.144
- 新規ファイルを作成する
```
// 存在しないファイル名を渡す
$ vi foo.txt
```
- ティルダ:テキストなしの行を示す
- viにはモードがある
- 起動時はコマンドモード
----
##### Entering Insert Mode p.145
- ファイルを編集するには入力モードに切り替える
- iキーを押すと下部に次の表示
```
-- INSERT --
```
- コマンドモードに戻る:Escキー
----
##### Saving Our Work p.145
- 保存にはコマンドモードでexのコマンドを利用
- :キー+コマンド
```
// 修正ファイルを書き込む(最後にエンター
:w
// 画面下部に以下のような表示
"foo.txt" [New] 1L, 46C written
```
---
#### Moving the Cursor Around p.146
- 移動コマンドのいくつかはlessと共通
|Key |カーソル移動|
|-----|--------|
|l,→|右に1文字 |
|h,←|左に1文字 |
|j,↓|下に1文字|
|k,↑|上に1文字|
- ※初期は矢印キーのない端末もあった
----
|Key |カーソル移動|
|-----|--------|
|0|現在行の最初|
|^|現在行の最初の非空白文字|
|$|現在行の最後|
|w|次の単語の最初、または句読点|
|W|次の単語の最初、句読点は無視|
|b|前の単語の最初、または句読点|
|B|前の単語の最初、句読点は無視|
----
|Key |カーソル移動|
|-----|--------|
|Ctrl-f|1ページ下|
|Ctrl-b|1ページ上|
|数字G|指定の行数へ|
|G|ファイルの最終行|
- ※数字とキーを組み合わせることも可
- 例:5j=5文字下
---
#### Basic Editing p.147
- uコマンド:最後の変更をundo
----
##### Appending Text p.147
- aコマンド:テキストをappendする
- Aコマンド:テキストを行末にappend
----
##### Opening a Line p.148
- oコマンド:現在行の下に行を追加
- Oコマンド:現在行の上に行を追加
----
##### Deleting Text p.149
- xコマンド:カーソル位置の1文字削除
- 例)3x:3文字削除
- ddコマンド:現在行を削除
- 例)5dd:現在行から5行削除
----
##### 削除コマンドつづき
- dWコマンド:現在位置から次の単語の開始まで削除
- d$コマンド:現在行のカーソル以降を削除
- d0コマンド:現在行のカーソル以前を削除
- d^コマンド:カーソルから現在行の次の非空白文字まで削除
- dGコマンド:現在行からファイル末尾まで削除
- d20Gコマンド:現在行から20行削除
----
##### Cutting, Copying, and Pasting Text p.150
- dコマンド:削除だけでなく「切り取り」も
- pコマンドで1行下に貼り付け
- Pコマンドで1行上に貼り付け
|Key |コピー対象|
|-----|--------|
|yy|現在行|
|5yy|現在行と次の4行|
----
|Key |コピー対象|
|-----|--------|
|yW|現在位置から次の単語の開始まで|
|y$|現在位置から現在行の終わりまで|
|y0|現在位置から現在行の最初まで|
|y^|現在位置から行内の最初の非空白文字まで|
|yG|現在行からファイル末尾まで|
|y20G|現在行から20行目まで|
----
##### Joining Lines p.152
- 行末に移動して改行コードを削除することはできない
- Jコマンドで可能
- ※jコマンドは移動用
---
#### Search-and-Replace p.152
- 検索してカーソル移動もできる
- 1行でもファイル全体でも可
- 置換もできる
----
##### Searching Within a Line p.152
- fコマンド:行内検索
- faと入力:aの文字を検索
----
##### Searching the Entire File p.152
- /コマンド:単語の出現場所へカーソル移動
- lessと同じ
- nコマンドで次の検索結果へ
- 正規表現での検索も可能
- 詳細は19章で
----
##### Global Search-and-Replace p.153
```
// substitutionと呼ばれるexのコマンド
// Lineをlineに置換
:%s/Line/line/g
```
- 操作範囲の指定
- %:ファイル全体
- 1,5:1-5行目
- 1,$:1行目からファイル末尾まで
- なし:現在行
- s:substitution
- /Line/line/:置換前後の文字列
- g:出現箇所全てを置換
- c:置換時にユーザー確認
---
#### Editing Multiple Files p.155
- 複数ファイルの同時編集も可能
```
$ vi file1 file2 file3 ...
```
----
##### Switching Between Files p.156
- :bnコマンド:次のファイルへ
- :bfコマンド:前のファイルへ
- :buffersコマンド:編集中ファイル一覧
- :buffer 数字コマンドでファイル表示
----
##### Opening Additional Files for Editing p.157
- 現在のセッションにファイルを追加
```
// viを起動
$ vi foo.txt
// 2つ目のファイルを追加
:e bar.txt
```
----
##### Copying Content from One File into Another p.157
- yyコマンドでコピー
- :buffer 2で2番目のファイルを開く
- pコマンドで貼り付け
----
##### Inserting an Entire File into Another p.158
- カーソル位置に別ファイルを読み込む
```
:r ファイル名
```
---
#### Saving Our Work p.159
- :wコマンドだけではない
- コマンドモードでZZ:保存してviを終了
- :wqコマンドでも同様
- :wコマンドでファイル名を指定可能
```
$ vi foo.txt
// foo1.txtとして別名で保存
:w foo1.txt
// 注意:保存後も編集するのは元のfoo.txt
```
---
#### Summing Up p.160
- これで典型的なLinuxシステムのメンテは可能
- vim習得は長期的にお得
- lessなど他のプログラムに影響
---
#### Further Reading p.160
- [Vim, with Vigor](http://linuxcommand.org/lc3_adv_vimvigor.php)
- [Learning The vi Editor](http://en.wikibooks.org/wiki/Vi)
- [The Vim Book](ftp://ftp.vim.org/pub/vim/doc/book/vimbook-OPL.pdf.)
{"metaMigratedAt":"2023-06-17T11:59:18.227Z","metaMigratedFrom":"YAML","title":"TLCL 輪読会","breaks":"true","slideOptions":"{\"transition\":\"slide\"}","contributors":"[{\"id\":\"df36d0f0-b67e-41ac-96b3-f3988326d230\",\"add\":4727,\"del\":136}]"}