การทำความเข้าใจกับ emacs align-regexp


31

ฉันอ่านเอกสาร Emacs แล้วalign-regexpแต่ยังคงมีปัญหาในการทำความเข้าใจวิธีการทำงาน สิ่งที่ผมพูดเกี่ยวกับการเป็นรูปแบบนำหน้ามันไม่ได้แบบง่ายๆC-uM-xalign-regexp M-xalign-regexpนี่คือคำถามของฉัน:

  • พารามิเตอร์แรก (regex) ต้องจับคู่กับสตริงทั้งหมดหรือไม่ จะเกิดอะไรขึ้นถ้า regex จับคู่กับส่วนของสตริงเท่านั้น?
  • สิ่งที่จะจัดหาให้กับพารามิเตอร์ที่สอง (กลุ่มวงเล็บเพื่อแก้ไข (จัดชิดถ้าลบ)) ตามที่ฉันเข้าใจที่นี่ฉันต้องระบุหมายเลขกลุ่มที่ถูกจับ (นับจาก 1) ใช่ไหม "ปรับว่าลบหรือไม่" หมายความว่าถ้าฉันต้องการจัดกลุ่ม 3 ให้ชิดขวาฉันจะส่ง-3เป็นอินพุตหรือไม่
  • พารามิเตอร์ที่สาม "จำนวนระยะห่าง (หรือคอลัมน์ถ้าลบ)" หมายถึงอะไร ฉันแค่ไม่เข้าใจว่าพารามิเตอร์นี้ทำอะไร

ฉันรวบรวมตัวอย่างข้อความเพื่อฝึกฝน หากใครสามารถใช้ข้อความด้านล่างเป็นตัวอย่างที่จะเป็นประโยชน์มาก


จาก

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

จาก

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

คำตอบ:


31

ตกลงอันดับแรกจากนั้นจึงอธิบายการทำงานของมัน

ในการจัดครั้งแรกที่เลือกเส้นที่ทำC-u M-x align-regexpและเลือก: \(\s-*\):, 1, และ1y

สำหรับที่สองการใช้งาน,\(\), 1, และ1y

มันทำงานอย่างไร:

regexp จะพยายามทุกบรรทัดในภูมิภาค ในแต่ละบรรทัดหากยังไม่ได้จัดแนวบรรทัดนั้นจะตรงกันในคอลัมน์อื่น โดยเฉพาะอย่างยิ่งกลุ่มที่คุณเลือก (พารามิเตอร์ตัวที่สอง“ กลุ่มวงเล็บเพื่อแก้ไข”) จะสิ้นสุดในคอลัมน์ที่แตกต่างกันในแต่ละบรรทัด ฟังก์ชั่นจะเพิ่มช่องว่างที่ส่วนท้ายของบางส่วนและลบอักขระจากกลุ่มอื่นจนกว่ากลุ่มทั้งหมดจะสิ้นสุดที่คอลัมน์เดียวกันโดยคำนึงถึงข้อ จำกัด ของระยะห่างที่ป้อนในพารามิเตอร์ที่สาม

ตัวอย่างเช่นรับบางบรรทัดจากกรณีแรก:

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

วงเล็บ( )แสดงกลุ่มแรกของการจับคู่ regexp อย่างที่คุณเห็นในแต่ละบรรทัดมันจะลงท้ายด้วยคอลัมน์ที่แตกต่างกัน ในการจัดตำแหน่งฟังก์ชั่นจะเพิ่มหนึ่งช่องว่างให้กับหนึ่งในบรรทัดแรกสามช่องว่างในหนึ่งในบรรทัดที่สองและไม่มีในที่สาม

จำนวนช่องว่างที่จะเพิ่ม (หรือลบ) ถูกตั้งค่าโดยพารามิเตอร์ที่สาม“ จำนวนระยะห่าง” พารามิเตอร์นี้หมายความว่าจริง ๆ แล้วความยาว“ ธรรมชาติ” ของกลุ่มวงเล็บควรเป็นเท่าไหร่ ในบรรทัดที่ไม่ต้องการการจัดตำแหน่งมันจะมีความยาวตรงนี้

