Vim入門 置換 ~プラグインを使って楽に置換~

**`ターゲットとしている人`**
　- Vim初心者の方
　- Vimで置換の方法がわからない人
　- Vimで置換のプラグインをまだ使ってない人

**`この記事を読むと理解できる事`**
 - Vimで楽に置換をする方法が理解できる
 - プラグインマネージャのインストールができる
 - 置換プラグインを利用することができる

## はじめに
この記事では初心者向けに置換の仕方やプラグインの利用の仕方までを簡潔にまとめたものです。
以下の`sample.txt`を例として置換する方法を記述します。

```text:sample.txt
hoge
hoge
hoge
fuga
piyo
hoge
```

## 対象の文字全てを置換
対象の文字全てを置換する場合、vimでは以下のようにすることで置換することができます。

```vim
:%s/置換前の文字/置換後の文字/g
```

末尾の`g`は**対象のファイルの該当する全てに対して置換**という意味です。

仮に、`sample.txt`の**`hoge`という文字全てを`foo!!`に変換したい**状況だとしましょう

その場合は以下のようにすることで置換することが可能です！

```vim
:%s/hoge/foo!!/g
```

**結果**

```text:sample.txt
foo!!
foo!!
foo!!
fuga
piyo
foo!!
```

## 特定した行のみ置換する
先ほどは**全行**の置換でした。以下のようにすると指定した行のみを置換することができます。

```vim
範囲の最初の行,範囲の最後の行s/置換前の文字/置換後の文字/g
```

仮に、`sample.txt`の**1 ~ 4行目の`hoge`という文字全てを`foo!!`に変換したい**状況だとしましょう

その場合は以下のようにします！

```vim
1,4s/hoge/foo!!/g
```

**結果**

```text:sample.txt
foo!!
foo!!
foo!!
fuga
piyo
hoge
```


## mapを活用しよう
でもちょっと待ってください。いちいち`:%s`などをいちいちタイピングするのは非常に作業効率が悪いのではないのでしょうか。（めんどくさいし）

そんなときは`.vimrc`に`map`を追加して楽をしましょう！

```vim:.vimrc
" この行はお使いの.vimrcにまだ書いていないのなら、これを追加してください
let mapleader = "\<Space>"

" Spaceを押した後にrを押すと :%s/// が自動で入力される
nnoremap <Leader>r :%s///g<Left><Left><Left>
```

この設定を加えた後に**Spaceを押してrを押すと**以下のようになると思います

<img width="741" alt="Screen Shot 2020-08-01 at 23.13.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155635/54c06f74-ec6c-ef83-49ad-54e960f36245.png">

自動で`:%s///`と言う文字が入力されました！

このような感じで`map`を利用すると楽をすることができるので、どんどん利用しましょう！

## プラグインを使って置換する
プラグインを使って楽をして置換をすることができます。

筆者が調べた感じ、以下のプラグインが人気のようでした

