HydraでEmacsのキーバインド問題を解消する
できるだけデフォルトを上書きしないようにと配慮しながらEmacsのキーバインドを考えるとなるとなかなか難しいですね。うまく割り当てできたとしてもとても覚えて使いこなすのは至難です。その問題を解消して視覚的で使いやすいUIを提供してくれるのが Hydra
です。
できるだけデフォルトを上書きしないようにと配慮しながらEmacsのキーバインドを考えるとなるとなかなか難しいですね。うまく割り当てできたとしてもとても覚えて使いこなすのは至難です。その問題を解消して視覚的で使いやすいUIを提供してくれるのが Hydra
です。
ホームページ管理のためにEmacsをワークデスクとして色んな作業をしています。その中で何度も繰り返し行う作業はMakeファイルに書いて限りなく自動化して、それをEmacsから実行しています。
Emacsの設定にハマりだすとメールやインターネットプラウザなど全てのワークをEmacsで完結させよう…と考えるようになります。私もそんな一人でした。あれこれと設定を試すプロセスもまた楽しいからです。でもEmacsつながりでご縁ができたあるプログラマーの方のブログ Solist Work Blog を読んで少しずつ考え方が変わってきました。
EmacsのTwittering-modeで複数アカウントを扱うという課題に挑戦してみました。アカウント毎にログイン用のgpgファイルを生成し、基本設定部分をその都度リッセトしながら切り替えているだけです。意外と簡単に実現できたので備忘録として残しておきます。設定を見ていただければ、“な〜んだ(^o^)” という落ちでしょうね。
MacのTex環境(BasicTex)を2017basicからを2018basiにバージョンアップさせようとしてつまずいたので備忘録を残しておきます。
今どきは、Pandocなどで手軽にmd2pdfとかするのが流行りのようですが、私の場合は俳句関係での利用がメインで縦書きやルビうち、書籍としての組版などもするので目的別に txt2tex.plを作成して、makefileでtexファイルを自動生成したあとYaTeXでPDFにするようにしています。
今回は、インストール済みの古いTex環境を全て削除したうえで新たにインストールしました。
Scratchバッファはkillさせない。Scratchバッファーの内容を保存して再起動時に復元する。 これを実現させるための Emacs-lisp は沢山紹介されていますが、MELPAからpackage-installするだけで簡単に導入できるので紹介します。
Emacsのバッファー移動は、tabbar / ELscreen などのタブ系を使っていましたが、diredなどの隠れていてほしいバッファーまで開いてしまうのが嫌でした。 そんなときに、るびきちさんのこの記事を読んでiflipb.elを試してみましたのでレポートします。
Emacsのbufferをtabで切り替えるのはあまり好きでないので switch-buffer の機能を使っているが、magitやdired関係の不要なバッファーが沢山増えていくと煩わしくなる。
手動で削除すれば済む話ではあるが、やっぱり自動化したい。MELPAでいろいろpackageを探したが適当なものがなく、ググっていたら下記の記事を見つけました。
MacでEmacsを起動しているときに 'too many open file'
と出て固まってしまうことがありました。
別環境のDebianで起動しているEmacsでは、そうした現象もないので、Mac固有の問題だと考えて情報を収集していたら、 以下のTipsを見つけました。
以前にご紹介した下記の記事を、hydra.elを使って更に使いやすく工夫してみた。
まずは、設定ファイルの全容を貼り付けます。
;; Change mode-line color in view-mode
(use-package viewer)
(setq viewer-modeline-color-view "dark red")
(viewer-change-modeline-color-setup)
;; View-mode key map
(use-package keys-in-view-mode)
(with-eval-after-load 'view
(bind-key "h" 'backward-char view-mode-map)
(bind-key "j" 'next-line view-mode-map)
(bind-key "k" 'previous-line view-mode-map)
(bind-key "l" 'forward-char view-mode-map)
(bind-key "b" 'scroll-down view-mode-map)
(bind-key "0" 'beginning-of-line view-mode-map)
(bind-key "e" 'end-of-line view-mode-map)
(bind-key "g" 'goto-line view-mode-map)
(bind-key "G" 'View-goto-percent view-mode-map)
(bind-key "d" 'view-kill-whole-line view-mode-map)
(bind-key "m" 'magit-status view-mode-map)
(bind-key "v" 'vc-diff view-mode-map)
(bind-key "," 'howm-remember view-mode-map)
(bind-key "u" 'view-undo view-mode-map)
(bind-key "r" 'view-redo view-mode-map)
(bind-key "%" 'view-jump-brace view-mode-map)
(bind-key "w" 'forward-word+1 view-mode-map)
(bind-key "W" 'backward-word view-mode-map)
(bind-key "o" 'new-line-below-insert view-mode-map)
(bind-key "y" 'copy-region-as-kill view-mode-map)
(bind-key "Y" 'view-copy-line view-mode-map)
(bind-key "p" 'paste-at-cursor view-mode-map)
(bind-key "P" 'paste-at-down-line view-mode-map)
(bind-key "x" 'view-del-char view-mode-map)
(bind-key "X" 'view-backward-kill-line view-mode-map)
(bind-key "D" 'kill-end-of-line view-mode-map)
(bind-key "a" 'forward-char-to-insert view-mode-map)
(bind-key "A" 'end-of-line-to-insert view-mode-map)
(bind-key "i" 'view-mode view-mode-map)
(bind-key "I" 'beginning-of-line-to-insert view-mode-map)
(bind-key "L" 'pdf-preview-buffer view-mode-map)
(bind-key ":" 'view-mode view-mode-map)
(key-chord-define view-mode-map "gg" 'View-goto-line))
;; Add hl-line-mode to view-mode
(when (functionp 'hl-line-mode)
(add-hook 'view-mode-hook '(lambda () (hl-line-mode 1)))
(defadvice view-mode-disable (after disable-hl-line-mode activate)
(hl-line-mode -1)))
;; Customize to open file in view-mode
(defun neo-open-file (full-path &optional arg)
(neo-global--select-mru-window arg)
(view-file full-path))
;; PDF-preview
(with-eval-after-load 'view
(use-package pdf-preview)
(setq pdf-preview-font-rescale-factor 1.2)
(when (eq system-type 'darwin)
(setq pdf-preview-preview-command "open -a Preview.app"))
(when (eq system-type 'gnu/linux)
(setq pdf-preview-preview-command "evince"))
(setq ps-line-number t))
;; hydra-view-mode
(defhydra hydra-view-mode (:hint nil :exit t)
"
^Insert mode^ ^Move^ ^Delete^ ^Editing^ ^Utl
^^^^^^------------------------------------------------------------------------------------------
_a_: after cursor _spc_: next page _d_: one line _u_: undo _r_: redo _m_: magit-status
_i_: at the cursor _b_: prev page _x_: one char _y_: copy region _v_: vc-diff
_A_: at end line _w_: next word _X_: to begin line _Y_: copy line _n_: neotree
_I_: at begin line _W_: prev word _D_: to end line _p_: paste at cursor _L_: PDF preview
_o_: new line below _%_: match parens _P_: paste down line _,_: remember
"
;; Insert mode
("a" forward-char-to-insert)
("i" view-mode)
("A" end-of-line-to-insert)
("I" beginning-of-line-to-insert)
("o" new-line-below-insert)
;; Move
("b" scroll-down)
("spc" scroll-up)
("w" forward-word+1)
("W" backward-word)
("%" view-jump-brace)
;; Delete
("d" view-kill-whole-line)
("x" view-del-char)
("X" view-backward-kill-line)
("D" kill-end-of-line)
;; Editing
("u" view-undo)
("r" view-redo)
("y" copy-region-as-kill)
("Y" view-copy-line)
("p" paste-at-cursor)
("P" paste-at-down-line)
;; Utl
("m" magit-status)
("v" vc-diff)
("n" neotree-toggle)
("," howm-remember)
("L" pdf-preview-buffer)
("q" nil "leave"))
(define-key view-mode-map "." 'hydra-view-mode/body)