2011-03-28 32 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對齊將調整在紅寶石模式哈希。您需要添加其他羣組以便對齊其他羣組。