我刚刚开始使用 emacs,并且有一个我非常喜欢的功能,但搜索了一下没有结果。我希望其他人已经这样做了,因为我还不想学习 elisp。
void foo()<cursor>
我想输入一个“{”来导致这种情况发生
void foo(){
<cursor>
}
我希望这仅在 cc 模式下发生,并且仅在不在字符串/注释/等中时发生在行尾
首先想到的是重新绑定“{”以始终执行此操作(我自己可以弄清楚如何执行此操作),但很难让它只在正确的时间发生。
任何提示将不胜感激。
我刚刚开始使用 emacs,并且有一个我非常喜欢的功能,但搜索了一下没有结果。我希望其他人已经这样做了,因为我还不想学习 elisp。
void foo()<cursor>
我想输入一个“{”来导致这种情况发生
void foo(){
<cursor>
}
我希望这仅在 cc 模式下发生,并且仅在不在字符串/注释/等中时发生在行尾
首先想到的是重新绑定“{”以始终执行此操作(我自己可以弄清楚如何执行此操作),但很难让它只在正确的时间发生。
任何提示将不胜感激。
在最新的 emacs 上,您可以使用:
electric-pair-mode is an interactive compiled Lisp function.
(electric-pair-mode &optional ARG)
Automatically pair-up parens when inserting an open paren.
这已集成在 Emacs 24.1(实际上是 CVS)中
这将做到:
(defun my-c-mode-insert-lcurly ()
(interactive)
(insert "{")
(let ((pps (syntax-ppss)))
(when (and (eolp) (not (or (nth 3 pps) (nth 4 pps)))) ;; EOL and not in string or comment
(c-indent-line)
(insert "\n\n}")
(c-indent-line)
(forward-line -1)
(c-indent-line))))
(define-key c-mode-base-map "{" 'my-c-mode-insert-lcurly)
我衷心建议您尝试出色的自动配对次要模式 - 它不仅仅是插入大括号,而且使 Emacs 在该领域更像是 IDE。我想将它与 cc-mode 中的电动牙套设置相结合,或多或少会给您带来您所寻求的行为。
在 emacs 24 或更新版本中打开电对模式。
(electric-pair-mode 1)
尝试yasnippet(或在 Emacs Wiki 页面yasnippet 上)。Emacs 有很多包支持做这种事情,但是 yasnippet 目前似乎有动力并且非常可扩展。查看视频。
您需要深入研究 emacs-lisp 才能完全按照您的意愿执行此操作,因为 YASnippet 会为您做一些好事,但并不完全符合您的要求。
RET我认为最简单的方法是在 cc-mode 键映射中将函数绑定到键。
该函数应检查前一个字符是否为{,如果是,则执行所需的RET, RET, TAB, } , Up,TAB以获取所需的光标并插入结束}。
您可以通过检查平衡关闭}来使该功能更加健壮,但这会更加复杂,我建议您看看没有这个额外的抛光功能的感觉。
如果您愿意,我可以为您编写函数和键映射绑定,但是由于您要求了解它是如何完成的,如果您需要它,我会留给您寻求更多帮助。
或者,我发现autopair.el对我来说做得很好,我自己做换行符;)
您可能希望保留空函数体的选项,在这种情况下,您希望右大括号保持在同一行。如果是这种情况,那么您可以尝试这种替代解决方案:
当你想在函数体中添加语句时,你按下Return
键(当自动添加的右大括号仍在光标下时)。'Return' 键绑定如下:
;; automatic first line in function
(defun my-c-mode-insert-funline ()
(interactive)
(newline-and-indent)
(when (looking-at "}")
(newline-and-indent)
(forward-line -1)
(c-indent-line)))
(global-set-key (kbd "RET") 'my-c-mode-insert-funline)