hydra

概要

Hydra は Emacs の貴重なキーバインドを節約できる便利なパッケージ。

自分で定義した各 Hydra コマンドを実行するとそれに紐付くサブコマンドとそれらのキーバインド一覧を表示させることができるというやつ。

インストール

Hydra 本体と関連パッケージをここでインスコしている

Hydra 本体のインストール

Hydra 本体は el-get で普通に入れている

(el-get-bundle hydra)

hydra-posframe のインストール

Hydra は通常だと minibuffer あたりに表示されるけど画面の真ん中に表示される方が視線移動が少なくて便利なので hydra-posframe を使って画面中央に表示されるようにしている。

インストールは el-get でやっているが recipe がないのでまずそれを用意。

(:name hydra-posframe
       :description "a hydra extension which shows hydra hints on posframe."
       :type github
       :pkgname "Ladicle/hydra-posframe")

そして el-get-bundle でインストール

(el-get-bundle hydra-posframe)

そして Emacs の初期化処理が完了したタイミングでそれが使われるように after-init-hook で hydra-posframe を有効化している

(add-hook 'after-init-hook 'hydra-posframe-enable)

major-mode-hydra のインストール

自分以外で使っている人を見たことはないけど麦汁さんは major-mode-hydra というものを利用している。

これは major mode 用に簡単に Hydra の設定ができるというやつ。なので emacs-lisp-mode 用の Hydra とか js2-mode 用の Hydra などを定義できて便利。

どちらの場合も M-x major-mode-hydra で起動するので迷わないで済むのも良い。

内部では同じリポジトリにある pretty-hydra というのを利用していてそいつが UI の定義をせずともそれなりの感じに Hydra のメニューを構築してくれるようになっている。これもズボラな麦汁さんは気に入っている。導入していても表示にこだわりたい場合は直接 defhydra したらいいだけだしね。

ってことでそれを el-get を使って GitHub からインストールしている。

(el-get-bundle major-mode-hydra.el)

また pretty-hydra の表示フォーマットを変えるために pretty-hydra-default-title-body-format-spec を使うようにしている

