了解emacs align-regexp


31

我已经阅读了Emacs文档,align-regexp但是仍然很难理解它是如何工作的。我要说的是它的前缀形式C-uM-xalign-regexp,而不是简单形式M-xalign-regexp。这是我的问题:

  • 第一个参数(正则表达式)是否必须与字符串的整个行匹配?如果正则表达式仅匹配字符串的一部分怎么办?
  • 向第二个参数提供什么(要修改的括号组(如果为负,则进行调整))?据我了解,我需要提供捕获的组号(从1开始计数),对吗?“如果否定则为正”是指,如果我希望第3组正确对齐,我将提供-3输入内容吗?
  • 第三个参数“间距量(或列,如果为负)”是什么意思?我只是完全不了解此参数的作用。

我收集了一些文本示例进行练习。如果任何人都可以使用下面的文字作为示例,那将非常有帮助。


class CreateStudents < ActiveRecord::Migration
  def change
    create_table :students, :comment => "学生信息表" do |t|
      t.string :political_status, :comment => "政治面貌"
      t.string :education_level, :comment => "培养层次"
      t.string :enroll_method, :comment => "入学方式"
      t.date :enrolled_at, :comment => "入学时间"
      t.string :charge_type, :comment => "收费类别"
      t.string :enrolled_year, :comment => "学籍年度"
      t.string :enrolled_place, :comment => "生源所在地"
      t.string :bank_card_number, :comment => "银行卡号"
      t.string :bank_account_number,  :comment => "银行账号"
      t.boolean :is_active_duty, :default => false, :comment => "是否现役军人"
      t.boolean :is_equivalent_degree, :default => false, :comment => "是否同等学历"
      t.boolean :is_on_record, :default => true, :comment => "是否在籍"
      t.boolean :is_at_school, :default => true, :comment => "是否在校"
      t.timestamps
    end
  end
end

class CreateStudents < ActiveRecord::Migration
  def change
    create_table :students, :comment => "学生信息表" do |t|
      t.string  :political_status,     :comment => "政治面貌"
      t.string  :education_level,      :comment => "培养层次"
      t.string  :enroll_method,        :comment => "入学方式"
      t.date    :enrolled_at,          :comment => "入学时间"
      t.string  :charge_type,          :comment => "收费类别"
      t.string  :enrolled_year,        :comment => "学籍年度"
      t.string  :enrolled_place,       :comment => "生源所在地"
      t.string  :bank_card_number,     :comment => "银行卡号"
      t.string  :bank_account_number,  :comment => "银行账号"
      t.boolean :is_active_duty,       :default => false,  :comment => "是否现役军人"
      t.boolean :is_equivalent_degree, :default => false,  :comment => "是否同等学历"
      t.boolean :is_on_record,         :default => true,   :comment => "是否在籍"
      t.boolean :is_at_school,         :default => true,   :comment => "是否在校"
      t.timestamps
    end
  end
end

my @primes = (
    1,2,3,5,7,
    11,13,17,19,23,
    29,31,37,41,43,
);

my @primes = (
    1,  2,  3,  5,  7,
    11, 13, 17, 19, 23,
    29, 31, 37, 41, 43,
);

Answers:


31

好,首先进行对齐,然后说明其工作原理。

要对齐的第一个,选择线,做C-u M-x align-regexp和选择:\(\s-*\):11,和y

对于第二个,使用,\(\)11,和y

怎么运行的:

正则表达式将在该区域的每一行上进行尝试。在每行上,如果行尚未对齐,则它将在另一列上匹配。更具体地说,您选择的组(第二个参数,“要修改的括号组”)将在每行的不同列上结束。该函数将在其中一些的末尾添加空格,并从其他字符中删除字符,直到所有组都在同一列结束,并遵守在第三个参数中输入的间距限制。

例如,从第一种情况中提取一些代码:

  t.string( ):enroll_method, :comment => "入学方式"
  t.date( ):enrolled_at, :comment => "入学时间"
  t.boolean( ):is_active_duty, :default => false, :comment => "是否现役军人"

括号( )表示匹配的正则表达式的第一组。如您所见,每一行都在不同的列上结束。为了对齐,该函数将在第一行中的一个空格处添加一个空格,在第二行中的三个空格处添加一个空格,在第三行中不添加空格。

它会添加(或删除)多少个空格是由第三个参数“间距量”设置的。该参数实际上表示括号组的“自然”长度。在不需要对齐的行中,正是这个长度。

例如,在第二种情况下,如果选择通过regexp \(,\)1space 对齐,则会看到在第二行和第三行没有添加空格,因为逗号已经提供了“ spacing”(间距)1。

因此,回顾一下:

  • regexp:匹配您感兴趣的对齐位置;为此,其括号组之一将使用空格扩展,或通过删除字符来缩短
  • 括号组:选择哪一个
  • 间隔:如果该组短于此,则将在其中添加空格;如果更长,则将从结尾开始删除字符(当然,除非出于对齐目的而更长)
  • 重复:嗯,这很明显,我认为

参数变体(前缀减号):

  • 证明:该组内的非空白字符不会被删除,必要的空格将从左侧添加/删除。在第二种情况下,请尝试:regexp \([0-9]+\),group -1
  • 列(而不是间距):与固定的列对齐(当然,“重复”效果不佳)。

1

对原始问题的回答不是很深,但是我写的这段代码可能仍然有助于理解参数的工作方式(在代码中)。 这是链接


请在此处发布/解释代码;如果链接断开,仅链接的答案可能会出现问题。如果您希望仅将其保留为链接,请将答案转换为评论。

好吧,这是另一个emacs.stackexchange答案的链接-如果该答案无效,您也将不会看到此答案!(我同意这个答案似乎更像是一条评论)。
菲尔(Philips),2016年

1
我很乐意将其发布为评论,答案,代码段或任何您喜欢的内容(即使删除它也不会打扰我)。我只是在尝试提供帮助,对于像我这样的新手来说,很难找出干扰最小的协议路径(尽管我确实尝试过-在我看来,我的“答案”更像是答案的替代观点而不是答案)。评论其他人的帖子,这就是为什么我以这种方式发布它的原因。Ditto通过发布我的代码而不是仅发布链接来解释链接。我认为该链接比我的答案更适合我的次要答案。)最好的问候凯文
凯文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.