Розуміння 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.