(custom-set-variables '(pretty-hydra-default-title-body-format-spec "%s\n%s"))

なおレシピは自前で用意している

(:name major-mode-hydra.el
       :website "https://github.com/jerrypnz/major-mode-hydra.el"
       :description "this package offers an alternative way to manage your major mode specific key bindings."
       :type github
       :pkgname "jerrypnz/major-mode-hydra.el")

キーバインド

Hydra でいくつかのキーバインドを設定していて他の機能に属さないものはここでまとめてキーバインドを定義している。

el-get

他の機能に属さないものは、と書いたな? ありゃ嘘だ。 el-get の Hydra はここで定義してしまっている。その内 el-get 用の設定ファイルにでも移動したい気がする。

(pretty-hydra-define el-get-hydra (:separator "-" :title "el-get" :foreign-key warn :quit-key "q" :exit t)
  ("Install"
   (("i" el-get-install   "Install")
    ("I" el-get-reinstall "Re-install")
    ("D" el-get-remove    "Uninstall"))

   "Update"
   (("s" el-get-self-update  "Self Update")
    ("u" el-get-update       "Update")
    ("A" el-get-update-all   "Update All")
    ("r" el-get-reload       "Reload"))

   "Recipe"
   (("f" el-get-find-recipe-file              "Find recipe")
    ("E" el-get-elpa-build-local-recipes      "Build ELPA recipes")
    ("W" el-get-emacswiki-build-local-recipes "Build EmacsWiki recipes"))

   "Lock"
   (("C" el-get-lock-checkout  "Checkout")
    ("U" el-get-lock-unlock    "Unlock"))))
Key 効果
i パッケージの新規インストール。正直このキー叩いた記憶がない
I パッケージの再インストール
D パッケージの削除
s el-get 自身のアップデート
u 指定パッケージのアップデート
A 全パッケージのアップデート
r パッケージの読み直し
f パッケージのインストール用レシピファイルを開く
C 指定したパッケージを el-get-lock でロックされたバージョンをチェックアウト
U 指定したパッケージの el-get-lock のロックを解除

Toggle Switches

ここでは ON/OFF を切り替えるような機能のコントロールを行っている。

(pretty-hydra-define
  toggle-hydra
  (:separator "-"
              :title (concat (all-the-icons-faicon "toggle-on") " Toggle Switches")
              :foreign-key warn
              :quit-key "q"
              :exit t)
  ("View"
   (("z" zoom-mode                 "zoom-mode"      :toggle zoom-mode)
    ("Z" toggle-frame-fullscreen   "Fullscreen"     :toggle (frame-parameter nil 'fullscreen))
    ("e" emojify-mode              "Emojify"        :toggle emojify-mode)
    ("B" blamer-mode               "Blamer"         :toggle blamer-mode)
    ("L" display-line-numbers-mode "Line Number"    :toggle display-line-numbers-mode)
    ("M" minimap-mode              "Minimap"        :toggle minimap-mode)
    ("N" neotree-toggle            "Neotree"        :toggle (if (fboundp 'neo-global--window-exists-p) (neo-global--window-exists-p) nil)))

   "Mode Line"
   (("w" which-function-mode       "Which func"     :toggle which-func-mode)
    ("b" display-battery-mode      "Battery"        :toggle display-battery-mode))

   "Behavior"
   (("S" my/notify-slack-toggle    "Notify Slack"   :toggle my/notify-slack-enable-p)
    ("v" my/toggle-view-mode       "Readonly"       :toggle view-mode)
    ("f" flycheck-mode             "Flycheck"       :toggle flycheck-mode)
    ("A" auto-fix-mode             "Auto fix"       :toggle auto-fix-mode)
    ("C" copilot-mode              "Copilot"        :toggle copilot-mode)
    ("^" subword-mode              "Subword"        :toggle subword-mode)
    ("(" smartparens-strict-mode   "strict parens"  :toggle smartparens-strict-mode)
    ("E" toggle-debug-on-error     "Debug on error" :toggle debug-on-error))))
Key 効果
z zoom-mode のON/OFF切替。狭いディスプレイの時は ON にするが、大きいディスプレイだと OFF にしている
Z フルスクリーンの切替。狭いディスプレイの時は ON にするが、大きいディスプレイだと OFF にしている
e 常に絵文字に変換されると厳しい時があるので toggle できるようにしている
B コード横にそのコードのコミットメッセージを表示するやつを toggle できるようにしている
L 行番号表示の切替。邪魔になる時もあるので ON/OFF 切り替えている
M minimap の表示切替。普段使ってないから存在忘れるな〜
N Neotree の表示切替。普段は邪魔なので OFF にしている
w 関数名の表示が邪魔になることもありそうなので toggle できるようにしている
b バッテリー表示モードの切替。OFF にしたことないな……
S Slack 通知の切替。org-clock-in とかのタイミングで Slack に通知を飛ばしているが切る時もある
v view-mode にしたり戻したり。コードを眺めたい時などに ON にする
f flycheck-mode の切替。たまに何かの原因でとても重くなる時があるので切れるようにしている
A 保存時の自動補正するモードの切替。なんだけどこれ使ってないから消すかその内に。
C copilot-mode の切替。基本は ON だけど邪魔になる時があるので
^ 単語区切の切替。特に切り替えたことはない気がする
( smartparens-strict-mode の切替。strict-mode だと面倒な時があるので。特に JS/TS で。
E エラー時のデバッグモードの切替。設定を弄ってる時はバックトレースある方が嬉しいよね

Sub Tools

最初に起動した Hydra からは外してるけど、そこそこ使うコマンド群を適当に詰めてるやつ。

(pretty-hydra-define
  subtools-hydra
  (:separator "-"
              :color teal
              :foreign-key warn
              :title (concat (all-the-icons-material "build") " Sub tools")
              :quit-key "q"
              :exit t)
  ("Describe"
   (("b" counsel-descbinds "Keybind")
    ("f" counsel-describe-function "Function")
    ("v" counsel-describe-variable "Variable")
    ("m" describe-minor-mode "Minor mode"))
   "Other"
   (("@" all-the-icons-hydra/body "List icons")
    ("w" which-key-show-top-level "Which key")
    ("d" docker                   "Docker"))))
Key 効果
b キーバインドを調べる
f Emacs Lisp の関数を調べる
v Emacs Lisp の変数を調べる
m minor-mode を調べる
@ All the icons の Hydra を起動
w トップレベルのキーバインドを表示する
d docker.el の起動

Text Scale

文字サイズの切替用。たまに字を大きくしたりしたいので。

(pretty-hydra-define text-scale-hydra (:separator "-" :title (concat (all-the-icons-material "text_fields") " Text Scale") :exit nil :quit-key "q")
  ("Scale"
   (("+" text-scale-increase "Increase")
    ("-" text-scale-decrease "Decrease")
    ("0" text-scale-adjust   "Adjust"))))
Key 効果
+ 文字サイズを大きくする
- 文字サイズを小さくする
0 文字サイズを元に戻す

Main

よく使うコマンドをまとめたやつ。 key-chord を使って jk 同時押しで起動できるようにしている。

(pretty-hydra-define pretty-hydra-usefull-commands (:separator "-" :color teal :foreign-key warn :title (concat (all-the-icons-material "build") " Usefull commands") :quit-key "q")
  ("File"
   (("p" projectile-hydra/body "Projectile")
    ("f" counsel-find-file     "Find File")
    ("d" counsel-find-dir      "Find Dir")
    ("r" counsel-recentf       "Recentf")
    ("L" counsel-locate        "Locate"))

   "Edit"
   (("a" align-regexp "Align Regexp")
    ("[" origami-hydra/body "Origami")
    (";" comment-dwim "Comment"))

   "Code"
   (("G" counsel-projectile-rg            "Grep")
    ("j" dumb-jump-pretty-hydra/body      "Dumb jump")
    ("g" avy-hydra/body                   "Avy")
    ("l" pretty-hydra-lsp/body            "LSP")
    ("i" counsel-imenu                    "imenu")
    ("y" yasnippet-hydra/body             "Yasnippet")
    ("B" browse-at-remote                 "Browse")
    ("C" blamer-show-posframe-commit-info "Bramer")
    ("m" magit-status                     "Magit"))

   "View"
   (("D" delete-other-windows      "Only This Win")
    ("W" window-control-hydra/body "Window Control")
    ("+" text-scale-hydra/body     "Text Scale")
    ("w" ace-swap-window           "Swap Window"))

   "Tool"
   (("SPC" major-mode-hydra         "Hydra(Major)")
    ("h"   my/project-hydra         "Hydra(Project)")
    ("s"   toggle-hydra/body        "Toggle switches")
    ("c"   counsel-org-capture      "Capture")
    ("A"   copilot-chat-hydra/body  "Copilot Chat")
    ("o"   global-org-hydra/body    "Org")
    ("e"   el-get-hydra/body        "el-get")
    ("k"   kibela-hydra/body        "Kibela")
    ("/"   google-pretty-hydra/body "Google")
    ("t"   subtools-hydra/body      "Sub Tools"))))
Key 効果
p Projectile 用の Hydra 起動
f counsel でファイルを開く
d counsel でフォルダ開く
r counsel で最近使ったファイルを開く
l counsel で locate する。Mac だと mdfind だけど
a 正規表現に基いて整形
; コメント挿入。 M-; を使ってるから要らないかも
G projectile 内の検索。関係ないのがかかる時もあるので調整必要
j dumb-jump 用の Hydra 起動
g 画面上の好きな位置にジャンプする avy の起動
i counsel-imenu 起動。使ってない気がする
y yasnippet 用の Hydra 起動
B browse-at-remote で GitHub などのコード位置を開く
m magit を起動
D 他の Window を消す
W フレームサイズや位置を弄るための Hydra を起動。ほぼ使ってない
+ 文字サイズ変更用 Hydra の起動
w Window の入替
SPC major-mode-hydra の起動
h プロジェクト固有の Hydra があればそれを起動する
s ON/OFF 切替系の Hydra を起動する
c counsel-org-capture を呼び出す
A Copilot Chat 用の Hydra を起動する
o org-mode 用の Hydra を起動する
e el-get 用の Hydra を起動する
t 第一階層には入れてないけどまあまあ便利なコマンドを詰めた Hydra を起動する