2

我正在尝试 ParEdit 模式,这不是我想要的方式:它隐藏了原始绑定C-M-F并将其替换为C-M-f. 即它转发 sexp 而不是选择它:| 乍一看,我找不到定义绑定的地方。

有什么办法可以取消这种行为?或者 ParEdit 中用于选择性别的模拟命令是什么?

编辑:

为了让您更好地了解会发生什么,如果我C-h k在 ParEdit 处于活动状态时这样做,那么C-M-S-f这就是我得到的:

C-M-f (translated from C-M-S-f) runs the command paredit-forward,
which is an interactive compiled Lisp function in `paredit.el'.

It is bound to C-M-f.

(paredit-forward)

Move forward an S-expression, or up an S-expression forward.
If there are no more S-expressions in this one before the closing
  delimiter, move past that closing delimiter; otherwise, move forward
  past the S-expression following the point.

C-M-f

(foo |(bar baz) quux)
  ->
(foo (bar baz)| quux)

(foo (bar)|)
  ->
(foo (bar))|

[back]

我不希望它翻译任何东西,这绝对是不受欢迎的行为。

4

3 回答 3

2

Paredit 没有翻译密钥。Emacs 是。在每种模式下都是一样的。如果 CMF 没有绑定,Emacs 将尝试使用 CMf。

如果你想在点之后选择 S 表达式,标准的 Emacs 键是 CM-SPC。

于 2013-06-13T14:27:23.813 回答
2

您可以使用:

(eval-after-load "paredit"
  '(progn
    (define-key paredit-mode-map (kbd "C-M-f") nil)))

严格来说 progn 是不必要的,但您可能想在之后重新定义/删除更多键

编辑

与 forward-sexp 不同,paredit-forward 不检查是否按下了 shift。你可以尝试使用这个

(eval-after-load "paredit"
  '(progn
    (define-key paredit-mode-map (kbd "C-M-S-f") 
     (lambda ()
       (interactive)
       (unless (region-active-p)
         (set-mark (point)))
       (paredit-forward)))))

编辑

做同样事情的另一种方法(选择以下 sexp)是 CM 空间。然后,如果您想这样做,您可以使用 Cx Cx 交换点和标记(或 Cx(此处没有延迟)如果您使用 CUA,则为 Cx Cx)

编辑(最后?)

当按下 shift 时,使函数也标记的正确方法是:

(put 'paredit-forward 'CUA 'move)
于 2013-01-05T12:29:59.353 回答
0

复活一个非常古老的问题,但我想我知道一个更通用的解决方案。

paredit是一种非常古老的包装,早于现代包装卫生。即默认键绑定的激进设置。

要撤消该操作,请在加载 paredit 包后运行:

  (paredit-do-commands (spec keys _fn _examples) nil
    (dolist (key keys)
      (define-key paredit-mode-map (read-kbd-macro key) nil)))

现在您又回到了没有键绑定的状态,您可以使用常规机制。阅读上面的值(不是文档)paredit-commands以查看哪些命令可用以及它们的默认绑定是什么,其中一些您可能希望保留。

于 2020-03-13T14:51:31.953 回答