结构化Haskell模式[SHM]:如何通过<backspace>或<del>删除单括号或字符串引号?

Structured Haskell Mode [SHM]: How to delete single bracket or string quote by <backspace> or <del>?

假设我想删除某些表达式周围的括号,例如我想打开 (not True).

字符串双引号分隔符、大括号、方括号也是如此,我相信还有其他东西。

SHM 中是否有一些预定义的函数来展开表达式?或者我应该用一些手动键覆盖此行为 bindings/actions?

structured-haskell-mode 深受 paredit 的影响,这是它获得基本移动和编辑绑定的地方。您可以通过在 Emacs 帮助系统中查找(最简单的方法:打开 lisp 缓冲区,启用 paredit,C-h m)或使用此 handy cheatsheet(其中看起来很合理,但我没读过)。

此外,这个 video introductionparedit for Lisp 可能值得一看。

对于您的具体问题:M-s 删除当前的嵌套级别。在 paredit 中,这适用于圆括号、方括号或引号,但目前看来 shm 仅支持圆括号。您可以在表达式内的任何位置调用它:

((a |b c) d e f)
M-s
(a b c d e f)

编辑:正如@ReinHenrichs 指出的那样,在使用 M-s 删除周围的括号之前,您必须使用 M-a 将选择范围扩展到整个节点,这就是它不起作用的原因早点给我。

与此同时,一个不错的解决方法是将 DEL 重新绑定到 haskell-indentation-delete-backward-char 之类的东西(或任何适合您的设置的东西),以便您可以像以前一样删除结构字符。从一些实验来看,shm 似乎可以优雅地针对未正确解析的代码进行降级,因此这并不太不方便。

将此键绑定放入您的 emacs 配置文件中:

(global-set-key (kbd "C-c C-d") 'delete-pair)

现在您可以将点放在对的开始部分(括号、方括号、引号等)之前,或者在 SHM 中使用 M-a 转到下一个外部对并按 C-c C-d 删除对。