私はDebian上のエディタは、emacs(26.1)をメインにしている。 まあ、vimが周辺をサポートしているのようなのだが。
用途は、org-mode(9.2.1)をメモに使っているのと、少し長めのpythonスクリプト。
Emacsを使っていると、smartparens が邪魔に感じる事がある。 parensがらみだ。細かく設定した対応する方法があるのかもしれないが、 私には無理っぽいので、hydraを使って逃げてみた。
emacs24.4以降、autopairs の機能が含められたらしく、 私にsmartparensは不要かも思うが、まあ頑張ってみている。 expand-region と組み合わせると、もしかしたら 使い易いくなるのかも、とか。 objedのようなパッケージを使った方がよかったのかもしれない。
smartparen (201908up)
smartparensは、show-smartparens-mode does not highlight the contained expression らしいので、 見た目の設定は、 rainbow-delimiters にやらせる。
(use-package smartparens :ensure t
:diminish smartparens-mode
:hook (
((css-mode html-mode web-mode mhtml-mode) . smartparens-mode)
((rst-mode markdown-mode text-mode) . smartparens-mode)
(org-mode . smartparens-mode)
(prog-mode . smartparens-mode)
)
:init
(progn
(use-package smartparens-config)
(smartparens-global-mode 1)
(show-smartparens-global-mode 1))
:commands smartparens-config
:config
(electric-pair-mode nil)
;; (show-smartparens-mode t) ; global-modeにすべきか
(sp-local-pair 'minibuffer-inactive-mode "'" nil :actions nil)
(sp-local-pair 'rst-mode "`" "`") ;; adds local pair
(sp-local-pair 'emacs-lisp-mode "`" nil :when '(sp-in-string-p))
;;
(defun my-sp-wrap-backquote ()
"Wrap following sexp in square brackets."
(interactive)
(sp-wrap-with-pair "`"))
(defun my-sp-wrap-squote ()
"Wrap following sexp in square brackets."
(interactive)
(sp-wrap-with-pair "'"))
)
;;
;;
(use-package rainbow-delimiters :ensure t
:diminish
:hook (
((css-mode html-mode web-mode) . rainbow-delimiters-mode)
((org-mode rst-mode markdown-mode text-mode) . rainbow-delimiters-mode)
((python-mode rust-mode) . rainbow-delimiters-mode)
)
:config
(setq rainbow-delimiters-outermost-only-face-count 1)
(show-paren-mode 1)
)
expand-region
expand-regionは、 modeによって使えるコマンドが異なったりするようで注意。 過信せず、少しづつ確認してゆくつもり。
(use-package expand-region :ensure t
:bind (
("C-M-:" . er/expand-region)
("C-M-;" . er/contract-region)
)
:config
(require 'expand-region)
)
hydra
hydra を使うことで、キーバインドの見直し改善。 やってみると、which-keyより素人向けかもしれないと思った。 グローバルに使うキーを設定するのがよいのだろう。
沢山メニュー項目を用意しても使えない。 シンプルにすべきだったと反省。
expand-regionでは、body-preで一旦markさせる。 どこで見付けたのか、メモ忘れ。
(use-package hydra :ensure t)
(defhydra hyd-sparen (:hint nil)
"SmartParens"
("u" sp-up-sexp "Up" :column "Move")
("d" sp-down-sexp "Down")
("f" sp-forward-sexp "forward")
("b" sp-backward-sexp "backward")
("a" sp-beginning-of-sexp "begin")
("e" sp-end-of-sexp "end")
("N" sp-backward-down-sexp "back and down")
("P" sp-backward-up-sexp "back and up")
("h" sp-backward-slurp-sexp "back slurp" :column "Slurping barfing")
("H" sp-backward-barf-sexp "back barf")
("l" sp-forward-slurp-sexp "forward slurp")
("L" sp-forward-barf-sexp "forward slurp")
("m" sp-mark-sexp "Mark" :column "Edit")
("w" sp-copy-sexp "Copy")
("t" sp-transpose-sexp "transpose")
("c" sp-change-inner "change inner")
("C" sp-change-enclosing "change enclose")
("k" sp-kill-sexp "kill")
("K" sp-backward-kill-sexp "back kill")
("0" sp-unwrap-sexp "Unwrap" :column "Wrap")
("R" sp-rewrap-sexp "rewrap")
("U" sp-backward-unwrap-sexp "bk unweap")
("[" sp-wrap-square "wrap[]")
("(" sp-wrap-round "wrap()")
("{" sp-wrap-curly "wrap{}")
("C" sp-wrap-cancel "Cancel")
("S" sp-split-sexp "Split" :column "Juggling")
("s" sp-splice-sexp "splice")
("r" sp-raise-sexp "raise")
("j" sp-join-sexp "join")
("t" sp-transpose-sexp "transpose")
("A" sp-absorb-sexp "absorb")
("E" sp-emit-sexp "emit")
("o" sp-convolute-sexp "convolute")
("q" nil "Exit" :exit t :column "Quit")
;("q" nil "cancel" :color blue)
)
(defhydra hyd-mark (:body-pre (er/expand-region 1)
:color red :hint nil)
"ExpandRegion"
("w" er/mark-word "Word" :column "Object1")
("c" er/mark-comment "Comment")
("s" er/mark-symbol "Symbol")
("S" er/mark-symbol-with-prefix "Prefixed symbol")
("d" er/mark-defun "def/func")
("q" er/mark-inside-quotes "In quotes" :column "Pairs")
("Q" er/mark-outside-quotes "Out quotes")
("(" er/mark-inside-pairs "In paren")
(")" er/mark-outside-pairs "Out paren")
("p" er/mark-text-paragraph "Paragraph" :column "Object2")
("t" er/mark-inner-tag "In tag")
("T" er/mark-outer-tag "Ou tag")
("." er/expand-region "Expand region")
("," er/contract-region "Contract region")
("u" er/mark-url "Url" :column "others")
("E" er/mark-email "Email")
("a" er/mark-html-attribute "HTML attribute")
("q" nil "Quit" :exit t :column "Quit")
)
(global-set-key (kbd "M-p") 'hyd-sparen/body)
(global-set-key (kbd "M-m") 'hyd-mark/body)
smartparensとexpand-regionのメニューをひとまとめにしたいが、 しばらく使ってみて、機能を絞り込んでから。