2020年05月31日

org-todo を ivy で設定できるようにした

posframe っていいですよね。 いきなりタイトルと関係なさそうな単語出したけど。 まあ ivy-posframe を使ってるので ivy を使うと posframe が使えて便利って話なんだけど。

ところで話は若干変わって、 org-todo って実行するとウインドウが分割されてバッファが表示されてそこから選ぶ形になるじゃないですか。 もしかしたら設定がちゃんとしてたりしたらならないのかもしれませんけど、 とりあえず私の環境だとなるんですよ。

で、それだと何が問題かというと ウインドウ分割される時に元々見ていたバッファがガチャガチャと移動しちゃってつらいんですよ。 posframe を使えるとそれが起きなくて便利なんですよ。

というわけで、org-todo でキーワード選ぶ時にも posframe が使えるといいなって思ったんですよ。

で、色々調べた結果、自分にはそういうのを提供してくれる設定とか拡張とか見つけられなかったんですよ。

じゃあ作るしかないじゃん? というわけで、そういう関数作った

(defun my/org-todo ()
  (interactive)
  (ivy-read "Org todo: "
            org-todo-keywords-for-agenda
            :require-match t
            :sort nil
            :action (lambda (keyword)
                      (org-todo keyword))))

org-todo の代わりにこの関数を呼ぶと ivy で TODO のキーワードが設定できる。 ivy は ivy-posframe を使ってるから、画面がガチャガチャ動かなくなる。便利。

この変更に関する Emacs の設定ファイルへの Pull request は https://github.com/mugijiru/.emacs.d/pull/74 に置いてるので興味があれば見てもらえると。

ところで ivy でこういう選択するインターフェース書いたの初めて。 とりあえず書いてみたらできたので、また別のやつも ivy を使って書いてみたい。

posted by 麦汁 at 01:32 | Comment(0) | emacs | このブログの読者になる | 更新情報をチェックする

2020年05月24日

Emacs でタイトルバー非表示のためフレームの移動ができない問題を解消した

前提

フルスクリーン時の見栄え重視で、タイトルバー非表示のオプションを付けてインストールした Emacs を使ってる

課題

たまにフルスクリーン解除するけど、その時に移動させるために掴むタイトルバーがなく、 移動ができなかったのがつらかった

解決方法

の組み合わせで解決した。

詳細

frame-cmds.el にはフレーム操作のためのコマンドがいくつか用意されている。 今回利用したのは

  • move-frame-right
  • move-frame-left
  • move-frame-up
  • move-frame-down

のみ。

それぞれ Emacs のフレームを移動するコマンド。

それをな、 pretty-hydra でこうじゃ。

(pretty-hydra-define window-control-hydra (:separator "-" :title "Window Control" :exit nil :quit-key "q")
  ("Move"
   (("h" move-frame-left  "Left")
    ("j" move-frame-down  "Down")
    ("k" move-frame-up    "Up")
    ("l" move-frame-right "Right"))))

hydra は :exit を設定することで 連続したコマンドを入力できるようになるのでそれを設定している。 あとは vi っぽいキーバインドで移動する感じ。

実際の挙動と設定変更は https://github.com/mugijiru/.emacs.d/pull/58 の PR に書いてるので、気になる方はご参照あれ。

タグ:hydra Emacs
posted by 麦汁 at 14:08 | Comment(0) | emacs | このブログの読者になる | 更新情報をチェックする

major-mode-hydra と pretty-hydra について

Emacs の hydra というパッケージはご存知だろうか。 ご存知だな。よし。

まあ Hydra のススメ とか Emacs Pinkyをhydraで解決する とか読んだら大体わかる。 ビジュアル的なメニューを出せて便利なやつ。 自分も、使いこなしてるとは言わないけども、愛用しているパッケージ。

なんだけど、そこそこいい感じな見た目にするには GitHub の README の The impressive-looking one に書かれてるように docstring でどういう表示にしたいのかを自分で書いてあげないといけない。 これが地味にだるい。

だってそのメニューに書いてるやつの一部は heads とかいう引数でも設定しているから DRY じゃないのよね。 俺ズボラだからそんな丁寧に書きたくないんですよ。

まあ実は hydra だけでも docstring まともに書かなくても 一応なんか表示してくれるのですが、これがちょっと微妙。

そこで pretty-hydra ですよ

pretty-hydra とは

pretty-hydra ってのは major-mode-hydra にくっついてくる拡張です。

こいつが何をするかっていうと、 さっき hydra の設定めんどくせーって書いてた問題を解決してくれる。

