かっこと角かっこを入れ替えるコマンドを括弧モードで定義するにはどうすればよいですか?
4 に答える
したがって、タスクはこれを有効にすることです。たとえば、次のようになります。
(blah
(a (b)
c))
これに:
(blah
[a (b)
c])
paredit モードでは、式の先頭に移動してから、次のようにします(a ..)
。
C-M-SPC [ <right> M-s
パーディットなしで、トランジション中にバランスの取れたペアを維持したい場合は、に移動してから、エラーが発生するまで複数回a
押しC-M-SPC
てから、(CUA モードがオンであると仮定して):
C-x <timeout> <right> <backspace> <backspace> [ ] <left> C-v
それは複雑なので、paredit モード バージョンに固執して、それからコマンドを作成してみましょう。キーボード マクロ エディターは、使用されているコマンドの名前を表示するので、少なくとも次のコードを思い付くことができます。
(defun my-switch-to-square ()
"Change (..) to [..]."
(interactive)
(mark-sexp --)
(paredit-open-square --)
(right-char --)
(paredit-splice-sexp --))
--
まだ決定していないコードの部分を示します。コード内の各関数のドキュメントを読むと、渡す引数と、 を呼び出す必要がないことがわかりますmark-sexp
。docstring を書き直して への呼び出しを追加するとleft-char
、コードは次のようになります。
(defun my-switch-to-square ()
"Change |(..) to |[..]. | is point position."
(interactive)
(paredit-open-square 1)
(right-char 1)
(paredit-splice-sexp)
(left-char 1))
次のコードは、要求したことを実行します。swap-parens
任意のキー バインディングにバインドできます。
(defvar swap-paren-pairs '("()" "[]"))
(defun swap-parens-at-points (b e)
(let ((open-char (buffer-substring b (+ b 1)))
(paren-pair-list (append swap-paren-pairs swap-paren-pairs)))
(while paren-pair-list
(if (eq (aref open-char 0) (aref (car paren-pair-list) 0))
(save-excursion
(setq to-replace (cadr paren-pair-list))
(goto-char b)
(delete-char 1)
(insert (aref to-replace 0))
(goto-char (- e 1))
(delete-char 1)
(insert (aref to-replace 1))
(setq paren-pair-list nil))
(setq paren-pair-list (cdr paren-pair-list))))))
(defun swap-parens ()
(interactive)
(cond ((looking-at "\\s(")
(swap-parens-at-points (point) (save-excursion (forward-sexp) (point))))
((and (> (point) 1) (save-excursion (forward-char -1) (looking-at "\\s)")))
(swap-parens-at-points (save-excursion (forward-sexp -1) (point)) (point)))
((message "Not at a paren"))))
「コマンドを定義する」の意味がわかりませんか?次のように実行できます。
|(foo bar)
"|" がポイントです。
;; Keyboard Macro Editor. Press C-c C-c to finish; press C-x k RET to cancel.
;; Original keys: C-u [ C-f <M-up> C-b
Command: last-kbd-macro
Key: none
Macro:
C-u [ ;; paredit-open-square
C-f ;; forward-char
<M-up> ;; paredit-splice-sexp-killing-backward
C-b ;; backward-char
正直なところ、このタイプの使用シナリオは、VIM のトリックでより一般的です。この IRL を実際に使用したことはありません。
bzrブランチlp:sx-emacs-werkstatt
pareditに触発されたライブラリを提供しますが、より詳細なコマンドを提供します
Mx ar-bracket-parentized-atpt RET
ポイントで括弧を囲みます
thing-at-point-utils.elと他に提供されている他のファイルの内部を見てください