Розуміння 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 \(,\), пробілу 1, ви побачите, що у другому та третьому рядках пробіл не додається, оскільки кома вже забезпечує «пробіл» 1.

Отже, резюмувати:

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

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

  • виправдання: непорожні символи всередині групи не будуть видалені, а необхідні пробіли будуть додані / видалені зліва. У другому випадку спробуйте: regexp \([0-9]+\), group -1.
  • стовпець (замість пробілу): вирівняйте цей фіксований стовпець (звичайно, він не працює добре з "повтором").

1

Не глибока відповідь на початкове запитання, але цей біт коду, який я написав, може все-таки сприяти розумінню того, як працюють параметри (в коді). Ось посилання


Будь ласка, опублікуйте / поясніть код тут; Відповіді лише на посилання можуть бути проблематичними, якщо посилання загине. Якщо ви хочете залишити його лише за посиланням, перетворіть відповідь на коментар.
Дан

Що ж, це посилання на іншу відповідь emacs.stackexchange - якщо це померло, ви також не побачите цієї відповіді! (Я згоден, що ця відповідь здається скоріше коментарем).
філс

1
Я радий розмістити це як коментар, відповідь, шматок коду чи все, що ви хочете (навіть видалення його не заважає мені). Я просто намагався допомогти, і новачкові, як я, важко з'ясувати мінімально тривожні протокольні шляхи (хоча я намагаюся - мені здалося, що моя "відповідь" - це більше альтернативна точка зору на відповідь, ніж коментуйте публікації інших людей, тому я розмістив її так, як і зробив. Діто для пояснення посилання, розмістивши свій код проти просто опублікувавши посилання. Я зрозумів, що посилання відповідає моїй незначній відповіді краще, ніж кодова відповідь.) З найкращими побажаннями Кевін
Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.