emacsにモダンなエディタに負けない補完機能を...（１）


どうも”おもり”です。

 私は業務でQtというマルチプラットフォームを使用したAndroidアプリ開発を行っています。Qtというのは知名度が低いかとは思いますが、C++・JavaScript・Pythonでマルチプラットフォームにアプリを開発できるものです。私は現在、C++でWindowsアプリやAndroidアプリを作ったりしています。

 Qtでの開発にはQtCreatorというIDEを使用するのですが、このIDEがなかなか体に染み付いています。キーバインドをemacsライクに変更して作業しています。QtCreatorではC++の普通のコードを書くこともできます。使用しているQtCreatorに負けないレベルの補完やコーディングは最低限できるようにはカスタマイズがしたい。

#QtCreatorでのコーディング
・最低３文字から補完が表示される。
・対応する括弧が自動で入力される。

![include.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276053/1504842e-8b30-268a-37f3-7d46b5aab095.gif)

![sort.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276053/66f0a600-d8db-fc71-edca-322fc4624362.gif)

![qml.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276053/2594932e-deaf-d635-5520-f5edf03548e8.gif)


C++でのコーディングにおいて、少なくとも上記のような書き心地は必須ですし、モダンなエディターなら常識的にある機能ですね。下にemacsの補完に関する参考のURLを貼っておきます。

company-ironyを使ってemacsでC/C++の補完
https://qiita.com/sune2/items/c040171a0e377e1400f6

Emacsの補完と検索を超強化する
https://qiita.com/blue0513/items/c0dc35a880170997c3f5

emacsのコード補完ツールcompany-modeの設定備忘
https://qiita.com/kod314/items/3a31719db27a166d2ec1


#Ivy
補完を実装するためにはIDO, Ivy, Helm, Anythingあたりがあるのですが、下記のサイトを参考にしてIvyで進めることにしました。

君は誰とEmacsる？（補完インターフェース編）
https://qiita.com/tadsan/items/33ebb8db2271897a462b

普通のエディターだと、こんな設定なくても全然いけるので、正直emacsの設定ファイルのサイトを見ても最初は全然分からないです。私はデフォルトの状態で２年間使用していただけなので、デフォルトのキーバインドが手に馴染んではいるのですが、設定ファイルの改良は初心者です。今でも難しいです。

```M-x package-install counsel```
でcounselをインストールしましょう。

counselをインストールするとSwiperとIvyもインストールされるのですが、それぞれ何？って感じですよね。色々なサイトを見てるとIvy最高って感じで書かれているのですが、実装してみても何のことやらよく分かっていなかった。つまりはM-xを押した時に出てくるミニバッファの中の動作を良くするためのものでした。

M-xのコマンドはたくさんあるので覚えてられません。よく使うものだと、package-install, package-refresh-contents, list-color-display, recentf-open-filesなどなどあったりするが、うろ覚えでM-xからのpackageと入力すれば下の図のように候補がズラッと表示されるのです。

![2019-09-02_04h47_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276053/8f3f57be-8720-5ee7-7a72-6f4c925ecf2f.png)


Swiperというのは現在のバッファ（ファイル）から単語を検索したいと思った時に、Swiperを使用すればミニバッファに入力した単語がこれまたズラッと表示されるのです。その状態でC-nで下の行に、C-pで上の行に移動することができ、Enterを押すことでその検索部分までジャンプすることができます。

![2019-09-02_05h12_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276053/50970789-9411-6c96-7fc4-73f055a0e194.png)


```
;; ivy設定
(require 'ivy)
(ivy-mode 1)
(setq ivy-use-virtual-buffers t)
(setq enable-recursive-minibuffers t)
(setq ivy-height 30) ;; minibufferのサイズを拡大！（重要）
(setq ivy-extra-directories nil)
(setq ivy-re-builders-alist
      '((t . ivy--regex-plus)))

(global-set-key "\C-s" 'swiper)
(global-set-key (kbd "C-c C-r") 'ivy-resume)
(global-set-key (kbd "<f6>") 'ivy-resume)
(global-set-key (kbd "<f2> u") 'counsel-unicode-char)
(global-set-key (kbd "C-c g") 'counsel-git)
(global-set-key (kbd "C-c j") 'counsel-git-grep)
(global-set-key (kbd "C-c k") 'counsel-ag)
(global-set-key (kbd "C-x l") 'counsel-locate)
(global-set-key (kbd "C-S-o") 'counsel-rhythmbox)
```

ミニバッファのサイズは30だと少し大きい気がするので、10とか20ぐらいが良いかもしれないです。
取り敢えず、これぐらい設定しておけば、Ivyの操作は大丈夫です。

この次のステップとしてはcompanyを導入して、コーディング中の補完も完了させなければなりません。そちらについては次回の記事で書こうと思います。



余談ですが、私はemacs 26.2を使用していますが、package-refresh-contentsを実行すると下のようなエラーが出て非常に困りました。

```
Failed to download 'gnu' archive.
```

https://www.reddit.com/r/emacs/comments/cdei4p/failed_to_download_gnu_archive_bad_request/
こちらのサイトを参考にして下記を追加すると、パッケージの更新が完了するようになりました。なかなかコケたところでしたので、みなさんもぶち当たったらこちらが参考になるかもしれません。

```
(setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3")
```