【问题标题】:Enabling Mode-Specific Paren Indentation in Emacs Prelude在 Emacs Prelude 中启用特定于模式的括号缩进
【发布时间】:2013-08-24 16:56:47
【问题描述】:

所以我已经切换到 Emacs Prelude,并且喜欢它;它带有我想要烘焙的 95% 的东西,这很可爱。我只想更改一件事:括号之间的特定于模式的缩进,例如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 的情况下进行配置,以便我可以轻松合并更新。

想法?还有其他人想出如何使用smartparens 或特别是 Prelude 来做到这一点吗?

【问题讨论】:

    标签: emacs emacs24 emacs-prelude


    【解决方案1】:

    按照惯例,我一发布此消息,就想出了……大部分答案。这很好,因为它可以工作,并且可以通过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"))))  
    

    【讨论】:

      【解决方案2】:

      您已经在正确的轨道上。我会在你自己发布的答案中添加一些内容。

      smartparens 的总体思路是为不同的主要模式开发专门的配置,这样您就可以获得每种模式的最佳体验。历史告诉我们,通用解决方案通常不是最理想的。

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

      微调几乎所有内容的能力使我为 Prelude 选择了 smartparens。我认为 smartparens 在未来对 Emacs 用户来说会变得更加重要(它已经成功地取代了 Lisp 编程中的 paredit 之类的庞然大物)。

      【讨论】:

      • 啊,好吧!根据我的习惯 (autopair.el),我一直在考虑这个问题——虽然我在 sp 源代码中发现了 smartparens-ruby.el,但我没有考虑足够长的时间来思考为什么会这样在那里......
      • 无论如何:感谢您的清晰,以及 Prelude(非常棒的老板)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      相关资源
      最近更新 更多