- [far.vim](https://github.com/brooth/far.vim)
- [vim-subversive](https://github.com/svermeulen/vim-subversive)

いずれも高性能なプラグインなのでこちらを利用して見てください。

ついでに、自作したプラグインを宣伝させてください🙇‍♂️

[vim-easy-replace (ソースコードはこちらから)](https://github.com/kqito/vim-easy-replace)

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155635/d4142d89-0c98-18c3-8637-75aef1120701.gif)

##### 以下のような特徴があります
- 置換対象となる文字をリアルタイムでハイライト
- `:%s/`のような文字を打つ必要がない
- 簡単操作
- 指定した行数に対してのハイライト・置換が可能

### インストール方法
**既にVimプラグインマネージャを利用している方は読む必要はありません。**

まずはVimのプラグインを管理するプラグインマネージャをインストールしましょう！

この記事では例として[vim-plug](https://github.com/junegunn/vim-plug)をインストールします。（より詳細を知りたい方はvim-plugの[README](https://github.com/junegunn/vim-plug/blob/master/README.md)を見るとより理解が深まると思います）

まずはターミナルを開き、以下のコマンドで`vim-plug`をインストールしましょう

```shell
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

次に、`.vimrc`を開いて、以下を追加しましょう!!

```vim:.vimrc

call plug#begin('~/.vim/plugged')

" vim-easy-replaceを利用する
Plug 'kqito/vim-easy-replace'

call plug#end()
```

上記を追加したら、一旦vimを終了し、再度vimを開き直します。

最後に`:PlugInstall`と入力し、実行します。

これで`vim-plug`と`vim-easy-replace`のインストールが完了しました！

そして、以下のコードがまだ.vimrcに書いていないのなら追記しておきましょう！

```vim:vimrc
let mapleader = "\<Space>"
```

### 利用方法
#### 一般的な利用
初期設定は`<Leader>ra`となっているので、**「スペース、r、a」**と押すことで起動することができます。

その後は`置換対象`を入力し、その後、`置換後の文字`を入れるだけです。

![normal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155635/de6de6ff-7aaf-b115-a46c-379edf959ddd.gif)

また、`<Leader>rc`と入力するとカーソル下にある単語を置換対象とすることができます。

### 指定した範囲での置換
Vimでは`v`を押すとビジュアルモードに移ることができ、範囲を指定することができます。
この状態で`<Leader>ra`または`<Leader>rc`することでその範囲に対して置換することができます。

![v.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155635/c9d1f021-83a0-dcc1-6cce-12514a419326.gif)

### 設定
`<Leader>ra`などのmapを変更したい場合には以下のような設定を`.vimrc`に追記することで変更が可能です。

```vim:.vimrc
" Easy-replaceを使う (デフォルト: <Leader>ra)
let g:easy_replace_launch_key = '新しいmap'

" ビジュアルモードからeasy-replaceを使う (デフォルト: <Leader>ra)
let g:easy_replace_launch_in_visual_key = '新しいmap'

" カーソル下の単語に対してeasy-replaceを使う (デフォルト: <Leader>rc)
let g:easy_replace_launch_cword_key = '新しいmap'

" カーソル下の単語に対してビジュアルモードからeasy-replaceを使う (デフォルト: <Leader>rc)
let g:easy_replace_launch_cword_in_visual_key = '新しいmap'
```

また、ハイライトの色を変えるには以下を追記します。

```vim:.vimrc
let g:easy_replace_highlight_ctermbg = '新しい色'
let g:easy_replace_highlight_guibg = '新しい色'
```

さらに詳しい設定は[こちら](https://github.com/kqito/vim-easy-replace)にまとめてあります。

## その他のプラグイン
世の中にはたくさんのプラグインがありますので是非利用してみてください
#### LSP系
- [coc.nvim](https://github.com/neoclide/coc.nvim)
- [vim-lsp](https://github.com/prabirshrestha/vim-lsp)

#### 筆者が利用しているおすすめプラグイン
- [nerdtree](https://github.com/preservim/nerdtree)
- [winresizer](https://github.com/simeji/winresizer)
- [vim-surround](https://github.com/tpope/vim-surround)

## こちらも参考になります
- [俺的にはずせない【Vim】こだわりのmap（説明付き）](https://qiita.com/itmammoth/items/312246b4b7688875d023#1%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E4%B8%8B%E3%81%AE%E5%8D%98%E8%AA%9E%E3%82%92%E3%83%8F%E3%82%A4%E3%83%A9%E3%82%A4%E3%83%88%E3%81%99%E3%82%8B)
- [【詳解】モテたいVimmer必見　快適にコーディングするためのvimrc解説](https://qiita.com/ahiruman5/items/4f3c845500c172a02935)
- [tmuxを効率よく使って開発を爆速にする最高の設定](https://qiita.com/yuki_ycino/items/ef5e6b63c8f9af2f03c0)