Понимание 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,
);
Просто ученик
источник

Ответы:

31

Хорошо, сначала выравнивания, а затем объяснение того, как это работает.

Для выравнивания первого, выберите строки, сделать C-u M-x align-regexpи выбрать: \(\s-*\):, 1, 1, и y.

Для второго, использования ,\(\), 1, 1и y.

Как это работает:

Регулярное выражение проверяется на каждой строке в регионе. На каждом, если строки еще не выровнены, он будет совпадать в другом столбце. В частности, выбранная вами группа (второй параметр, «группа скобок для изменения») будет заканчиваться в разных столбцах в каждой строке. Функция добавляет пробелы в конце некоторых из них и удаляет символы из других, пока все группы не заканчиваются в одном и том же столбце, соблюдая ограничения на интервалы, введенные в третьем параметре.

Например, взяв несколько строк из первого случая:

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

Круглые скобки ( )представляют первую группу соответствующего регулярного выражения. Как вы можете видеть, в каждой строке она заканчивается в другом столбце. Для выравнивания функция добавит один пробел к одному в первой строке, три пробела к одному во второй строке и ни одного в третьей.

Сколько пробелов будет добавлено (или удалено), задается третьим параметром, «количеством интервалов». Этот параметр действительно означает, какой должна быть «естественная» длина группы скобок. В линиях, которые не нуждаются в выравнивании, это будет именно эта длина.

Например, во втором случае, если вы выберете выравнивание по regexp \(,\), spacing 1, вы увидите, что во второй и третьей строках пробел не добавляется, потому что запятая уже обеспечивает «интервал», равный 1.

Итак, резюмируем:

  • regexp: соответствует месту, которое вы заинтересованы в выравнивании; для этого одна из групп скобок будет расширена пробелами или сокращена путем удаления символов
  • группа скобок: выберите какой
  • интервал: если группа короче этой, к ней будут добавлены пробелы; если он длиннее, символы будут удалены из него, начиная с конца (если, конечно, он не длиннее для выравнивания)
  • повторяю: ну это очевидно, я думаю

Варианты параметров (перед знаком минус):

  • justify: непустые символы внутри группы не будут удалены, а необходимые пробелы будут добавлены / удалены слева. Во втором случае попробуйте: regexp \([0-9]+\), group -1.
  • column (вместо пробела): выровнять по этому фиксированному столбцу (конечно, с «repeat» он работает плохо).
Ангус
источник
1

Не глубокий ответ на исходный вопрос, но этот фрагмент кода, который я написал, может все же помочь понять, как работают параметры (в коде). Вот ссылка

Kevin
источник
Пожалуйста, опубликуйте / объясните код здесь; Ответы только на ссылку могут быть проблематичными, если ссылка не работает. Если вы хотите оставить ссылку только на ссылку, пожалуйста, преобразуйте ответ в комментарий.
Дан
Ну, это ссылка на другой ответ emacs.stackexchange - если он умрет, вы тоже не увидите этот ответ! (Однако я согласен, что этот ответ больше похож на комментарий).
Филс
1
Я рад опубликовать его в виде комментария, ответа, куска кода или того, что вы, ребята, предпочитаете (даже удаление его не беспокоило бы меня). Я просто пытался помочь, и для такого новичка, как я, трудно определить минимально мешающие протокольные пути (хотя я стараюсь - мне казалось, что мой «ответ» был скорее альтернативной точкой зрения на ответ, чем комментируйте сообщения других пользователей, поэтому я разместил их так, как я это сделал. То же самое объяснял ссылкой, публикуя мой код, а не просто публикуя ссылку. Я полагал, что ссылка подходит для моего второстепенного ответа лучше, чем кодовый ответ.) С наилучшими пожеланиями Кевин
Кевин