在Emacs Paredit中交换括号和方括号

时间:2013-01-08 10:42:54

标签: emacs elisp paredit

如何在paredit模式下定义一个交换括号和方括号的命令?

4 个答案:

答案 0 :(得分:8)

因此,任务是转变它,例如:

(blah
 (a (b)
    c))

进入这个:

(blah
 [a (b)
    c])

使用paredit模式,移至表达式(a ..)的开头,然后:

C-M-SPC [ <right> M-s

如果没有paredit,但仍希望在转换期间保持平衡的parens,请移至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))

答案 1 :(得分:5)

以下代码执行您的请求。您可以将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"))))

答案 2 :(得分:2)

我不确定“define command”是什么意思?你可以这样做:

|(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。

答案 3 :(得分:0)

bzr branch lp:s-x-emacs-werkstatt

将提供受paredit启发的图书馆,但提供更详细的命令

M-x ar-bracket-parentized-atpt RET

在括号内点括号

查看thing-at-point-utils.el内部以及其他文件提供的内容