我见过一个Vim的插件,名为AutoClose(从这篇文章中发现),在输入'(','{'等时会自动添加右括号.
例如; 当我键入以下内容(|是光标)时:
int main(|
Run Code Online (Sandbox Code Playgroud)
我希望)自动插入关闭:
int main(|)
Run Code Online (Sandbox Code Playgroud)
有没有人知道emacs的类似功能 - 谷歌这次失败了!
dfa*_*dfa 16
是的,这种模式叫做电动.您可以将电动行为与这个简单的宏结合起来,以获得最大的舒适度:
(defun electric-pair ()
"If at end of line, insert character pair without surrounding spaces.
Otherwise, just insert the typed character."
(interactive)
(if (eolp) (let (parens-require-spaces) (insert-pair))
(self-insert-command 1)))
Run Code Online (Sandbox Code Playgroud)
然后通过在您喜欢的编程模式中将相应的字符绑定到它来启用它.例如,对于PythonMode:
(add-hook 'python-mode-hook
(lambda ()
(define-key python-mode-map "\"" 'electric-pair)
(define-key python-mode-map "\'" 'electric-pair)
(define-key python-mode-map "(" 'electric-pair)
(define-key python-mode-map "[" 'electric-pair)
(define-key python-mode-map "{" 'electric-pair)))
Run Code Online (Sandbox Code Playgroud)
CPerl模式将此作为内置提供:
;; from my .emacs
(add-hook 'cperl-mode-hook
(lambda ()
(setq cperl-hairy nil
abbrev-mode t ;; automatic keyword expansion
cperl-highlight-variables-indiscriminately t
cperl-auto-newline t
cperl-auto-newline-after-colon t
cperl-regexp-scan nil
cperl-electric-keywords t
cperl-electric-linefeed t
cperl-electric-parens nil) ;; <------ electric parens!
Run Code Online (Sandbox Code Playgroud)
其他模式可以提供类似的东西.
小智 5
我要破坏这个线程,并提供另一种选择.最近开始的一个新项目涉及自动插入对,区域包裹,平衡表达式导航以及更多内容.功能列表太长了,所以我只需链接到smartparens github repo,您可以在其中阅读详细的自述文件.
它是上述AutoPair的超集,并提供了paredit的大部分核心功能(并扩展到各种不同的对,而不仅仅是emacs语法表识别的那些).