検索・補完インタフェースツールの導入
Closed this issue · 5 comments
keicy commented
下記参考に。
これを読むと、候補としては Helm
, Ivy/Counsel
のどちらかかな。
- Helm
- Ivy
Helmには上記良い解説があり、感じも掴めているのでいけそう。
動作が重いのと、互換のない更新がネックらしいので、Ivyでもいけそうならシンプルにこちらでも良いかも。
keicy commented
Helm
- pros
- migemo 対応している
- チラ見機能便利かも
- cons
- キーバインドのDocがない
- プラグインフォルダを
grep
して検索すればできそう
- プラグインフォルダを
- キーバインドのDocがない
keicy commented
Ivy
- pros
- 画面が見やすい
- cons
- migemo 対応されてないっぽい/情報がなかった
- チラ見機能がなさそう
keicy commented
結論
こういうツール自体使ってみないと分からない点が多すぎるので、ひとまずpropsが多く、また、標準として広く対応されている Helm を使ってみることにする。
それで不便があればまた移行を考えようと思う。
ちなみに、 ido は試して結果、UIが気に入らなかったため候補外。
keicy commented
Helm のキーバインド
カーソル移動
helm のプラグインフォルダを C-p
C-n
などでgrep
# C-p
kei@kei:~/.emacs.d/24.5.1/el-get/helm$ findword "C-p"
./helm-lib.el: (?\C-p (helm-help-previous-line))
./helm.el: (define-key map (kbd "C-p") 'helm-previous-line)
./helm-eval.el: (define-key map (kbd "C-p") 'previous-line)
# C-n
./helm-lib.el: (?\C-n (helm-help-next-line))
./helm.el: (define-key map (kbd "C-n") 'helm-next-line)
./helm-eval.el: (define-key map (kbd "C-n") 'next-line)
幾つかの機能でそれぞれのキーマップを持っていて、それぞれに定義している模様。これらのマップに再定義すれば良いと思われる。
フォルダ階層移動 (helm-find-files)
helm のプラグインフォルダを C-j
でgrep
# C-j
./helm-elisp.el: :persistent-help "Toggle describe function / C-u C-j: Toggle advice"))
./helm-help.el:`helm-execute-persistent-action' called with a prefix arg (C-u C-j) or with its specific command
./helm-help.el:**** Use `C-j' (persistent action) on a directory to go down one level
./helm-help.el:Note: The tree is reinitialized each time you enter a new tree with `C-j'
./helm-help.el:*** Use `C-u C-j' to watch an image or `C-<down>'
./helm-help.el:*** `C-j' on a filename will expand in helm-buffer to this filename
./helm-help.el:Second hit on `C-j' will display buffer filename.
./helm-help.el:Third hit on `C-j' will kill buffer filename.
./helm-help.el:NOTE: `C-u C-j' will display buffer directly.
./helm-help.el:just type \"/home/you/foo/..else\" and hit `C-j' or enter the final \"/\", helm will show you all
./helm-help.el:**** Use `C-u C-j' to watch an image
./helm-help.el:**** `C-j' on a filename will expand in helm-buffer to this filename
./helm-help.el:Second hit on `C-j' will display buffer filename.
./helm-help.el:Third hit on `C-j' will kill buffer filename.
./helm-help.el:NOTE: `C-u C-j' will display buffer directly.
./helm-help.el:You can do this with `C-j' (persistent-action), to do it repetitively
./helm-help.el:*** You can get help on any command with persistent action (C-j)
★ ./helm.el: (define-key map (kbd "C-j") 'helm-execute-persistent-action)
./helm.el:| C-j | C-z | Persistent Action (Execute and keep helm session) |
./helm-files.el:When this is set you will be able to expand archive filenames with `C-j'
./helm-files.el:or hitting C-j on \"..\"."
./helm-files.el:First hit on C-j expand CANDIDATE second hit open file.
./helm-files.el: ;; An image file and it is the second hit on C-j,
色々出ているが、キーマップ定義は★のものだけっぽい。ここに再定義すれば良いっぽい。
# C-l
./helm-help.el:**** Use `C-l' on a directory to go up one level
./helm-help.el:**** Use `C-r' to walk back the resulting tree of all the `C-l' you did
./helm-help.el:NOTE: This is different from using `C-l' in that `C-l' doesn't move cursor on top but stays on previous
./helm-help.el:NOTE: This different to using `C-l' in that `C-l' don't move cursor on top but stay on previous
./helm.el: (define-key map (kbd "C-l") 'helm-recenter-top-bottom-other-window)
./helm.el: (define-key map (kbd "M-C-l") 'helm-reposition-window-other-window)
./helm-font.el: (define-key map (kbd "<C-left>") 'helm-ucs-persistent-backward)
★./helm-files.el: (define-key map (kbd "C-l") 'helm-find-files-up-one-level)
★./helm-files.el: (define-key map (kbd "C-l") 'helm-find-files-up-one-level)
./helm-files.el: "Retrieve previous paths reached by `C-l' in helm-find-files."
helm-find-files での挙動定義は上記★で定義されている模様。このマップに再定義する。
keicy commented
作業要点
詳細は Dropbox の作業ログ参照
- bind-keys* による絶対キー定義を helm 中は無効にする必要がある
- bind-keys* のキーは、 下記のように emulation-mode-map-alists に override-global-mode を追加して定義される
- (add-to-list 'emulation-mode-map-alists `((override-global-mode . ,override-global-map)))
- emulation-mode-map はキーマップ定義の上位にあるmapで、その他のmap定義を上書きできる優先度を持つ
- よって、 override-global-mode を helm 中に無効にすれば良い
- (add-hook 'helm-minibuffer-set-up-hook (lambda () (override-global-mode -1)))
- bind-keys* のキーは、 下記のように emulation-mode-map-alists に override-global-mode を追加して定義される
- さらに、 helm の map にキー定義を追加する必要がある
- 本来であれば、 上記で無効後、 単に helm-map などにキー定義追加すれば良いはずだが、なぜか
C-i
のみ挙動が変- helm-map については emulation-mode-map に専用の map を作成し、 helm 中だけ有効にするようにした
- (add-hook 'helm-minibuffer-set-up-hook (lambda () (keicy-helm-mini-buffer-mode 1)))
- helm-map については emulation-mode-map に専用の map を作成し、 helm 中だけ有効にするようにした
- helm-find-files-map については理論通り、単純に定義追加でいけたのでそうしている
- 本来であれば、 上記で無効後、 単に helm-map などにキー定義追加すれば良いはずだが、なぜか