在Emacs Prelude中启用特定于模式的Paren缩进

时间:2013-08-24 16:56:47

标签: emacs emacs24 emacs-prelude

所以我改用了Emacs Prelude,并且喜欢它;它有95%我想要的东西,这很可爱。我只想改变一件事:parens之间的模式特定缩进,la autopair.el。例如,如果我正在编写Scala并输入:

Object foo {

  bar() {}

}

...并在bar的大括号之间输入换行符,我应该得到:

Object foo {

  bar() {
    // And point should be here, a Scala-standard two-space indent in from bar.
  }

}

但是,如果我在PHP中编写的内容大致相同,我应该使用tab字符而不是双空格。

那么:有没有一种“正确”的方式通过custom.el进行调整? Prelude使用smartparens而不是autopair.el中配置的prelude-editor.el - 但我宁愿在不必破解“核心”Prelude的情况下对其进行配置,以便我可以轻松地合并更新。< / p>

思考?其他任何人都想到了如何使用smartparens或特别是Prelude?

2 个答案:

答案 0 :(得分:2)

按照惯例,我一发布这个就想出了...大多数答案。它很好,因为它有效,并通过custom.el工作;这很糟糕,因为它涉及重复的很多,我无法弄清楚如何干涸。

(sp-local-pair 'major-mode "{" nil :post-handlers '((my-create-newline-and-enter-sexp "RET")))                                                                                                                 
(sp-local-pair 'major-mode "(" nil :post-handlers '((my-create-newline-and-enter-sexp "RET")))                                                                                                                 
(sp-local-pair 'major-mode "[" nil :post-handlers '((my-create-newline-and-enter-sexp "RET")))                                                                                                                 
(sp-local-pair 'major-mode "<" nil :post-handlers '((my-create-newline-and-enter-sexp "RET")))                                                                                                                 

(defun my-create-newline-and-enter-sexp (&rest _ignored)                                                                                                                                                       
  "Open a new brace or bracket expression, with relevant newlines and indent. "                                                                                                                                
  (newline)                                                                                                                                                                                                    
  (indent-according-to-mode)                                                                                                                                                                                   
  (forward-line -1) 

所以这......好吧。不是很好,但还可以。有一个名为sp-pair-list的变量,我宁愿能够访问,但我无法弄清楚如何使用它。有谁有更好的想法?我很乐意宣布这样的事情并完成它:

(loop for c in 'sp-pair-list                                                                                                                                                                                 
  do (                                                                                                                                                                                                       
    sp-local-pair 'major-mode c nil :post-handlers '((my-create-newline-and-enter-sexp "RET"))))  

答案 1 :(得分:1)

你已经走上正轨了。我只想在你自己发布的答案中添加一些内容。

smartparens的一般想法是为不同的主要模式开发专门的配置,因此您可以为每个模式获得最佳体验。历史告诉我们,通用解决方案通常不是最理想的。

smartparens用户被鼓励为各种主要模式提交上游配置 - 已经有Ruby,Latex,Lisp和Lua的配置。为了所有smartparens用户的利益,您可能最好为Scala和PHP提交上游配置。 Prelude将启用那些现成的开箱即用。

微调所有东西的能力让我选择了Prelude的smartparens。我认为smartparens对未来的Emacs用户来说将变得更加重要(它已经成功取代了像paredit这样的庞然大物进行Lisp编程)。