MIT講義3 日本語　Editors (Vim)

#ライセンスとクレジット
クレジット
https://missing.csail.mit.edu/2020/editors/
ライセンス
https://creativecommons.org/licenses/by-nc-sa/4.0/
講義動画
https://www.youtube.com/watch?v=a6Q8Na575qc
Todo

# Editors (Vim)
英単語を書くこととコードを書くことは、全く別の活動です。
プログラミングをするときは、長い流れを書くのに比べて、ファイルを切り替えたり、読み込んだり、ナビゲートしたり、コードを編集したりすることに多くの時間を費やします。
英単語を書くためのプログラムとコードを書くためのプログラムが異なるタイプのものがあるのは理にかなっています（例：Microsoft WordとVisual Studio Code）。

プログラマーとして、私たちはコードの編集にほとんどの時間を費やしているので、自分のニーズに合ったエディタをマスターするために時間を投資する価値があります。
ここでは、新しいエディタを習得する方法を説明します。

- チュートリアルから始める（すなわち、この講義に加えて、私たちが指摘するリソースを加えたもの）
- すべてのテキスト編集の必要性のためにエディタを使用することに固執する（たとえそれが最初にあなたを遅くする場合でも）
- 思うがままに調べてみよう：何か良い方法があるように思えれば、おそらくあるだろう


上記の方法で、すべてのテキスト編集目的で新しいプログラムを使用することを全面的に約束した場合、洗練されたテキストエディタを習得するためのタイムラインは次のようになります。
1時間か2時間で、ファイルを開いたり編集したり、保存/終了したり、バッファをナビゲートしたりといった基本的なエディタ機能を学ぶことができます。

20時間も続ければ、以前のエディタを使っていたときと同じくらいの速さで使えるようになるはずです。

その後、新しいエディタを使うことで時間を節約できるほどの知識と記憶力が身につきます。
最新のテキストエディタは、ファンシーでパワフルなツールなので、学習が止まることはありません。

# どのエディタを学ぶべきか？
プログラマーはテキストエディタに対して強い意見を持っています。
https://en.wikipedia.org/wiki/Editor_war


今日はどのエディタが人気があるのでしょうか？
このStack Overflowのアンケートを見てください
https://insights.stackoverflow.com/survey/2019/#development-environments-and-tools
（Stack Overflowのユーザーはプログラマ全体の代表ではないかもしれないので、多少の偏りがあるかもしれません）

Visual Studio Codeが最も人気のあるエディタです。
https://code.visualstudio.com/

コマンドラインベースのエディタでは Vim が最も人気があります。
https://www.vim.org/

## Vim
このクラスの講師は全員Vimをエディタとして使用しています。
Vimの歴史は古く、Viエディタ(1976年)に端を発し、現在も開発が続けられています。
Vimの背後には、いくつかの本当にすてきなアイデアがあり、そのため、多くのツールがVimエミュレーションモードをサポートしています（例えば、140万人がVSコード用にVimエミュレーションをインストールしています）。
https://github.com/VSCodeVim/Vim

最終的に他のテキストエディタに乗り換えることになったとしても、Vim は学ぶ価値があるでしょう。

50分でVimのすべての機能を教えることは不可能なので、ここではVimの哲学を説明し、基本を教え、より高度な機能をいくつか紹介し、ツールをマスターするためのリソースを提供することに焦点を当てていきます。


# Vimの哲学
プログラミングをしているときは、文章を書くのではなく、読む/編集することに時間の大半を費やします。
この理由から、Vimはモーダルエディタです: テキストを挿入するモードとテキストを操作するモードがあります。
Vim はプログラミングが可能で（Vimscript や Python などの他の言語を使って）、Vim のインターフェイス自体がプログラミング言語です：キーストローク（ニーモニック名付き）はコマンドであり、これらのコマンドは合成可能です。
Vim はマウスの使用を避けていますが、それは遅すぎるからです。

最終的には、あなたが考えるスピードに合わせたエディタになります。


# モーダル(特定の機能に制限された？)編集
Vim の設計は、長いテキストストリームを書くのとは対照的に、プログラマーの多くの時間を読み、ナビゲートし、小さな編集を行うことに費やしているという考えに基づいています。
このため、Vim には複数の操作モードがあります。

