Emacs:如何对齐文本而不是整行?

8
我曾使用过唯一支持此功能的编辑器是Sublime Text 2(我相信很多编辑器也支持),但希望emacs也有其独特的技巧。对于某些具有相当声明性语法的课程,如果源代码保持列格式,则看起来更清晰。问题在于,当新行将某一列的长度增加了一个或两个空格时……您必须逐行重新对齐它。

下面的截图可能可以解释我的意思:

Columnized text out of alignment

在这里,我添加了一行,其中一个列扩展到比其他列更远,因此我想重新对齐所有内容。通常情况下,我只需在箭头和空格键周围重复按键,直到逐行重新对齐所有内容,但如果有一种方法可以选择矩形区域并强制该区域的非空格文本部分进入对齐状态,那就太好了。

是否有可能做到这一点呢?


3
哈!___编辑器可以做X,Emacs能做X吗?除非X是一个水平滚动条,否则答案很可能是可以的。;) (注:空格处应填入具体的编辑器名称) - event_jr
3个回答

22

与其使用矩形,你可以使用 align-regexp。选择区域后执行以下操作:

C-u M-x align-regexp RET ,\(\s-*\) RET 1 RET 1 RET y

如果你经常这样做,可以创建一个函数:

(defun my-align-after-commas (beg end)
  (interactive "r")
  (align-regexp beg end ",\\(\\s-*\\)" 1 1 t))

然后选择区域,按下 M-x my-align-after-commas


正则表达式中的-是什么意思? - malana
1
\s- 在 Emacs 正则表达式中表示空白字符(实际上是一种语法类别,请参阅手册如果你真的感兴趣)。 - scottfrazer
1
@mmmasterluke \s- 是emacs中用于表示空格的元字符,与\s不同。Emacs的正则表达式有点奇怪。 - jdd
1
请查看 M-: (info "(elisp) Syntax Class Table") RET,以及 "(elisp) Regexp Backslash"。每个类别都可以使用 \sCODE 的正则表达式进行匹配,其中 CODE 是给定语法类别的代码(\SCODE 匹配除此之外的任何内容)。 - phils

5

还有一个列化库,可以将这个东西转化为:

(defvar enform-keywords-statements
  '( "AT END"  "AT  START" "CLOSE" "DECLARE" "DELINK" "DICTIONARY"     
     "EXIT" "FIND" "FOOTING" "LINK" "LIST" "OPEN" "PARAM" "SET"            
     "SUBFOOTING" "SUBTITLE" "TITLE" )
  "List of ENFORM statement keywords. Used to create the `font-lock-keywords' table.")

转化成以下内容:

(defvar enform-keywords-statements
  '( "AT END"      "AT  START"   "CLOSE"       "DECLARE"     "DELINK"      
     "DICTIONARY"  "EXIT"        "FIND"        "FOOTING"     "LINK"        
     "LIST"        "OPEN"        "PARAM"       "SET"         "SUBFOOTING"  
     "SUBTITLE"    "TITLE"        )
  "List of ENFORM statement keywords. Used to create the `font-lock-keywords' table.")

你需要选择要对齐的区域,然后使用命令M-x columnize-text。有关此功能及其他详细信息,请参见EmacsWiki页面:http://www.emacswiki.org/emacs/CategoryAlignment

4

Emacs可以让你选择矩形区域,也可以让你编辑整个列。要删除一个矩形区域,请在一个角落设置标记,在另一个角落设置光标,然后M-x kill-rectangle。您可以通过相同的方式标记一个空白矩形,然后M-x open-rectangle来添加一个空白矩形。

这只是我知道的方法;毫无疑问还有其他可能更好的方法。


感谢您的回复。我想把这一列向右移动一个空格,而不是删除它。 当我设置标记(假设您指的是C-Space),然后将光标移动到另一个角落时,它似乎选择了标记和光标之间的整行? - d11wtq
抱歉,在我打字的时候错过了你的编辑,让我们看看会发生什么,谢谢! :) - d11wtq
或者使用 cua-selection-mode:在左上角按下 C-RET 开始矩形编辑,移动到右下角,按 <down> 键,使用 SPC 在每一行的开头插入一个空格,再次按下 C-RET 禁用矩形编辑。有关文档,请使用 M-x find-library RET cua-base RET 并搜索“CUA矩形支持”中的注释。 - phils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接