[Vim/vim-mode-plus for Atom] 秒速で初心者からエキスパートになる。 たった７ステップで。

# 秒速で初心者からエキスパートになる。 たった７ステップで。

[vimconf2016の発表](http://qiita.com/t9md/items/0bc7eaff726d099943eb)で使用したサンプルデモ

[High speed tour from beginner to expert in 7 steps](
https://github.com/t9md/atom-vim-mode-plus/wiki/AdvancedTopicTutorial#high-speed-tour-from-beginner-to-expert-in-7-steps) の抜粋版

※ step5以降は要 [vim-mode-plus](https://atom.io/packages/vim-mode-plus)

1. ビジュアルモードは知ってるよね？
2. TextObject を使えや
3. もっとええ Operator つかえや
4. Operator と TextObject を組み合わせてみよう
5. Operator の動作を `o` で変更してみよう. Occurrence に対して、Operate するようになるよ！
6. preset-occurrence を使ってみよう
7. persistent-selection(消えないセレクション)を使ってみよう

## チュートリアルで使用するテキスト

```
This is 1st paragraph text.
2nd line also include text text text.
3rd line include text text text

This is 2nd paragraph text.
2nd line also include text text text.
3rd line include text text text
4th text
```

## 1. ビジュアルモードは知ってるよね？

最初のパラグラフを `abc` に書き換えて.  
`visual-mode` でパラグラフ選択できるよね？  

![](https://raw.githubusercontent.com/t9md/t9md/7b96df2182c13b519887e20210880fc93861a75c/img/vim-mode-plus/advanced-tutorial/step-1.gif)

1. `v j j $` or `V j j`
2. `d` で消す。
3. `i` で `insert-mode` にはいって
4. `abc` と入力したら `escape`

## 2. TextObject を使えや

`TextObject` を使えばもっと良くなるよ。  
パラグラフ全体を `i p`(`inner-paragraph`) で選択してみろ。  

![](https://raw.githubusercontent.com/t9md/t9md/c91703a5ec63cac74243f902d8b49939f3275c58/img/vim-mode-plus/advanced-tutorial/step-2.gif)

1. `v i p`
2. `d` で消す.
3. `i` で `insert-mode` にはいって
4. `abc` と入力したら `escape`

## 3. もっとええ Operator つかえや.

もっと良い `Operator` を使えばもっと良くなる。  
`d` で消してから `i` で `insert-mode` に入るより、`c` を使えば両方一気にやれるぞ！  

![](https://raw.githubusercontent.com/t9md/t9md/5d9edf78e0107e55eb343f9cfb1ed5f4b113dfb0/img/vim-mode-plus/advanced-tutorial/step-3.gif)

1. `v i p`
2. `c` で `change` しよう.パラグラフ全体が `delete` されて、今キミは `insert-mode` にいる！
3. `abc` と入力したら `escape`

## 4. Operator と TextObject を組み合わせてみよう

`visual-mode` を使わなければ、もっと良くなる。  

![](https://raw.githubusercontent.com/t9md/t9md/5d9edf78e0107e55eb343f9cfb1ed5f4b113dfb0/img/vim-mode-plus/advanced-tutorial/step-4.gif)

1. `c i p` でパラグラフ自体を `change` してみて。Operator が最初で、次に Target(TextObject) の順番だ
2. `abc` と入力したら `escape`
3. 2番目のパラグラフで `.` リピートしてみよう

## 5. Operator の動作を `o` で変更してみよう。 Occurrence に対して、Operate するようになるよ！

新しいミッションを与える  
今回は、パラグラフ全体を `abc` に変えるんじゃなくて、パラグラフ内の `text` という文字列のみを `abc` に変えてほしい。  
`o` Operator modifier は、まさにこの為にある！  

![](https://raw.githubusercontent.com/t9md/t9md/5d9edf78e0107e55eb343f9cfb1ed5f4b113dfb0/img/vim-mode-plus/advanced-tutorial/step-5.gif)

1. 最初のパラグラフの `text` という文字に移動して
2. `c o i p` か `c o p` と打って
3. `abc` と入力したら `escape`
4. 2番目のパラグラフで `.` リピートしてみよう

何が起こった？  
`o` は、カーソルの下の単語をまず、keyword としてピックアップする。そして、ターゲットの中で出くわす(`occurrences`)、keyword に対して Operator を apply するようになるんだ。  

今までみたいに、パラグラフ全体を `change` して `abc` に変える代わりに  
パラグラフの中で出くわす `text`(カーソル下の単語) を `change` するようになったんだ。  
内部的には、こうなっている  

- 通常: パラグラフを `select` して `change`
- `o` modifier: パラグラフを `select` して, 更にその中から `text` を `select` し直して(`re-select`) `change`

## 6.preset-occurrence を使ってみよう

新しいミッションを与える  
今回は `text` と `line` の両方を `abc` に変更して欲しい。  
つまり **2つ!!** のキーワードを変えてほしい。  
`preset-occurrence` はこういう時に使える。  
`o` をオペレーションの途中に挟み込む代わりに、前もって occurrence keyword を指定しておけるんだ。  

![](https://raw.githubusercontent.com/t9md/t9md/5d9edf78e0107e55eb343f9cfb1ed5f4b113dfb0/img/vim-mode-plus/advanced-tutorial/step-6.gif)

1. 1行目の `text` に移動して `g o`とタイプ
2. 2行目の `line` に移動して `g o` とタイプ
3. `c o i p` か `c o p` と打って.
4. `abc` と入力したら `escape`.
5. 2番目のパラグラフで `.` リピートしてみよう

## 7. persistent-selection(消えないセレクション)を使ってみよう

新しいミッションを与える  
`text` と `line` の両方を `abc` に変更して欲しい。ただし、２番目のパラグラフの２行目だけは変えないで欲しい。  
なんてこった。単純な `.` リピートが使えない！  
`persistent-selection` はこういう時使える。  

![](https://github.com/t9md/t9md/blob/master/img/vim-mode-plus/advanced-tutorial/step-7.gif?raw=true)

1. `text` と `line` に `g o` で preset-occurrence して
2. `v i p` でパラグラフ選択、そのまま `j j` で2番目のパラグラフの１行目まで選択して、`enter`。普通の selection が `persistent-selection` になった
3. `j j` で 2番目のパラグラフの3行目に移動して、`V j`
4. よし、準備は整った。`c` で変更しよう
5. `abc` と入力したら `escape`

## さらに難しいミッション

以下のサンプルテキストから、 vim-mode-plus のコマンド名を PascalCase 形式で抜き出して、さらにアルファベット順に並び替えて。

### From-short

```
"'": 'vim-mode-plus:move-to-mark-line'
```

### To-short
```
MoveToMarkLine
```

### From-full

```
'`': 'vim-mode-plus:move-to-mark'
"'": 'vim-mode-plus:move-to-mark-line'

'/': 'vim-mode-plus:search'
'?': 'vim-mode-plus:search-backwards'
'*': 'vim-mode-plus:search-current-word'
'#': 'vim-mode-plus:search-current-word-backwards'
'n': 'vim-mode-plus:repeat-search'
'N': 'vim-mode-plus:repeat-search-reverse'

'%': 'vim-mode-plus:move-to-pair'

')': 'vim-mode-plus:move-to-next-sentence'
'(': 'vim-mode-plus:move-to-previous-sentence'
# ')': 'vim-mode-plus:move-to-next-sentence-skip-blank-row'
# '(': 'vim-mode-plus:move-to-previous-sentence-skip-blank-row'

'[': 'vim-mode-plus:move-up-to-edge'
']': 'vim-mode-plus:move-down-to-edge'

'}': 'vim-mode-plus:move-to-next-paragraph'
'{': 'vim-mode-plus:move-to-previous-paragraph'

'G': 'vim-mode-plus:move-to-last-line'
'g g': 'vim-mode-plus:move-to-first-line'

'H': 'vim-mode-plus:move-to-top-of-screen'
'L': 'vim-mode-plus:move-to-bottom-of-screen'
'M': 'vim-mode-plus:move-to-middle-of-screen'
```

### To-full

```
MoveDownToEdge
MoveToBottomOfScreen
MoveToFirstLine
MoveToLastLine
MoveToMark
MoveToMarkLine
MoveToMiddleOfScreen
MoveToNextParagraph
MoveToNextSentence
MoveToNextSentenceSkipBlankRow
MoveToPair
MoveToPreviousParagraph
MoveToPreviousSentence
MoveToPreviousSentenceSkipBlankRow
MoveToTopOfScreen
MoveUpToEdge
RepeatSearch
RepeatSearchReverse
Search
SearchBackwards
SearchCurrentWord
SearchCurrentWordBackwards
```

### 答え(色んなやり方があるけど一つだけ)

- キーバーインドは Mac の人前提
- `incrementalSearch` を有効にする必要あり

![](https://raw.githubusercontent.com/t9md/t9md/247b72ce21f5e5e72145b19163c7978e66c2f3cd/img/vim-mode-plus/advanced-tutorial/step-8.gif)

1. `/` で incremental-search を開始。
2. `.*plus:` と入力し、ハイライトを確認(これがこれから `change` するところ)
3. `ctrl-cmd-c` (検索マッチ対象に対して、`change`)。operator-pending モードに入るので、対象範囲を指定する必要がある。
4. `i e` (`inner-entire`) テキストオブジェクトを指定。これでファイル全体を対象範囲として指定した。
5. `insert-mode` にいるので、`ctrl-e` でカーソルを行末に移動し、`ctrl-h` で行末のシングルクォート(`'`)を消す。
6. `escape` で `normal-mode` に戻る。この時点でまだマルチカーソルは残っている。
7. `g C i W` (`pascal-case`) を `i W`(`inner-whole-word`) に apply. `dash-case` が `DashCase` になる。
8. `g g` で行頭に異動。`g s G`。現在位置から、ファイルの最後の行まで(`G`) を `g s`(`sort`)。これで sort された！
9. `d i p` で sort の結果集まった 空行を消して DONE!


書いてみると複雑なステップだが、慣れの問題だ！
"でも操作遅いやん"と思うかもしれなけど、動画用に遅くしてるんだヨ！ホントは目にも留まらぬ速さだヨ！
**"自分にはそんな難しいの覚えられない"という人もいるけど、覚える必要なんてないよ！
繰り返し練習して、指が勝手に動くようになるまで、マッスルメモリー、フィンガーメモリーに叩き込むのみだ!
ピアノの運指、空手の型、野球の素振り、英語の発音とおんなじだ！特訓あるのみ！！**