Comprendre emacs align-regexp


31

J'ai lu la documentation d'Emacs align-regexpmais j'ai toujours du mal à comprendre comment cela fonctionne. Je parle de sa forme préfixée C-uM-xalign-regexp, pas de la forme simple M-xalign-regexp. Voici mes questions:

  • Le premier paramètre (l'expression régulière) doit-il correspondre à toute la ligne de chaîne? Et si l'expression régulière ne correspond qu'à une partie de la chaîne?
  • Que fournir au second paramètre (groupe de parenthèses à modifier (justifier si négatif))? Si je comprends bien ici, je dois fournir un numéro de groupe capturé (compter à partir de 1), non? Est-ce que "justifier si négatif" signifie, si je veux que le groupe 3 soit aligné à droite, je fournirai -3comme entrée?
  • Que signifie le troisième paramètre "espacement (ou colonne si négatif)"? Je ne comprends tout simplement pas ce que fait ce paramètre.

J'ai rassemblé quelques exemples de textes à pratiquer. Si quelqu'un peut utiliser le texte ci-dessous comme exemples, cela sera très utile.


De

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

De

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,
);

Réponses:


31

OK, d'abord les alignements, puis l'explication de son fonctionnement.

Pour aligner le premier, sélectionnez les lignes, faire C-u M-x align-regexpet choisissez: \(\s-*\):, 1, 1et y.

Pour la seconde, l' utilisation ,\(\), 1, 1et y.

Comment ça marche:

L'expression régulière est essayée sur chaque ligne de la région. Sur chacun, si les lignes ne sont pas déjà alignées, il correspondra sur une colonne différente. Plus précisément, le groupe que vous avez choisi (le deuxième paramètre, «groupe de parenthèses à modifier») se terminera sur une colonne différente sur chaque ligne. La fonction ajoutera des espaces à la fin de certains d'entre eux et supprimera les caractères des autres jusqu'à ce que tous les groupes se terminent dans la même colonne, en respectant les contraintes d'espacement entrées dans le troisième paramètre.

Par exemple, en prenant quelques lignes du premier cas:

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

Les parenthèses ( )représentent le premier groupe de l'expression rationnelle correspondante. Comme vous pouvez le voir, sur chaque ligne, il se termine sur une colonne différente. Pour aligner, la fonction ajoutera un espace à celui de la première ligne, trois espaces à celui de la deuxième ligne et aucun à la troisième.

Le nombre d'espaces qu'il ajoutera (ou supprimera) est défini par le troisième paramètre, «quantité d'espacement». Ce paramètre signifie vraiment quelle devrait être la longueur «naturelle» du groupe de parenthèses. Dans les lignes qui n'ont pas besoin d'alignement, ce sera exactement cette longueur.

Par exemple, dans le deuxième cas, si vous choisissez d'aligner par expression rationnelle \(,\), espacement 1, vous verrez que sur les deuxième et troisième lignes aucun espace n'est ajouté, car la virgule fournit déjà un «espacement» de 1.

Donc, pour récapituler:

  • regexp: correspond à l'endroit que vous souhaitez aligner; pour ce faire, l'un de ses groupes de parenthèses sera étendu avec des espaces, ou raccourci en supprimant des caractères
  • groupe de parenthèses: choisissez lequel
  • espacement: si le groupe est plus court que cela, des espaces lui seront ajoutés; s'il est plus long, les personnages en seront supprimés à partir de la fin (à moins qu'il ne soit plus long à des fins d'alignement, bien sûr)
  • répéter: eh bien, c'est évident, je pense

Les variantes de paramètre (signe de début moins):

  • justifier: les caractères non vides à l'intérieur du groupe ne seront pas supprimés et les espaces nécessaires seront ajoutés / supprimés à gauche. Sur votre deuxième cas, essayez: regexp \([0-9]+\), group -1.
  • colonne (au lieu de l'espacement): alignez sur cette colonne fixe (bien sûr, cela ne fonctionne pas bien avec "répéter").

1

Pas une réponse profonde à la question d'origine, mais ce morceau de code que j'ai écrit pourrait encore contribuer à comprendre le fonctionnement des paramètres (dans le code). Voici le lien


Veuillez poster / expliquer le code ici; les réponses liées uniquement à un lien peuvent être problématiques si le lien disparaît. Si vous préférez le laisser uniquement en lien, veuillez convertir la réponse en commentaire.
Dan

Eh bien, c'est un lien vers une autre réponse emacs.stackexchange - si cela disparaît, vous ne verrez pas non plus cette réponse! (Je suis d'accord cependant que cette réponse ressemble plus à un commentaire).
phils

1
Je suis heureux de le poster comme un commentaire, une réponse, un morceau de code ou tout ce que vous préférez (même le supprimer ne me dérangerait pas). J'essayais juste d'aider, et il est difficile pour un débutant comme moi de comprendre les chemins de protocole minimalement dérangeants (bien que j'essaie - il me semblait que ma "réponse" était plus un point de vue alternatif à une réponse qu'un commenter les publications des autres, c'est pourquoi je l'ai posté comme je l'ai fait. Idem pour avoir expliqué le lien en publiant mon code ou simplement en affichant le lien. J'ai pensé que le lien correspondait mieux à ma réponse mineure qu'à une réponse de code.) Meilleures salutations Kevin
Kevin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.