- Normal: ファイルを移動したり、編集したりするためのものです
- Insert：テキストを挿入するための
- Replace: テキストを置き換えるための
- Visual（プレーン、ライン、またはブロック）：テキストのブロックを選択するためのもの
- Command-line：コマンドを実行するための

キーストロークは操作モードによって意味が異なります。
例えば、Insert モードで `x` という文字を入力すると、リテラル文字「x」が挿入されるだけですが、Normal モードではカーソルの下にある文字を削除し、Visual モードでは選択範囲を削除します。

初期設定では、Vimは左下に現在のモードを表示します。初期/デフォルトのモードはNormalモードです。
通常はNormalモードとInsertモードの間でほとんどの時間を過ごすことになります。

モードを変更するには、`<ESC>（エスケープキー）`を押すと、どのモードからでもNormalモードに戻ります。
Normalモードからは、`i` で Insert モード、`R` で Replace モード、`v` で Visual モード、`V` で Visual Line モード、`<C-v>` (Ctrl-V、時には ^V と書かれることもあります) で Visual Block モード、そして `:` で Command-line モードに入ります。

Vim を使うときは `<ESC>` キーをよく使います: Caps Lock を Escape にリマップすることを検討してください (macOS の説明書)。
https://vim.fandom.com/wiki/Map_caps_lock_to_escape_in_macOS

# 基礎知識
## テキストの挿入
通常モードから`i`を押して挿入モードに入ります。
これで、`<ESC>`を押して通常モードに戻るまで、Vimは他のテキストエディタと同じように動作します。
これは、上で説明した基本的なことに加えて、Vim を使ってファイルの編集を開始するために必要なすべてのことです。
（挿入モードから編集に時間を費やしている場合は、特に効率的ではありませんが）

## バッファ、タブ、ウィンドウ
Vim は「バッファ」と呼ばれる一連のオープンファイルを管理しています。Vim のセッションにはいくつかのタブがあり、それぞれのタブにはいくつかのウィンドウ（スプリットペイン）があります。
各ウィンドウには一つのバッファが表示されます。
ウェブブラウザなどの他のプログラムとは異なり、バッファとウィンドウの間には 1 対 1 の対応関係はありません。
ウィンドウは単なるビューに過ぎません。
あるバッファは、同じタブ内であっても複数のウィンドウで開くことができます。
これは、例えば、ファイルの異なる 2 つの部分を同時に表示するのに非常に便利です。

デフォルトでは、Vim は 1 つのタブで開き、そのタブには 1 つのウィンドウが含まれています。

## コマンドライン
通常モードで `:` を押すと、コマンドモードに入ることができます。
`:`を押すと、画面下部のコマンドラインにカーソルが移動します。
このモードは、ファイルを開いたり、保存したり、閉じたり、Vimを終了したりと多くの機能を持っています。

