【问题标题】:Emacs: align text, but not the entire line?Emacs:对齐文本,但不是整行?
【发布时间】:2011-09-20 12:17:58
【问题描述】:

我曾经使用过的唯一支持此功能的编辑器(不过我相信很多人都支持)是 Sublime Text 2,但希望 emacs 也有它的诀窍。如果源代码保持分列,我处理的一些具有相当声明性语法的类看起来更清晰。当新行将一列的长度增加一到两个空格时,问题就出现了......然后您必须通过每一行重新对齐它。

屏幕截图可能说明了我的意思:

在这里,我添加了一行,如果它的列比其他列延伸得更远,那么我想再次重新对齐它。通常我只是围绕箭头和空格键重复循环我的手指,直到我逐行重新对齐所有内容,但如果有一种方法可以选择一个矩形区域并强制将该区域的文本非空白部分对齐。

这可能吗?

【问题讨论】:

  • 哈! ___ 编辑器做 x,Emacs 能做 x 吗?除非 X 是水平滚动条,否则答案可能是肯定的。 ;)

标签: emacs indentation


【解决方案1】:

您可以使用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

【讨论】:

  • 正则表达式中的- 是什么?
  • \s- 表示 Emacs 正则表达式中的空格(它实际上是一个语法类,如果你真的感兴趣,请参阅手册)
  • @mmmasterluke \s- 是 emacs 的空白元字符,而不仅仅是 \s。 Emacs 的正则表达式有点时髦。
  • M-: (info "(elisp) Syntax Class Table") RET,也见"(elisp) Regexp Backslash"。对于给定的语法类 CODE,每个类在正则表达式中与 \sCODE 匹配(\SCODE 匹配除此之外的任何内容)。
【解决方案2】:

还有columnize library 可以改变这个:

(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

【讨论】:

    【解决方案3】:

    Emacs 允许您选择矩形区域,并且允许您编辑整列。要删除矩形区域,请将标记设置在一个角,指向另一个,然后M-x kill-rectangle。你可以用同样的方法添加一个空白矩形,然后M-x open-rectangle

    这正是知道如何做到这一点的方式;毫无疑问,还有其他可能更好的方法。

    【讨论】:

    • 感谢您的回复。我想将列(在这种情况下)向右移动一个空格,而不是删除它。当我设置标记(假设你的意思是 C 空间)然后将点移动到另一个角时,它似乎选择了标记和点之间的整条线?
    • 抱歉,我在打字时错过了您的编辑,让我们看看会发生什么,谢谢! :)
    • cua-selection-mode on:C-RET 在上角开始矩形编辑,<down> 在下角,SPC 在每行的开头插入一个空格,@ 987654327@ 再次禁用矩形。有关文档,请使用 M-x find-library RET cua-base RET 并在“CUA 矩形支持”上搜索 cmets。
    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2011-10-29
    • 2015-10-07
    • 2021-08-14
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多