2019年2月28日木曜日

Emacsのsmartparen,expandregionを見直し?

私は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のメニューをひとまとめにしたいが、 しばらく使ってみて、機能を絞り込んでから。

0 件のコメント:

コメントを投稿

麻のボディタオル

2018年の秋(まだ、自転車を封印してない)、 近江上布伝統産業会館 で、興味からボディタオルを購入した。 お、よかった。: 自然派パン工房 ふるさとの道 ほぼ毎日風呂で使ってきて、ついに寿命がきたようだ。 お店の方に、「糸が痩せて破れてくる」まで使える、と...