ตัวอย่างเช่นในกรณีที่สองหากคุณเลือกที่จะจัดตำแหน่งโดย regexp \(,\)ระยะห่าง1คุณจะเห็นว่าในบรรทัดที่สองและสามไม่มีการเพิ่มช่องว่างเนื่องจากเครื่องหมายจุลภาคมี "ระยะห่าง" เป็น 1

ดังนั้นเพื่อสรุป:

  • regexp:ตรงกับสถานที่ที่คุณสนใจในการจัดตำแหน่ง; ในการทำกลุ่มวงเล็บหนึ่งในนั้นจะถูกขยายด้วยช่องว่างหรือย่อด้วยการลบอักขระ
  • กลุ่มวงเล็บ:เลือกอันไหน
  • ระยะห่าง:หากกลุ่มสั้นกว่านี้จะมีการเพิ่มช่องว่างลงในกลุ่ม ถ้ามันยาวกว่านี้ตัวละครจะถูกลบออกจากมันเริ่มต้นที่จุดสิ้นสุด (ยกเว้นว่าจะยาวกว่าเพื่อจุดประสงค์ในการจัดตำแหน่ง)
  • ทำซ้ำ:ดีนี้ชัดเจนฉันคิดว่า

ตัวแปรพารามิเตอร์ (ผนวกลบเครื่องหมาย):

  • justify:อักขระที่ไม่ว่างเปล่าภายในกลุ่มจะไม่ถูกลบและช่องว่างที่จำเป็นจะถูกเพิ่ม / ลบจากด้านซ้าย เกี่ยวกับกรณีที่สองของคุณลอง: regexp กลุ่ม\([0-9]+\)-1
  • คอลัมน์ (แทนการเว้นวรรค):จัดตำแหน่งคอลัมน์คงที่ (แน่นอนว่าจะใช้งานไม่ได้กับ“ ซ้ำ”)

1

ไม่ใช่คำตอบที่ลึกซึ้งสำหรับคำถามต้นฉบับ แต่รหัสบิตนี้ฉันเขียนอาจยังคงช่วยให้เข้าใจว่าพารามิเตอร์ทำงานอย่างไร (เป็นรหัส) นี่คือลิงค์


กรุณาโพสต์ / อธิบายรหัสที่นี่; คำตอบสำหรับลิงก์เท่านั้นอาจเป็นปัญหาได้หากลิงก์นั้นตาย หากคุณต้องการทิ้งลิงค์ไว้อย่างเดียวโปรดแปลงคำตอบเป็นความคิดเห็น
แดน

มันเป็นลิงค์ไปยังคำตอบ emacs.stackexchange อีกอัน - ถ้านั่นตายแล้วคุณจะไม่เห็นคำตอบนี้เช่นกัน! (ฉันยอมรับว่าคำตอบนี้ดูเหมือนเป็นความคิดเห็นมากกว่า)
phils

1
ฉันยินดีที่จะโพสต์เป็นความคิดเห็นคำตอบรหัสหรือสิ่งที่พวกคุณชอบ (แม้ลบมันจะไม่รบกวนฉัน) ฉันแค่พยายามช่วยและเป็นเรื่องยากสำหรับมือใหม่อย่างฉันที่จะหาเส้นทางโปรโตคอลที่รบกวนน้อยที่สุด (แม้ว่าฉันจะลองก็ตาม - ดูเหมือนว่าฉันว่า "คำตอบ" ของฉันนั้นเป็นมุมมองทางเลือกมากกว่าคำตอบมากกว่า ความคิดเห็นเกี่ยวกับการโพสต์โดยคนอื่นซึ่งเป็นเหตุผลที่ฉันโพสต์ในแบบที่ฉันทำ Ditto สำหรับการอธิบายลิงก์โดยการโพสต์โค้ดของฉันและเพิ่งโพสต์ลิงค์ฉันคิดว่าลิงค์พอดีกับคำตอบเล็กน้อยดีกว่าตอบรหัส) Kevin
Kevin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.