例えば以下は自分が設定しているやつから拾って来てちょっと簡略化したやつなんだけど

(pretty-hydra-define
  global-org-hydra
  (:separator "="
   :title "Global Org commands")
  ("Main"
   (("a" org-agenda "Agenda")
    ("c" org-capture "Capture")
    ("l" org-store-link "Store link")
    ("t" my/org-tags-view-only-todo "Tagged Todo")
    ("F" org-gcal-fetch "Fetch Calendar")
    ("C" my/open-user-calendar "Calendar"))
   "Clock"
   (("i" org-clock-in  "In")
    ("o" org-clock-out "Out")
    ("r" org-clock-in-last "Restart")
    ("x" org-clock-cancel "Cancel")
    ("j" org-clock-goto "Goto")
    ("r" org-clock-report "Report"))))

これをやると

defhydra の docstring で

Global Org commands

 Main^^                Clock^^
===================================
 _a_: Agenda           _i_: In
 _c_: Capture          _o_: Out
 _l_: Store link       _r_: Restart
 _t_: Tagged Todo      _x_: Cancel
 _F_: Fetch Calendar   _j_: Goto
 _C_: Calendar         _r_: Report

みたいなのを裏側で勝手に設定して、Agenda とかの各 heads を定義したのと同じ状態になる。

ってことで、起動すると

Global Org commands

 Main                Clock
===================================
 a: Agenda           i: In
 c: Capture          o: Out
 l: Store link       r: Restart
 t: Tagged Todo      x: Cancel
 F: Fetch Calendar   j: Goto
 C: Calendar         r: Report

みたいな表示をしてくれる。 雑にカテゴリ分けされたメニューを出すのに便利。 docstring にも heads にも並べる必要がなくなるしね。

で、この pretty-hydra を内部で利用しているのが major-mode-hydra なのです

major-mode-hydra とは

major-mode-hydra とは 各 major-mode に合わせた hydra のメニューを出せるようにしてくれる便利な子。

例えば自分は org-mode 用に

(major-mode-hydra-define org-mode (:separator "-" :quit-key "q" :title (concat (all-the-icons-fileicon "org") " Org commands"))
  ("Insert"
   (("l" org-insert-link "Link")
    ("t" org-insert-todo-heading "Todo")
    ("h" org-insert-heading-respect-content "Heading")
    ("S" org-insert-structure-template "Snippet"))

   "Edit"
   (("a" org-archive-subtree "Archive"))

   "View"
   (("N" org-toggle-narrow-to-subtree "Toggle Subtree")
    ("D" my/org-clock-toggle-display "Toggle Display"))

   "Task"
   (("s" org-schedule "Schedule")
    ("d" org-deadline "Deadline")
    ("T" org-todo "Change state"))

   "Clock"
   (("i" org-clock-in "In")
    ("o" org-clock-out "Out"))

   "Babel"
   (("e" org-babel-confirm-evaluate "Eval"))

   "Trello"
   (("K" org-trello-mode "On/Off" :toggle org-trello-mode)
    ("k" (if org-trello-mode
             (org-trello-hydra/body)
           (message "org-trello-mode is not enabled")) "Menu"))

   "Agenda"
   (("," org-cycle-agenda-files "Cycle"))))

とか用意してたり、emacs-lisp-mode 用に

(major-mode-hydra-define emacs-lisp-mode (:quit-key "q" :title (concat (all-the-icons-fileicon "elisp") " Emacs Lisp"))
  ("Describe"
   (("F" counsel-describe-function "Function")
    ("V" counsel-describe-variable "Variable"))))

とか書いたりしている。

この状態で

M-x major-mode-hydra とか叩くと その時の major-mode 用の hydra のやつが出て来るってわけ。便利。

最後に

pretty-hydra, major-mode-hydra があれば、 お手軽に hydra を使えるようになるのだけど、 自動で設定されるから

  • Ladicle さんの Hydra の設定 とかみたいなキレイな表現はできない
  • 何気に separator が全角文字だったりすると separator がやけに長くなったりする
  • heads-plist の column names に関数は設定できないっぽい
  • heads の表示文字列に全角文字を入れるとやはり横幅が崩れたりする

という問題がなくはないので 表示にこだわりたい人には向かないかなって感じ。

ま、僕は便利に使ってます。 こだわりたいところだけ defhydra を直接書いてこだわるという手もあるしね。

posted by 麦汁 at 00:13 | Comment(0) | emacs | このブログの読者になる | 更新情報をチェックする