交换圆括号和方括号在Emacs Paredit(Swap parentheses and squar

2019-08-06 01:40发布

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

Answer 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"))))


Answer 2:

所以,任务是把这个,例如:

(blah
 (a (b)
    c))

这个:

(blah
 [a (b)
    c])

与paredit模式,移动到开始表达(a ..)然后:

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

如果没有paredit,但仍希望转变过程中保持平衡的括号,移动到a ,然后按CM-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 。 改写文档字符串并添加调用后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))


Answer 3:

我不知道你所说的“定义命令”是什么意思? 你可以像下面这样做:

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



Answer 4:

BZR分支LP:SX-的Emacs WERKSTATT

将提供由paredit启发库,但提供更详细的命令

MX AR-托架parentized-ATPT RET

在点放周围parenteses括号

看看里面的东西,在点-utils.el和其他文件提供些什么



文章来源: Swap parentheses and square brackets in Emacs Paredit