Zrozumienie emacsa align-regexp

31

Przeczytałem dokumentację Emacsa, align-regexpale wciąż mam trudności ze zrozumieniem, jak to działa. Mówię o formie z prefiksem C-uM-xalign-regexp, a nie o formie prostej M-xalign-regexp. Oto moje pytania:

  • Czy pierwszy parametr (regex) musi pasować do całej linii ciągu? Co się stanie, jeśli wyrażenie regularne pasuje tylko do części ciągu?
  • Co podać do drugiego parametru (grupa nawiasów do zmodyfikowania (uzasadnij, jeśli jest ujemna))? Jak rozumiem tutaj, muszę podać przechwycony numer grupy (od 1), prawda? Czy „uzasadnij, jeśli przeczenie” oznacza, że ​​jeśli chcę, aby grupa 3 była wyrównana do prawej, podam -3jako dane wejściowe?
  • Co oznacza trzeci parametr „wielkość odstępu (lub kolumny, jeśli ujemna)”? Po prostu zupełnie nie rozumiem, co robi ten parametr.

Zebrałem kilka przykładów tekstu do ćwiczenia. Jeśli ktoś może użyć poniższego tekstu jako przykładów, które będą bardzo pomocne.


Z

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

Do

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

Z

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

Do

my @primes = (
    1,  2,  3,  5,  7,
    11, 13, 17, 19, 23,
    29, 31, 37, 41, 43,
);
Tylko uczeń
źródło

Odpowiedzi:

31

OK, najpierw wyrównywania, a następnie wyjaśnienie, jak to działa.

Aby wyrównać pierwszy, wybierz wiersze, robić C-u M-x align-regexpi wybrać: \(\s-*\):, 1, 1, i y.

Dla drugiego, użytkowania ,\(\), 1, 1, i y.

Jak to działa:

Wyrażenie regularne jest wypróbowywane w każdej linii w regionie. Na każdym, jeśli linie nie są już wyrównane, dopasuje się do innej kolumny. Mówiąc dokładniej, wybrana grupa (drugi parametr, „grupa nawiasów do zmodyfikowania”) zakończy się w innej kolumnie w każdym wierszu. Funkcja doda spacje na końcu niektórych z nich i usunie znaki z innych, dopóki wszystkie grupy nie zakończą się w tej samej kolumnie, przestrzegając ograniczeń odstępów wprowadzonych w trzecim parametrze.

Na przykład biorąc kilka wierszy z pierwszego przypadku:

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

Nawias ( )reprezentuje pierwszą grupę pasującego wyrażenia regularnego. Jak widać, w każdym wierszu kończy się w innej kolumnie. Aby wyrównać, funkcja doda jedną spację do jednej w pierwszym wierszu, trzy spacje do jednej w drugiej linii i żadnej w trzeciej.

Ile spacji doda (lub usunie) ustawia trzeci parametr „ilość odstępów”. Ten parametr naprawdę oznacza, jaka powinna być „naturalna” długość grupy nawiasów. W liniach, które nie wymagają wyrównania, będzie to dokładnie ta długość.

Na przykład w drugim przypadku, jeśli wybierzesz wyrównanie za pomocą wyrażenia regularnego \(,\), odstępy 1, zobaczysz, że w drugim i trzecim wierszu nie ma spacji, ponieważ przecinek już zapewnia „odstęp” 1.

Podsumowując:

  • regexp: dopasuj miejsce, które chcesz wyrównać; aby to zrobić, jedna z jej grup w nawiasach zostanie powiększona spacjami lub skrócona przez usunięcie znaków
  • grupa nawiasów: wybierz, który z nich
  • odstępy: jeśli grupa jest krótsza niż ta, spacje zostaną do niej dodane; jeśli jest dłuższy, postacie zostaną z niego usunięte, poczynając od końca (chyba że jest to dłużej w celu wyrównania, oczywiście)
  • powtórz: cóż, myślę, że to oczywiste

Warianty parametrów (poprzedzający znak minus):

  • justify: niepuste znaki w grupie nie zostaną usunięte, a niezbędne spacje zostaną dodane / usunięte z lewej strony. W drugim przypadku spróbuj: regexp \([0-9]+\), group -1.
  • kolumna (zamiast odstępów): wyrównaj do tej stałej kolumny (oczywiście nie działa dobrze z „powtarzaniem”).
angus
źródło
1

Nie jest to głęboka odpowiedź na pierwotne pytanie, ale ten fragment kodu, który napisałem, może nadal przyczynić się do zrozumienia, jak działają parametry (w kodzie). Oto link

Kevin
źródło
Proszę zamieścić / wyjaśnić kod tutaj; odpowiedzi tylko na link mogą być problematyczne, jeśli link przestanie działać. Jeśli wolisz pozostawić tylko link, przekonwertuj odpowiedź na komentarz.
Dan
Cóż, jest to link do innej odpowiedzi na emacs.stackexchange - jeśli to umrze, nie zobaczysz tej odpowiedzi! (Zgadzam się jednak, że ta odpowiedź wydaje się bardziej komentarzem).
phils
1
Z przyjemnością opublikuję go jako komentarz, odpowiedź, fragment kodu lub cokolwiek, co wolicie (nawet usunięcie go nie przeszkadzałoby). Próbowałem tylko pomóc, a nowicjuszowi, tak jak ja, trudno jest zrozumieć minimalnie niepokojące ścieżki protokołu (chociaż próbuję - wydawało mi się, że moja „odpowiedź” była bardziej alternatywnym punktem widzenia na odpowiedź niż komentuj komentarze innych, dlatego opublikowałem to tak, jak ja. Ditto za wyjaśnienie linku poprzez opublikowanie mojego kodu zamiast zwykłego opublikowania linku. Uznałem, że link pasuje do mojej drobnej odpowiedzi lepiej niż odpowiedź na kod.) Pozdrawiam Kevin
Kevin