- :q 閉じる (close window)
- :w 保存 (“書き込み”)
- :wq 保存して終了
- :e {ファイル名} 編集用にファイルを開く
- :ls オープンバッファを表示
- :help {topic} ヘルプを開く
    - `:help :w` は`:w'コマンドのヘルプを開く
    - `:help w`  w の動きのためのヘルプを開きます

#Vimのインターフェースはプログラミング言語
Vimで最も重要な考え方は、Vimのインターフェース自体がプログラミング言語であるということです。
キーストローク（ニーモニックな名前がついている）はコマンドであり、これらのコマンドは構成されています。
これにより、特にコマンドがマッスルメモリーになってしまえば、効率的な動きや編集が可能になります。

##ムーブメント
ほとんどの時間を通常モードで過ごし、移動コマンドを使ってバッファをナビゲートしてください。
Vim の動きは、テキストの塊を指すので、「名詞(nouns)」とも呼ばれます。

- 基本動作: `hjkl` (左, 下, 上, 右)
- 単語: `w` (次の単語), `b` (単語のはじめ), `e` (単語の終わり)
- 行数: `0` (行頭), `^` (空白でない最初の文字), `$` (行末)
- 画面の表示: `H` (画面上部), `M` (画面の中央), `L` (画面下部)
- スクロール: `Ctrl-u` (上), `Ctrl-d` (下)
- ファイル: `gg` (ファイルの先頭), `G` (ファイルの末尾)
- 行番号: :`{番号}<CR>` または `{番号}G (行番号 {番号r})`
- その他: % (対応する項目)
- 検索: f{文字}, t{文字}, F{文字}, T{文字}
    - 現在の行の{文字}を検索して前進/後退させます
    - `,` / `;` マッチをナビゲートするため
- ファイル内の検索: /{正規表現}, マッチをナビゲートするための`n`/`N`


##選択
ビジュアルモード

- ビジュアル: `v`
- ビジュアルライン: `V`
- ビジュアルブロック: `Ctrl-v`

移動キーを使用して選択することができます．


##編集
今までマウスでやっていたことが、動きのコマンドで構成する編集コマンドを使ってキーボードでできるようになりました。
ここからVimのインターフェースがプログラミング言語のように見えてきます。Vim の編集コマンドは「動詞(verbs)」とも呼ばれています。

- `i` 挿入モードに入る
    - テキストの操作や削除には，バックスペース以外を使いたい場合
- `o`/`O`は下/上の行を挿入します．
- `d{motion}` {motion}を削除する
    - 例：`dw`はワードの削除，`d$`は行末への削除，`d0`は行頭への削除
- `c{motion}`　{motion}を変える
    - 例：`cw`は変更後
    - `d{motion}`に続く`i`のような
- `x` 削除文字（＝`dl`)
- `s` 代用文字（＝`xi`)
- ビジュアルモード+操作
    - テキストを選択し，`d`で削除，`c`で変更
- `u`は元に戻す `<C-r>`はやり直す
- `y`はコピー/"yank"(`d`のような他のいくつかのコマンドもコピー)
- `p`は貼り付け
- 他にもたくさんのことを学ぶことができます．
    - 例：`~`文字の大文字小文字を反転させる

##カウント
名詞と動詞をカウントで組み合わせることで、与えられたアクションを何回も実行することができます。

- `3w` 単語を3つ進める
- `5j` 5行目を下に移動
- `7dw` 7単語削除

##修飾語
名詞の意味を変えるために修飾語を使うことができます。
修飾語には、「内側」や「内側」を意味する `i` や「周り」を意味する `a` などがあります。

- `ci(` 現在の括弧の組の内側の内容を変更する
- `ci[` 現在の角括弧のペア内の内容を変更します
- `da'` シングルクォートで囲まれた文字列を削除します


##デモ
壊れたフィズバズの実装
https://en.wikipedia.org/wiki/Fizz_buzz

```bash
def fizz_buzz(limit):
    for i in range(limit):
        if i % 3 == 0:
            print('fizz')
        if i % 5 == 0:
            print('fizz')
        if i % 3 and i % 5:
            print(i)

def main():
    fizz_buzz(10)
```

以下の問題を修正します。

- Main が呼び出されない
- 1ではなく0からスタート
- `15` の倍数のための別の行に「フィズ」と「バズ」を表示します
- 5の倍数の「フィズ」を表示します
- コマンドライン引数を取る代わりに、10のハードコードされた引数を使用します

デモンストレーションはレクチャービデオをご覧ください。
上記の変更をVimを使ってどのように行うか、他のプログラムを使って同じ編集を行う場合と比較してみてください。
Vimではキーストロークが非常に少なく、思った通りのスピードで編集ができることに注目してください。

#Vimのカスタマイズ
`Vim` は `~/.vimrc` にあるプレーンテキストの設定ファイル`（Vimscript のコマンドを含む）`を使ってカスタマイズされます。
おそらく、基本的な設定を有効にしたい場合が多いでしょう。

私たちは、あなたが出発点として使用できる基本的な設定ファイルを提供しています。
これを使うことで、Vim の奇妙なデフォルト動作のいくつかが修正されるので、これを使うことをお勧めします。
ここから設定ファイルをダウンロードして ~/.vimrc に保存してください。
https://missing.csail.mit.edu/2020/files/vimrc

`Vim` は非常にカスタマイズ可能なので、カスタマイズオプションを探すのに時間を費やす価値があります。
インスピレーションを得るために、GitHub上の人々のドットファイルを見ることができます。
例えば、あなたのインストラクターのVim設定(Anish, Jon (neovimを使っています)やJose)などです。
このトピックに関するブログ記事もたくさんあります。
他の人の設定をコピー＆ペーストするのではなく、それを読んで理解し、必要なものを取り入れるようにしましょう。

#Vim の拡張
Vimを拡張するためのプラグインはたくさんあります。
インターネット上で見かける時代遅れのアドバイスに反して、Vim用のプラグインマネージャーを使う必要はありません（Vim 8.0以降）。
代わりに、内蔵のパッケージ管理システムを使うことができます。
単に ~/.vim/pack/vendor/start/ というディレクトリを作成して、そこにプラグインを入れます (git clone などで)。

ここでは私たちのお気に入りのプラグインをいくつか紹介します。

- ctrlp.vim: ファジーファイルファインダ https://github.com/ctrlpvim/ctrlp.vim
- ack.vim: コード検索 https://github.com/mileszs/ack.vim
- nerdtree: ファイルエクスプローラ https://github.com/scrooloose/nerdtree
- vim-easymotion: マジックモーション https://github.com/easymotion/vim-easymotion

ここでは圧倒的に長いプラグインのリストは避けようとしています。
インストラクターのドットファイル（Anish, Jon, Jose）をチェックして、私たちが使っている他のプラグインを見ることができます。
https://github.com/anishathalye/dotfiles
https://github.com/jonhoo/configs
https://github.com/JJGO/dotfiles
もっと素晴らしいVimプラグインはVim Awesomeをチェックしてください。
このトピックに関するブログ記事もたくさんあります："best Vim plugins "で検索してみてください。

#他のプログラムでのVimモード
多くのツールが Vim エミュレーションをサポートしています。
品質は良いものから素晴らしいものまで様々です。
ツールによっては、より高度なVim機能をサポートしていない場合もありますが、ほとんどのツールは基本的なことをしっかりとカバーしています。

##Shell
`Bash` を使っている場合は `set -o vi` を使ってください。
`Zsh` を使う場合は `bindkey -v。Fish` の場合は `fish_vi_key_bindings`。
さらに、どのようなシェルを使っていても、`EDITOR=vim` をエクスポートすることができます。
これは、プログラムがエディタを起動したいときに、どのエディタを起動するかを決めるために使われる環境変数です。
例えば、`git` はコミットメッセージにこのエディタを使います。

##Readline
多くのプログラムでは、コマンドラインインターフェイスに `GNU Readline` ライブラリを使用しています。
https://tiswww.case.edu/php/chet/readline/rltop.html
Readlineは(基本的な)Vimのエミュレーションもサポートしており、次の行を~/.inputrcファイルに追加することで有効にすることができます。

```bash
set editing-mode vi
```

この設定では、例えば、Python REPL は Vim バインディングをサポートします。

##その他
ウェブブラウザ用のvimキーバインド拡張機能もあります 
Google Chrome用のVimiumやFirefox用のTridactylなどが人気です。`Jupyter` ノートブックでも `Vim` バインディングを利用することができます。
ここには `vim` ライクなキーバインドを持つソフトウェアの長いリストがあります。

https://reversed.top/2016-08-13/big-list-of-vim-like-software

#高度なVim
ここでは、エディタの力をお見せするために、いくつかの例をご紹介します。
私たちはこれらのすべてのことを教えることはできませんが、行っていくうちに学んでいくことになるでしょう。
良いヒューリスティック：エディタを使っていて、
「もっと良い方法があるはずだ」と思ったときは、オンラインで調べてみましょう。

##検索と入れ替え
`s` (置換) コマンド 
(ドキュメント http://vim.wikia.com/wiki/Search_and_replace)

- `%s/foo/bar/g`
ファイル内のグローバルに foo を bar に置き換えます。
- `%s/\[.*\](\(.*\))/\1/g`
名前付きMarkdownリンクをプレーンなURLに置き換える

##複数の窓
- `sp` / `:vsp` でウィンドウを分割
- 同じバッファの複数のビューを持つことができます。


##マクロ

- `q{character}`を使用して、レジスタ`{character}`にマクロの記録を開始します。
- `q`で録音を停止する
- `@{character}`はマクロをリプレイします
- エラー時にマクロの実行が停止する
- `{数値}@{文字}`はマクロを`{数値}`回実行する
- マクロは再帰的に利用できる
    - 最初に`q{文字}q`でマクロをクリアします
    - マクロを記録し、`@{character}` を使って再帰的にマクロを呼び出します (記録が完了するまでは何もしません)
- 例：xmlをjsonに変換する(ファイル https://missing.csail.mit.edu/2020/files/example-data.xml)
    - キー "name" / "email "を持つオブジェクトの配列
    - Pythonプログラムを使う？
    - sed / 正規表現を使う
        - `g/people/d`
        - %s/<person>/{/g`
        - `%s/<name>\(.*\)<\/name>/"name": "\1",/g`
        - …
- `Vim` コマンド / マクロ
    - `Gdd`, `ggdd` 最初と最後の行を削除します。
    - 単一の要素をフォーマットするマクロ (レジスタ `e`)
        - `<名前>`の行に移動します。
        - `qe^r "f>s"。"<ESC>f<C"<ESC>q`
    - 人物をフォーマットするマクロ
        - `<person>`と一緒に行へ
        - `qpS{<ESC>j@eA,<ESC>j@ejS},<ESC>q`
    - 人をフォーマットして次の人に移動するマクロ
        - `<person>`と一緒に行へ
        - `qq@pjq`
    - ファイルの最後までマクロを実行
    - `999@q`
    - ラストを手動で削除し、`[`と`]`区切り文字を追加します。

#リソース（文献
- vimtutor は Vim にインストールされているチュートリアルです - Vim がインストールされていれば、シェルから vimtutor を実行できるはずです
- Vimの冒険は、Vimを学ぶためのゲームです
https://vim-adventures.com/

- Vim Tips Wiki
http://vim.wikia.com/wiki/Vim_Tips_Wiki

- Vim Advent Calendarには様々なVimのヒントがあります。
https://vimways.org/2019/

- Vim Golfはコードゴルフですが、プログラミング言語がVimのUIになっているところ
http://www.vimgolf.com/

- Vi/Vim スタック交換
https://vi.stackexchange.com/

- Vim スクリーンキャスト
http://vimcasts.org/

- 実用Vim
https://pragprog.com/titles/dnvim2/

#演習
1. 完全な `vimtutor` です。注意: 80x24 (80列×24行) のターミナルウィンドウで見るのがベストです。
2. 基本的な `vimrc` をダウンロードして `~/.vimrc` に保存します。よくコメントされたファイルを読んで（Vim を使って！）、新しい設定で Vim がどのように見え、どのように振る舞うかを観察してください。
3. プラグインをインストールして設定します: `ctrlp.vim`
    4. `mkdir -p ~/.vim/pack/vendor/start` でプラグインディレクトリを作成します。
    5. プラグインのダウンロード: `cd ~/.vim/pack/vendor/start; git clone https://github.com/ctrlpvim/ctrlp.vim`
    6. プラグインのドキュメントを読んでください。プロジェクトディレクトリに移動して `Vim` を開き、`Vim` コマンドラインを使って `:CtrlP` を起動して、`CtrlP` を使ってファイルを探してみてください。https://github.com/ctrlpvim/ctrlp.vim/blob/master/readme.md
    7. `CtrlP` をカスタマイズするには、`~/.vimrc` に設定を追加し、`Ctrl-P` を押して `CtrlP` を開くようにします。
8. `Vim` の使い方を練習するには、講義のデモを自分のマシンでやり直してください。
9. これから1ヶ月間のテキスト編集はすべてVimで行いましょう。何か効率が悪いと思った時や、「もっといい方法があるはずだ」と思った時は、ググってみてください。困ったときは、営業時間内に来ていただくか、メールでお問い合わせください。
10. 他のツールでVimバインディングを使用するように設定します（上記の手順を参照）。
11. さらに ~/.vimrc をカスタマイズし、さらにプラグインをインストールします。
(詳細) Vim マクロを使用して XML を JSON に変換します (サンプルファイル)。これは自分でやってみてくださいが、行き詰ったら上記のマクロのセクションを見てください。