Verständnis von Emacs align-regexp

31

Ich habe die Emacs-Dokumentation gelesen, habe align-regexpaber immer noch Schwierigkeiten zu verstehen, wie es funktioniert. Was ich spreche, ist die vorangestellte Form C-uM-xalign-regexp, nicht die einfache Form M-xalign-regexp. Hier sind meine Fragen:

  • Muss der erste Parameter (der reguläre Ausdruck) mit der gesamten Zeichenfolge übereinstimmen? Was ist, wenn der reguläre Ausdruck nur mit einem Teil der Zeichenfolge übereinstimmt?
  • Was muss für den zweiten Parameter angegeben werden (zu ändernde Klammergruppe (begründen, falls negativ))? Wie ich hier verstehe, muss ich eine erfasste Gruppennummer (Anzahl von 1) angeben, oder? Bedeutet "Rechtfertigen, wenn negativ", dass Gruppe 3 rechtsbündig ausgerichtet werden soll, und ich -3als Eingabe angeben werde?
  • Was bedeutet der dritte Parameter "Abstand (oder Spalte, falls negativ)"? Ich verstehe einfach überhaupt nicht, was dieser Parameter bewirkt.

Ich habe einige Textbeispiele zum Üben gesammelt. Wenn jemand den folgenden Text als Beispiel verwenden kann, ist dies sehr hilfreich.


Von

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

Zu

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

Von

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

Zu

my @primes = (
    1,  2,  3,  5,  7,
    11, 13, 17, 19, 23,
    29, 31, 37, 41, 43,
);
Nur ein Anfänger
quelle

Antworten:

31

OK, zuerst die Ausrichtungen und dann die Erklärung, wie es funktioniert.

Um die erste auszurichten, wählen Sie die Linien, tun , C-u M-x align-regexpund wählen Sie: \(\s-*\):, 1, 1, und y.

Für die zweite, Verwendung ,\(\), 1, 1und y.

Wie es funktioniert:

Der reguläre Ausdruck wird in jeder Zeile in der Region ausprobiert. Wenn die Zeilen noch nicht ausgerichtet sind, werden sie jeweils in einer anderen Spalte abgeglichen. Insbesondere endet die ausgewählte Gruppe (der zweite Parameter, "zu ändernde Klammergruppe") in jeder Zeile in einer anderen Spalte. Die Funktion fügt Leerzeichen an das Ende einiger von ihnen ein und löscht Zeichen aus anderen, bis alle Gruppen an derselben Spalte enden, wobei die im dritten Parameter eingegebenen Abstandsbeschränkungen beachtet werden.

Nehmen wir zum Beispiel einige Zeilen aus dem ersten Fall:

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

Die Klammern ( )stellen die erste Gruppe des übereinstimmenden regulären Ausdrucks dar. Wie Sie sehen, endet in jeder Zeile eine andere Spalte. Zum Ausrichten fügt die Funktion der ersten Zeile ein Leerzeichen, der zweiten Zeile drei Leerzeichen und der dritten Zeile kein Leerzeichen hinzu.

Wie viele Leerzeichen hinzugefügt (oder gelöscht) werden sollen, wird durch den dritten Parameter „Abstand“ festgelegt. Dieser Parameter bedeutet wirklich, wie groß die "natürliche" Länge der Klammergruppe sein soll. In den Zeilen, die nicht ausgerichtet werden müssen, ist es genau diese Länge.

Wenn Sie beispielsweise im zweiten Fall die Ausrichtung nach Regexp \(,\)und Abstand auswählen 1, wird in der zweiten und dritten Zeile kein Leerzeichen hinzugefügt, da das Komma bereits einen „Abstand“ von 1 enthält.

Also, um es noch einmal zusammenzufassen:

  • regulärer Ausdruck: Entspricht dem Ort, an dem Sie sich ausrichten möchten . Zu diesem Zweck wird eine der in Klammern gesetzten Gruppen mit Leerzeichen erweitert oder durch Löschen von Zeichen gekürzt
  • Klammergruppe: Wählen Sie welche
  • Abstand: Wenn die Gruppe kürzer ist, werden Leerzeichen hinzugefügt. Wenn es länger ist, werden die Zeichen vom Ende an gelöscht (es sei denn, es ist zum Zwecke der Ausrichtung länger).
  • wiederhole: naja, das ist offensichtlich, denke ich

Die Parametervarianten (vorangestelltes Minuszeichen):

  • Begründung: Nicht leere Zeichen in der Gruppe werden nicht gelöscht, und die erforderlichen Leerzeichen werden von links hinzugefügt / entfernt. Versuchen Sie in Ihrem zweiten Fall: regexp \([0-9]+\), group -1.
  • spalte (statt abstand): an dieser festen spalte ausrichten (natürlich funktioniert es nicht gut mit "wiederholen").
angus
quelle
1

Keine tiefe Antwort auf die ursprüngliche Frage, aber dieses Stück Code, das ich geschrieben habe, könnte dennoch zum Verständnis der Funktionsweise der Parameter (im Code) beitragen. Hier ist der Link

Kevin
quelle
Bitte poste / erkläre den Code hier; Nur-Link-Antworten können problematisch sein, wenn der Link nicht mehr funktioniert. Wenn Sie es lieber nur als Link lassen möchten, konvertieren Sie die Antwort in einen Kommentar.
Dan
Nun, es ist ein Link zu einer anderen Antwort von emacs.stackexchange - wenn das nicht mehr funktioniert, wird diese Antwort auch nicht angezeigt! (Ich stimme jedoch zu, dass diese Antwort eher einem Kommentar ähnelt.)
Phils
1
Gerne poste ich es als Kommentar, Antwort, Codestück oder was auch immer ihr wollt (selbst das Löschen würde mich nicht stören). Ich habe nur versucht zu helfen, und es ist für einen Neuling wie mich schwierig, die minimal störenden Protokollpfade herauszufinden (obwohl ich es versuche - es schien mir, dass meine "Antwort" eher ein alternativer Standpunkt zu einer Antwort war als ein Kommentar zu den Beiträgen von anderen, weshalb ich es so gepostet habe, wie ich es getan habe. Dasselbe gilt für die Erklärung des Links durch das Posten meines Codes, anstatt nur den Link zu posten. Ich dachte, der Link passe besser zu meiner Nebenantwort als zu einer Code-Antwort.) Mit freundlichen Grüßen Kevin
Kevin