【问题标题】:How can I add intelligent alignment of assignments and hashes to indent-region in emacs?如何在 emacs 中将分配和哈希的智能对齐添加到缩进区域?
【发布时间】:2011-07-24 04:01:23
【问题描述】:

当我有代码时:

a = 1
foo = 2

我想让它看起来像:

a   = 1
foo = 2

我可以使用这里定义的 align-to-equals 函数:

Emacs hotkey to align equal signs

通过选择区域并运行该功能。我可以通过将函数定义中的 '=' 更改为 '=>' 来更改函数以用于散列,并具有:

bar = { :a => 1,
 :foo => 2 }

转换为:

bar = { :a   => 1,
        :foo => 2 }

当我选择整个缓冲区并运行缩进区域时,我希望对我的所有代码进行这种对齐。但我希望它能够智能地完成 - 不是将缓冲区中的每个 '=' 与最右边的 '=' 对齐,而是对分配块和单个哈希文字进行对齐。

编辑:为了澄清最后一部分,假设我有以下缓冲区:

a = 1
foo = 2

some_other_code

def fn
  bar = { :a => 1,
   :foo => 2 }
end

我想做'C-x h'(选择整个缓冲区),'M-C-\'(缩进区域)并让它看起来像这样:

a   = 1
foo = 2

some_other_code

def fn
  bar = { :a   => 1,
          :foo => 2 }
end

【问题讨论】:

    标签: ruby emacs elisp code-formatting


    【解决方案1】:

    试试M-x align-regexp=。其他人也一样。

    【讨论】:

    • 这可以替代 align-to-equals 函数,但是如何将它添加到 indent-region 并使其仅在本地应用于哈希定义或分配组? (请参阅对原始问题的编辑以澄清我的意思。)
    • 也许有一个新的 defun 会调用 indent-region 后跟 align-regexp。但我会简单地做 indent-region 后跟所有 align-regexp 手动。我不确定这个工作流程是否对这种自动化有足够的吸引力。
    【解决方案2】:

    align.el 为此提供对齐功能:

    在 .emacs 中添加

         (push (ruby-hash-string
                 (regexp . "\\(\\s-*\\)\\(\"[^\"]*\"\\|:[a-zA-Z]*\\)\\(\\s-*\\)=>\\(\\s-*\\)")
                 (group . (1 3 4))
                 (repeat . t)
                 (modes '(ruby-mode)))
            align-rules-list)
    

    然后 M-x align 将在 ruby​​ 模式下对齐哈希。您需要为要对齐的其他事物添加其他组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多