无论是 ParEdit 还是 Smartparens 都很难用啊

尝试了这两款括号插件,各自都有着不同方面的遗憾。

ParEdit 在 Lisp-like 的语言下很好用,但是到了 C++ 之类的语言就难用无比。

  1. 输入括号会自动在括号前面加一个空格。在 Lisp 中这个特性很好,然而在 C++ 中简直是灾难
  2. paredit-semicolon 这个函数只针对分号有效,然而一般来说用“//”作为注释,所以只能把这个东西禁用掉

Smartparens 在某一些方面(比如对于其他mode的支持上)比 ParEdit 做得更好,然而实际用起来还不如 ParEdit

  1. 始终没有找到在c++ -mode中开启 strict-mode 的措施
  2. 在字符串中也会匹配括号

我现在直接使用默认的electric-pair-mode,感觉挺好的,基本满足需求。配置很简单:

(setq electric-pair-inhibit-predicate 'electric-pair-conservative-inhibit)
(electric-pair-mode 1)
2 个赞

没试过在非 Sexp 环境下用 ParEdit。Smartparens 貌似上手难度较大。

很多操作都需要其他package的辅助

比如我很喜欢 paredit 删除括号的功能(类似smartparens-strict)

很多功能真的很好用,可惜这些包还有些缺陷😢

找懒猫?论坛里m什么什么lazycat那位。

1 个赞

懒猫的这个帖子,看是否有帮助

paredit-open-parenthesis确实会多插入一个空格,用smartparens或者内置的electric-pair-mode就好了,我因为其他一些问题不用smartparens,用的electric-pair-mode,开启paredit之后把(改回self-insert-command就好了。然后paredit-killparedit-backward-delete(匹配才能删除)还是继续用。


@zmqclee @Roife 好像是paredit-space-for-delimiter-predicates,我的是nil,会插入空格。

Smartparens 那些函数/快捷键实在记不住,所以我用 hydra 打了个小抄(代码见 #27 楼):

34_AM

2 个赞

解决了

(defun no-space-for-delimiter-p (endp delim)
  (if (or (eq major-mode 'c++-mode)
          )
      nil
    t))


(use-package paredit
  :config
  (add-to-list 'paredit-space-for-delimiter-predicates 'no-space-for-delimiter-p))

你这段代码写太啰嗦,其实只要一行就够了:

(defun no-space-for-delimiter-p (endp delim)
  (not (eq major-mode 'c++-mode)))

函数名也不恰当,其意思跟返回结果刚好相反。

更为完善的版本:

(defun paredit/space-for-delimiter-p (endp delm)
  (or (member 'font-lock-keyword-face (text-properties-at (1- (point))))
      (not (derived-mode-p 'basic-mode
                           'c++-mode
                           'c-mode
                           'coffee-mode
                           'csharp-mode
                           'd-mode
                           'dart-mode
                           'go-mode
                           'java-mode
                           'js-mode
                           'lua-mode
                           'objc-mode
                           'pascal-mode
                           'python-mode
                           'r-mode
                           'ruby-mode
                           'rust-mode
                           'typescript-mode))))
  1. 覆盖了常见的非 lisp 语言。
  2. 函数后面不加空格 foo(,关键字后面加空格 if (
4 个赞

受教了,谢谢!

这个真是机智……


另外lazycat说他没有自动加空格的问题,好像有别人也没问题,我还以为是spacemacs又做了什么小动作……你那里在加这个函数之前有多加空格的问题吗?

如果不做修改,肯定是有问题的。其实不应该叫做问题,而是 feature:

之所以比较少看到抱怨,可能是:

  1. 用户少。再加上 melpa 打包的 dev 版有 bug,加剧了用户转投 smartparens 了。
  2. 不在乎是否加空格,或本来就赞成这种风格。
  3. 不写 c 类的语言。

应该是一个feature吧,因为如果写 lisp 系语言的话这个功能是很好用的

估计作者也没想到会在其它mode中使用emm,还把分号绑定成semicolon了…

作者给了这个变量,肯定是考虑了这种情况的,奇怪的是没有给个默认的值来fix在C系语言里也出现空格的行为……另外paredit-...-semicolon在我这里没有异常

在我这里被绑定在了分号键上,我只能把这个键unbind

你使用paredit-…-semicolon的时候注释符号的不是分号吗?

不太明白你的意思,我用的evil,insert-state下分号是paredit...semicolon,normal-state下是evil-repeat-find-char什么的,注释用的evil-nerd-commenter,spacemacs默认绑在SPC ;

我发现在js2-mode里没有按意料中地工作,这里用derived-mode-p更好吧?不过判断一个list中是否有任意一个符合这个predict,这个我不知道怎么写,你改下?

我在 c+±mode 下 分号 被绑定在了 semicolon函数,导致每次按分号都会运行这个函数…

确实 derived-mode-p 的适应性更好,我把 11# 楼例子改了。