2011-03-28 55 views
2

当我的代码:如何在emacs中添加智能分配和散列对齐缩进区域?

a = 1 
foo = 2 

,我想使它看起来像:

a = 1 
foo = 2 

我可以使用对齐到等于这里定义的函数:

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 

我想要做的 'CX H'(选择全缓冲), 'MC- \'(indent-区域),并把它看起来就像这样:

a = 1 
foo = 2 

some_other_code 

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

回答

8

尝试M-x align-regexp=。对于其他人也是如此。

+0

这适用于对齐函数的替换,但是如何将其添加到缩进区域并使其仅适用于哈希定义或分配组? (请参阅编辑原始问题以澄清我的意思。) – Loren 2011-03-28 02:57:25

+0

也许用一个新的defun调用indent-region,然后调用align-regexp。但我会简单地手动执行缩进区域,然后是所有的align-regexp。我不确定这个工作流程是否对这种自动化有足够的吸引力。 – vpit3833 2011-03-29 01:06:59

+0

令人惊叹!谢谢! – film42 2015-11-28 17:54:28

1

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对齐将调整在红宝石模式哈希。您需要添加其他群组以便对齐其他群组。