IntelliJ IDEA｜かゆいところに手が届くIntelliJのイカしたやつら

![mac-os](https://img.shields.io/badge/macOS-10.14.6 と 10.14.1-<COLOR>) ![ide-ver](https://img.shields.io/badge/IntelliJ IDEA-2020.2-<COLOR>)![keymap](https://img.shields.io/badge/Keymap-Mac OS X 10.5+ copy （ここひとつですんごく変わる）
-<COLOR>)

![dokusha](https://img.shields.io/badge/想定読者-自分の作業プロセスは迷うことなく操作できる-orange)



## はじめに
[前回](https://qiita.com/akiya3/items/5b750dca2809379d7e0f)に続き、今回もIntelliJの機能を紹介していきます。
基本機能を使いこなし始めたあの日に知っていたならば・・・と思った機能を紹介します。

限定的な場面でしか利用しない機能もあるのでつまみ食いで覚えていくとよきですね。

---

### String Manipulation
2020年ワタシ的ベストプラグイン、栄えある１位を勝ち取ったString Manipulation。
name：`Popup String Manipulation ...` 
key：`option + shift + M`

#### シーケンス作成
数字のついていない単語に対してはシーケンスを作成してくれないようなんです。
▼下記で紹介している `Add Selection for Next Occurrence`などで単語選択して、一旦数字を入れる手間が必要になります
![create_s.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/5acb0fc9-8744-8db3-00e7-2fb483712c5d.gif)

作成されるシーケンスは選択範囲の一番小さい数を元に作成されるのでいきなり100番とかもできますね。

ただこの子、ちょっと冴えないところがあって……

▼下記のような１行に複数の数字がある構造だと
![let_ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/2b8ca37d-c556-7bad-8b3b-5703fb919b33.png)

▼そうじゃないんだよな・・・って感じになってしまうんですね
![let_ss_s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/63f76d91-4419-e57e-70a5-ebfa1dbb89a5.png)

あとは数字は１ずつしか増減できないところとか。
IntelliJのマクロを使ったことないのでなんとも言えませんが、引数を受け取れるならマクロと組み合わせて・・・とできそうですがそこまでやるならVim使えって話ですし。

なんかいい方法ないかな・・・

name：`Create Sequence` 
key：`control + option + shift + command + S`

#### インクリメント
選択範囲の数字を１足していく
name：`Increment` 
key：`control + option + shift + command + +`



#### デクリメント
選択範囲の数字を１引いていく
name：`Decrement` 
key：`control + option + shift + command + -`

String Manipulationは使い始めてからまだ1ヶ月とかそのぐらいなので、これからどんどん使い倒していこうと思います。
便利な使い方があったら教えてくださいね！


---

### 次の単語へ移動
選択されている単語に一致する次の単語に移動してくれます
![find_next.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/36a9ea68-129a-9f45-0451-86046cd2e7cf.gif)

`command + F`の検索を通さなくて済むので便利ですね


name：`Find Next / Move to Next Occurrence` 
key：`command + G`


---

### 単語をひとつずつ選択
上記の`Find Next / Move to Next Occurrence` と似ているがこちらは移動するごとに選択状態を維持してくれるもの

![g_karano_henkan.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/bb213a3d-dbbb-bdb5-fc8b-e812c227a2ef.gif)



name：`Add Selection for Next Occurrence` 
key：`control + G`

---

### ファイル内単語全選択
上記の`Add Selection for Next Occurrence` のファイル内一括選択版

![subetesentaku_henkan.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/810b4531-671a-c6d3-1aa2-90179148d9e7.gif)


name：`Select All Occurrences` 
key：`control + command + G`

---

### オプション２回連打からの矢印でマルチカーソル
![multi_c.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/c018b118-9197-7d08-c569-9c71910758d3.gif)


name：`不明` 
key：`option ２連打（連打後ホールド）` + `↑` or `↓`


---

### 単語ごとに移動
macのoption + 左右矢印と同じですね。

#### 次へ移動
name：`Move Caret to Next Word` 
key：`control + \`

#### 前へ移動
name：`Move Caret to Previous Word` 
key：`control + '`

---

### 単語ごとを選択しながら移動
macのoption + shift + 左右矢印と同じですね。

#### 次へ
name：`Move Caret to Next Word with Selection` 
key：`control + W`

#### 前へ
name：`Move Caret to Previous Word with Selection` 
key：`control + shift + W`

---

### 拡張選択
![ex_select.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/d59ecdf3-f367-01ec-1491-13bb09f1cc0c.gif)

最初にカーソルを合わせる位置によって選択される手数が違うのでいろいろ試してみてください。
GIFで言うと１２行めの最初にカーソルを置いて呼び出せばbirthメソッド全体を１回で選択してくれる。ちょーべんりです。


name：`Extend Selection` 
key：`option + ↑`

---

### 選択範囲縮小
`Extend Selection`の逆バージョン。選択範囲を小さくしていく。
name：`Shrink Selection` 
key：`option + ↓`


---

### 選択範囲内で置換
いつの日からかIntelliJでも選択範囲からのみの置換ができるようになっていた。

多分ver 2020〜だと思うんですけど、置換・検索のマッチングで正規表現やWord一致にショートカットが割り当てられていて使いやすくなりましたね！

よく利用するコンボが 拡張選択 -> これ

name：`Replace...` 
key：範囲を選択して `command + R`

---

### 単語登録
たとえば「Qiita」など、造語やJapanese的には正しいんだけどEnglish的には正しくないワードを扱うときに、警告を出されると気に障るので適宜直していきます。
自分が開発しているサービス名などがtypo判定されるのって癪に障りますよね。

name：`Show Context Actions` 
key：typoって言っている箇所で`option + enter` -> `Save ~~ to dictionary`

▼辞書登録したものは下記から確認、登録、削除ができるようになっている
![spelling.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/f2626b44-7332-3010-c420-18aa08f518ab.png)

---

### 警告内容の表示
なにか間違いがあるとコードに波線が引かれるようになっているのでその詳細を確認します。
エラー内容がコピーしづらいのがいまいち
name：`Error Description` 
key：`command + F1`

---

### つまりこれがしたいのか？を提案してくれる

▼ワンライナーをdoつきのブロックに変換したり
![convert_onelinner.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/7d1e64e5-991c-0b9e-a055-e1d09ccffe38.gif)


▼typoしている箇所でTypo Rename toを選択すれば候補を持ってきてくれたり

![recommend_typo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/be79d24d-5b21-09a3-9336-d08bb7ae3ea6.png)

name：`Show Context Actions` 
key：`option + enter`

---

### これが使えるよ。を教えてくれる
こうですよね？っていうのを提案してくれる目玉機能。

あああ！名前つき引数の名前がでてこねええってときにも親切にrequiredって書いてある状態で出してくれる。
![arg_complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/cb11a4e0-9067-049c-1a80-48dd1a8af82c.png)

チェーンしたときに押したり、改行した直後に押せばそれっぽい予測を出してくれる優れもの。複数回押すと利用できるあれこれのスコープが変わるのでお試しを！

name：`Basic` 
key：`control + shift + enter`

---

### アクティブなウィンドウのタブをすべて閉じる
name：`Close All`
key：`control + F4`

---

### アクティブなウィンドウの選択ファイル以外のタブをすべて閉じる

つまり見ているファイルのタブだけは残るってことです。
name：`Close Others`
key：`control + shift + F4`

---

### 選択しているファイルの変更履歴を表示する
Gitで管理しているファイルで実行すると変更履歴を一覧で見られる
name：`Show History`
key：`shift + command + S`

---

### クリップボードとの差分
たまによく使う。
違いを見比べるときに脳内リソース使わなく済むので助かってます。
![comp_s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/f1be542e-272d-4942-fe2e-76204704e80f.png)


name：`Compare with Clipboard`
key：クリップボードに比較したいものをコピーしたあとに、比較対象を選択して`control + shift + command + E`

---

### Autoscroll Save
プロジェクトツリーを開いたときに、選択しているファイルをツリーで選択状態にするかどうか。を全プロジェクトで共有できる。
ナニいってんだョ・・・って感じだと思うのでGIF見てください。

![scrol_save.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/62cd6a0f-dc00-192f-76dd-fa8ba3b78463.gif)


これを全プロジェクトで共通の設定にできるやつです。地味に便利！

name：`Toggle Autoscroll from Source`
key：`control + shift + command + \`

---

### タブを次のウィンドウに移動する
ザ・孫の手

![to_right.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/9dd56e28-2d28-39f8-1ac3-df1c3964dea9.gif)

name：`Move To Opposite Group` 
key：`control + option + tab`

---

### 引数をポップアップで表示
たしかデフォルトでは引数がグレーアウトで表示されていると思いますが、ずれる瞬間がすごく好みではないのでわたしはオフにしています。オフにする方法は・・・忘れました。

![pop_up_arg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/83780549-a1b6-79b3-1945-c4b4c7855945.png)

name：`Parameter Info` 
key：`command + P`

---

### 定義をポップアップで表示
ジャンプするまでもないのでチラ見したいとき

![qq_j.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/fb1a6d87-df00-5752-a7ef-5069cca2a5d1.png)

name：`Quick Definition` 
key：`option + space`

---

### ドキュメントチラ見
![qq_doc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/d6ab8be9-4935-62f5-0402-caf83ada7139.png)


name：`Quick Documentation` 
key：`control + J`


---

### ドキュメント参照
name：`External Documentation` 
key：対象のメソッド上で`shift + F1`


たとえばArray#eachを参照すると https://rubydoc.info/stdlib/core/Array#each-instance_method に飛びます。

---

### 内容を先に書いてあとから包む

▼ifの条件を先に
![first_t.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/24d82194-1077-494c-25b3-8902cda3f958.gif)

▼メソッドの中身を先に書いてあとから包む
![ichihaichi.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/3845a329-1233-8ccc-42c0-31c5ab94d7c5.gif)

メソッドで包むほうは後述のメソッド切り出しを利用することがほとんどですが、条件式にするのは結構使ってます。

name：`不明` 
key：`-`
trigger：なにかの式のあとで`.` + `if` や `def`、`while`などを打つ

---

### コピー履歴から貼り付け
ClipyやAlfred有料版を利用している方はあまり使わないかもしれないですね。

![copy_hist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/9254032b-4fb4-1c7c-e468-cbb3ba831b53.png)


name：`Paste from History...` 
key：`shift + command + V`

---

### リファクタリングメニューの表示

IDEはリファクタリングでこそ真価を発揮する。こう言ったのはあきやさんですが、あながち間違ではない気がするんですよね。

name：`Refactor This...` 
key：`control + T`


#### 一時変数の除去
![inline.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/d04f74bb-282c-6c9f-e3bd-97e1cafdb24e.gif)

name：`Inline...` 
key：`command + option + N`

#### メソッドに包み込む


name：`Extract Method...` 
key：`option + command + M`



そのほかにもメソッドを親クラスに移動する、メソッドを子クラスに移動するといったものもあるのでぜひ活用してください

---

### 条件式などで囲む
たとえばRubyだとこういったメニューがでてくる
![o_cm_t.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/9ec97c21-b301-ca3e-f2d7-73d04d98daad.png)

name：`Surround With...` 
key：`option + command + T`


---

### コンフリクトの解消をわかりやすく

▼GitHubの画面からこういう風に表示されているやつを楽に修正できるやつ
![conflict_nn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/f440f5c1-0c31-2260-9fde-e966e26a154d.png)


▼`command + 9`でメニューを開く
![sample_conflict1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/b86e83a9-0b80-5bbb-d906-e168b79f6284.png)


▼複数のファイルがコンフリクトしている場合はここにコンフリクトしているファイルがすべて表示される
![sample_conflict2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/ba95bb99-2e91-f825-5f3f-d14b0d75083b.png)

コンフリクトを修正したいファイルをダブルクリック

▼真ん中が最終的な変更になるように`<<`や`X`をポチポチして修正する
![sample_conflict3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/814413f6-7146-85f8-0b10-fe8b8076572a.png)


この画面で普通に文字入力もできる。


name：`不明` 
key：`command + 9`から選択

---

### 最近開いたファイルを一覧からもう一度開く
name：`Recent Files` 
key：`command + E`

---

### クラスやメソッドなどのスコープの始端、終端に移動する
地味オブ地味なんですけど結構好きなやつ

![me.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/42c6316e-96d8-a939-085a-0fdd2adf26c3.gif)


name：`Move Caret to Matching Brace` 
key：`control + M`

---

### クラスやメソッドを折りたたむ
name：`不明` 
key：`command  + .`

---

### メソッドやクラスのパスをコピー

レビューするときとコードリーディングするときに使ってます。

name：`Copy Reference`
key：`option + shift + command + C`

---

### ファイルのパスをコピー

name：`Copy Paths` 
key：`control + option + C`

---

### ファイルのパスを行番号と一緒にコピー
src/file_name.rb:10とかの形式でコピーするやつ。

name：`Path With Line Number` 
key：`control + option + shift + C`

---

### 利用できるLive Templateを確認
今開いている拡張子で利用できるLive Templateの一覧を表示。
ときどき自分で登録したエイリアスがわからなくなったりするときに使ってます。
![スクリーンショット 2020-09-28 17.45.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696117/aa8d2a80-b98f-23ad-84a6-17665dbce05a.png)


name：`Insert Live Template...` 
key：`command + J`

---

### 思いついたら追加していく

---

## おわりに
vim入れてる人多いんですかね・・・