Emacs anlamak align-regexp


31

Emacs belgelerini okudum align-regexpama hala nasıl çalıştığını anlamakta zorluk çekiyorum. Bahsettiğim şey, C-uM-xalign-regexpbasit hali değil, öneki formu M-xalign-regexp. İşte benim sorularım:

  • İlk parametre (regex) tüm dizge satırına uymak zorunda mı? Düzenli ifade yalnızca dizenin bir parçasıyla eşleşirse ne olur?
  • İkinci parametreye ne tedarik edilmeli (Değiştirilecek parantez grubu (negatifse gerekçeli))? Burada anladığım kadarıyla, ele geçirilmiş bir grup numarası (1'den sayım) vermem gerekiyor, değil mi? "Olumsuzsa haklı çıkar" anlamına gelir, eğer grup 3'ün sağa hizalı olmasını istersem -3, girdi olarak tedarik edeceğim ?
  • Üçüncü parametre "boşluk miktarı (veya negatifse sütun)" ne anlama geliyor? Bu parametrenin ne yaptığını tamamen anlamıyorum.

Pratik yapmak için bazı metin örnekleri topladım. Herhangi biri aşağıdaki metni örnek olarak kullanabilirse bu çok yardımcı olacaktır.


itibaren

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

için

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

itibaren

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

için

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

Yanıtlar:


31

Tamam, önce hizalamaları ve sonra nasıl çalıştığını açıklama.

Çizgiler, ilkini hizalamak seçmek için yapmak C-u M-x align-regexpve seç: \(\s-*\):, 1, 1, ve y.

İkinci kullanım için ,\(\), 1, 1, ve y.

Nasıl çalışır:

Regexp bölgedeki her hatta deneniyor. Her birinde, çizgiler zaten hizalanmamışsa, farklı bir sütunda eşleşir. Daha spesifik olarak, seçtiğiniz grup (ikinci parametre, “değiştirilecek parantez grubu”) her satırda farklı bir sütunda sona erer. İşlev, bazılarının sonuna boşluklar ekler ve tüm gruplar aynı sütunda sona erene kadar diğerlerinden karakterleri siler ve üçüncü parametrede girilen boşluk sınırlamalarına saygı gösterir.

Örneğin, ilk durumdan bazı çizgiler alarak:

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

Parantez ( ), eşleşen regexp grubunun ilk grubunu temsil eder. Gördüğünüz gibi, her satırda farklı bir sütunda bitiyor. Hizalamak için, işlev ilk satırda birine bir boşluk, ikinci satırda birine üç boşluk ve üçüncü sırada yok.

Ne kadar boşluk ekleyeceğini (veya sileceğini) üçüncü parametre olan “boşluk miktarı” ile belirlenir. Bu parametre gerçekten, parantez grubunun “doğal” uzunluğunun ne olması gerektiği anlamına gelir. Hizalama gerektirmeyen çizgilerde, tam olarak bu uzunluk olacaktır.

Örneğin, ikinci durumda, regexp \(,\), boşluk ile hizalamayı seçerseniz 1, ikinci ve üçüncü satırlarda boşluk eklenmemiş olduğunu görürsünüz, çünkü virgül zaten 1 'lik bir boşluk sağlar.

Yani, özetlemek için:

  • regexp: hizalamak istediğiniz yerle eşleşin; Bunu yapmak için, parantez gruplarından biri boşluklarla genişletilecek veya karakterler silinerek kısaltılacak
  • parantez grubu: hangisini seç
  • boşluk bırakma: eğer grup bundan daha kısaysa, ona boşluklar eklenecektir; daha uzunsa, karakterler baştan başlayarak silinir (hizalama amacıyla elbette uzun değilse)
  • tekrarla: peki, bu açık, sanırım

Parametre çeşitleri (eksi işaretini hazırla):

  • haklı çıkar: grup içindeki boş olmayan karakterler silinmez ve gerekli alanlar soldan eklenir / silinir. İkinci durumda, dene: regexp \([0-9]+\), grup -1.
  • sütun (boşluk yerine): bu sabit sütuna hizalayın (elbette, “tekrarla” ile iyi çalışmaz).

1

Asıl soruya derin bir cevap değil, yazdığım bu kod parçası hala parametrelerin nasıl çalıştığını anlamada katkıda bulunabilir (kodda). İşte link


Lütfen kodu buraya postalayın / açıklayın; sadece bağlantı cevaplar bağlantı kesilirse sorunlu olabilir. Yalnızca bağlantı bırakmayı tercih ediyorsanız, lütfen cevabı yoruma dönüştürün.
Dan

Bu başka bir emacs.stackexchange cevabına bir link - eğer bu giderse, bu cevabı da göremezsiniz! (Ancak bu cevabın daha çok bir yorum gibi göründüğünü kabul ediyorum).
phils

1
Bir yorum, cevap, kod öbekleri veya ne tercih ederseniz edin (beni silmek bile rahatsız olmaz) olarak göndermekten mutluyum. Sadece yardım etmeye çalışıyordum ve kendim gibi bir aceminin minimal rahatsız edici protokol yollarını bulması zordu (denememe rağmen - bana "cevabımın" cevaptan daha alternatif bir bakış açısı olduğu görünüyordu. başkaları tarafından yapılan gönderiler hakkında yorum yapma, bu yüzden bunu yaptığım gibi yayınladım.Titto'yu sadece bağlantıyı göndermeden önce kodumu yazarak açıklamak için Ditto. Kevin
Kevin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.