所以任务是转向这个,例如:
(blah
(a (b)
c))
Run Code Online (Sandbox Code Playgroud)
进入这个:
(blah
[a (b)
c])
Run Code Online (Sandbox Code Playgroud)
使用paredit模式,移动到表达式的开头,(a ..)然后:
C-M-SPC [ <right> M-s
Run Code Online (Sandbox Code Playgroud)
没有paredit,但仍希望在转换期间保持平衡的parens,移动到a然后按C-M-SPC多次直到出现错误然后(假设CUA模式已打开):
C-x <timeout> <right> <backspace> <backspace> [ ] <left> C-v
Run Code Online (Sandbox Code Playgroud)
那很复杂,所以让我们坚持使用paredit模式版本,并尝试从中发出命令.键盘宏编辑器会告诉您正在使用的命令的名称,因此您至少可以提供以下代码:
(defun my-switch-to-square ()
"Change (..) to [..]."
(interactive)
(mark-sexp --)
(paredit-open-square --)
(right-char --)
(paredit-splice-sexp --))
Run Code Online (Sandbox Code Playgroud)
--表示我们尚未决定的部分代码.在阅读代码中的每个函数的文档后,您将了解要传递的参数,并且无需调用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))
Run Code Online (Sandbox Code Playgroud)
以下代码可满足您的要求。您可以绑定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"))))
Run Code Online (Sandbox Code Playgroud)