Comprensione di emacs align-regexp


31

Ho letto la documentazione di Emacs per align-regexpma ho ancora difficoltà a capire come funziona. Quello di cui sto parlando è la sua forma prefissata C-uM-xalign-regexp, non la forma semplice M-xalign-regexp. Ecco le mie domande:

  • Il primo parametro (regex) deve corrispondere all'intera riga della stringa? Cosa succede se regex corrisponde solo a una parte della stringa?
  • Cosa fornire al secondo parametro (gruppo parentesi da modificare (giustificare se negativo))? Come ho capito qui ho bisogno di fornire un numero di gruppo acquisito (contare da 1), giusto? "Giustifica se negativo" significa che, se voglio che il gruppo 3 sia allineato a destra, fornirò -3come input?
  • Che cosa significa il terzo parametro "quantità di spazio (o colonna se negativo)"? Non capisco proprio cosa faccia questo parametro.

Ho raccolto alcuni esempi di testo da esercitarsi. Se qualcuno può usare il testo sotto come esempi, ciò sarà molto utile.


A partire dal

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

A

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

A partire dal

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

A

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

Risposte:


31

OK, prima gli allineamenti e poi la spiegazione di come funziona.

Per allineare il primo, selezionare le righe, fare C-u M-x align-regexpe scegli: \(\s-*\):, 1, 1, e y.

Per il secondo, l'uso ,\(\), 1, 1, e y.

Come funziona:

Il regexp viene provato su ogni riga nella regione. Su ciascuno, se le linee non sono già allineate, corrisponderà a una colonna diversa. Più specificamente, il gruppo scelto (il secondo parametro, "gruppo parentesi da modificare") terminerà su una colonna diversa su ogni riga. La funzione aggiungerà spazi alla fine di alcuni di essi ed eliminerà i caratteri da altri fino a quando tutti i gruppi finiscono nella stessa colonna, rispettando i vincoli di spaziatura immessi nel terzo parametro.

Ad esempio, prendendo alcune righe dal primo caso:

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

La parentesi ( )rappresenta il primo gruppo della regexp corrispondente. Come puoi vedere, su ogni riga termina su una colonna diversa. Per allineare, la funzione aggiungerà uno spazio a quello nella prima riga, tre spazi a uno nella seconda riga e nessuno nella terza.

Quanti spazi aggiungerà (o eliminerà) è impostato dal terzo parametro, "quantità di spaziatura". Questo parametro significa davvero quale dovrebbe essere la lunghezza "naturale" del gruppo parentesi. Nelle linee che non necessitano di allineamento, sarà esattamente di questa lunghezza.

Ad esempio, nel secondo caso, se si sceglie di allineare per regexp \(,\), spaziatura 1, vedrai che nella seconda e terza riga non viene aggiunto spazio, poiché la virgola fornisce già una "spaziatura" di 1.

Quindi, per ricapitolare:

  • regexp: corrisponde al punto in cui ti interessa allineare; per farlo, uno dei suoi gruppi di parentesi verrà esteso con spazi o accorciato eliminando i caratteri
  • gruppo parentesi: scegli quale
  • spaziatura: se il gruppo è più corto di questo, gli spazi verranno aggiunti ad esso; se è più lungo, i caratteri verranno eliminati da esso, a partire dalla fine (a meno che non sia più lungo ai fini dell'allineamento, ovviamente)
  • ripeto: beh, questo è ovvio, penso

Le varianti dei parametri (anteporre segno meno):

  • giustificazione: i caratteri non vuoti all'interno del gruppo non verranno eliminati e gli spazi necessari verranno aggiunti / eliminati da sinistra. Nel tuo secondo caso, prova: regexp \([0-9]+\), gruppo -1.
  • colonna (anziché spaziatura): allinea a quella colonna fissa (ovviamente, non funziona bene con "ripeti").

1

Non è una risposta profonda alla domanda originale, ma questo pezzo di codice che ho scritto potrebbe ancora contribuire a capire come funzionano i parametri (nel codice). Ecco il link


Si prega di pubblicare / spiegare il codice qui; le risposte di solo collegamento possono essere problematiche se il collegamento si interrompe. Se preferisci lasciarlo solo link, converti la risposta in un commento.
Dan

Beh, è ​​un link ad un'altra risposta emacs.stackexchange - se questa non va bene, non vedrai neanche questa risposta! (Sono d'accordo sul fatto che questa risposta sembra più simile a un commento, tuttavia).
phils,

1
Sono felice di pubblicarlo come un commento, una risposta, un pezzo di codice o qualunque cosa tu preferisca (anche eliminarlo non mi disturberà). Stavo solo cercando di aiutare, ed è difficile per un neofita come me capire i percorsi del protocollo minimamente disturbanti (anche se ci provo - mi è sembrato che la mia "risposta" fosse più un punto di vista alternativo a una risposta che un commentare le pubblicazioni di altri, ed è per questo che l'ho pubblicato come ho fatto. Idem per aver spiegato il link pubblicando il mio codice piuttosto che pubblicare il link. Ho pensato che il link si adattasse alla mia risposta minore meglio di una risposta in codice.) Cordiali saluti Kevin
Kevin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.