help:如何实现输入括号的不补全对应的括号?

现在使用网上的配置文件,很智能的说,不过有时智能的过头了,比如已经有write()了,我想把write()放到if里面去,每次当我输入if(的时候结果自动变成了if ()write()…我想要的是if (write())。有没有什么办法临时让他不自动补全,或者补全之前先判断下后面是不是紧接着代码,如果是的话让代码包含在括号里,或者直接不进行补全。

补充:使用的是c语言

你所说的是在哪种编程语言下?有些 Major Mode 下的有特殊的输入括号的方法,比如 c-mode

另外最好先找出你所用的提供括号补全的包/配置,有这种功能的包应该有很多(内置的有 electric-pair-mode),你自己所用配置应该只有你自己清楚(如果你自己没兴趣找出来的话,请不要指望别人帮你找(猜)出来)。

输入半边括号可以用 C-q ( (quoted-insert) ,当然你也可以把你所有的括号补全的功能暂时关闭。

^q (确实是一个解决办法。 说实话我也不知道是哪个配置开启的括号自动补全,不过应该不是electric-pair-mode,使用^h m查看没有发现对应的mode。:disappointed_relieved:

不必对智能期望过高,它补在了不恰当的位置,正好是你可以发挥的时候。把 if 右边的)剪切下来,贴到 write()... 右侧用不了几个动作,比起你想着什么时候禁用补全/什么时候再开启,是更直觉的反应。

说是这样说,我还没去研究elisp,现在只是知道可以在输入字符后的钩子函数中实现,不过不知具体如何实现~

我用的配置是如果后面紧跟着字符就不补后括号如果跟空格就补后括号,大概你需要一个更适合你的配置

我前面其实是想说手动剪切:joy:,如果你不补全,也是要跳到末尾去补上右括号的。

还可以用 evil-surround,我觉得这是比较靠谱的做法。当括号前套比较多,你选中需要包裹的内容,相当于人肉 parse 一遍了,减少错漏。而如果当你只是插入左括号,整个结构暂时被破坏,语法着色什么的错乱了,有可能就把右括号放到错误的位置。

可以把这部分的代码发出来吗,看下怎么做的:pray:

看来evil-surround的使用介绍我没仔细的看,现在了解了,Thanks:blush:

我不是很清楚这部分是单独的函数还是用了全局包,不是我自己从头配置的,请参考 GitHub - redguardtoo/emacs.d: Fast and robust Emacs setup.

:sleepy:我也是菜鸟,先用evil-surround顶一下吧

陈斌的配置里我没找到相关的配置。。只是粗略地看了一下,整个配置太庞大了 :sweat_smile:。如果括号补全用的是 smartparens,只需要这样设置:

(sp-pair "(" nil :unless '(sp-point-before-word-p))

smartparens 还有很多复杂/有趣的用法(新鲜一阵子大概会忘掉其 90%),比如你已有:

(foo) bar
    ^

光标停在 ^ 位置,执行 sp-forward-slurp-sexp,变成:

(foo bar)
    ^

这也可以从另一个角度解决乱补齐右括号的问题。


如果用的不是 smartparens,且没有提供开关设置。最简单的方法就是找到补全的函数,用 advice 包起来。在函数执行之前关掉补全,执行之后恢复。这样就不用费脑力思考了。

条条道路通罗马。

2 个赞