在paredit模式下上下移动表格


13

我一直在使用草书的“结构编辑”(Intellij和Cursive的类似paredit模式),并且在那里找到了一个不错的命令,称为“向上移动表格”(向下移动)。

向上移动表格可以做到这一点(这|就是重点):

(+ 1 |(+ 2 3) 4) => (+ (+ 2 3) 1 4)

和向下移动表格类似:

(+ 1 |(+ 2 3) 4) => (+ 1 4 (+ 2 3))

是否有可能在Emacs paredit-mode上执行此操作?我认为它不在基本paredit集合上(至少在本备忘单中没有描述)


真好 现在这是我可以看到的操作。
PythonNut

2
FWIW,至少对于您显示的两个示例,plain C-M-t所做的都是相同的事情。但是我想您的意思是,相同的表单会继续移动,而不是将进度交换到下一对性别。
2015年

Answers:


13

正如@Drew所建议的,C-M-t您想要做什么。规则是这样的:

  • 将点放在两个性别中间。
  • C-M-t(运行transpose-sexp)。
  • 左SEXP总是向右移动与点一起。这是非常重要的,否则您将永远困惑。

或者,您可以简单地认为这不是移调,而只是向前移动,您必须将点放置在要移动的六边形之后。

但是,有一个便利,就是当您想向后移置左sexp时,可以使用相同的C-M-t参数,但是要提供负的前缀参数,这很不方便。另一个问题是,该点不会跟随向后置的左sexp。为了解决这个问题,我们创建了一个反向版本transpose-sexps

(defun reverse-transpose-sexps (arg)
  (interactive "*p")
  (transpose-sexps (- arg))
  ;; when transpose-sexps can no longer transpose, it throws an error and code
  ;; below this line won't be executed. So, we don't have to worry about side
  ;; effects of backward-sexp and forward-sexp.
  (backward-sexp (1+ arg))
  (forward-sexp 1))

然后,将其绑定到默认Emacs中免费的C-M-y旁边C-M-t

(global-set-key (kbd "C-M-y") 'reverse-tranpose-sexps)

这是一个演示;您会注意到,(MY-SEXP1)该按钮始终在左侧向前/向后移动:

在此处输入图片说明


5

可以使用lispy来实现,它是的高级形式paredit-mode

对于您的用例:

  • w 向上移动
  • s 下移

唯一的问题是光标必须位于paren中,在您的示例中为:

(+ 1 |(+ 2 3) 4)

如果您用一个区域标记,也可以使用w和一次移动多个六边形s。请参阅文档以获取更多信息。


;; 有没有办法只使用这两个命令?;; 我这样做似乎松开了“ M-left”和“ M-right”:`(add-hook'clojure-mode-hook(lambda()(lispy-mode 1))(local-set-key(kbd“ M -<up>“)'lispy-move-up)(本地设置键(kbd” M- <down>“)'lispy-move-down)))'
nha

1

这是另一个命令(来自library misc-cmds.el),几乎可以完成您所请求的操作。只需将其绑定到单个键(C-M-t或其他任何键)即可。使用它可以重复向前和向后移动六分仪。

负前缀arg像一样向后转置transpose-sexp,但是它也使指向点准备进行另一个向后转置。并且当重复时,负前缀arg只会反转方向。

因此,如果将命令绑定到,C-o然后将指向点左侧的sexp向右移动3次,然后向左移动两次,然后向右移动一次。C-o C-o C-o C-- C-o C-o C-- C-o

数字前缀arg仅在第一次使用时才有效,即在重复时不起作用-重复时,每次移动始终为六分之一。

(defun reversible-transpose-sexps (arg)
  "Reversible and repeatable `transpose-sexp'.
Like `transpose-sexps', but:
 1. Leaves point after the moved sexp.
 2. When repeated, a negative prefix arg flips the direction."
  (interactive "p")
  (when (eq last-command 'rev-transp-sexps-back) (setq arg  (- arg)))
  (transpose-sexps arg)
  (unless (natnump arg)
    (when (or (> emacs-major-version 24)
              (and (= emacs-major-version 24)  (> emacs-minor-version 3)))
      (backward-sexp (abs arg)) (skip-syntax-backward " ."))
    (setq this-command  'rev-transp-sexps-back)))

(注意:行为transpose-sexps在24.4中进行了更改,因此在此处进行了版本测试。在24.4之前,point最终在正确的位置继续(例如重复)。从24.4开始,point的位置不正确。大概是在旁观者的眼中,回归,添加有用的功能或修复其他错误。;-)我现在为此提交了Emacs 错误#20698。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.