Memahami emacs align-regexp

31

Saya telah membaca dokumentasi Emacs untuk align-regexptetapi masih mengalami kesulitan dalam memahami cara kerjanya. Yang saya bicarakan adalah bentuk awalannya C-uM-xalign-regexp, bukan bentuk sederhana M-xalign-regexp. Ini pertanyaan saya:

  • Apakah parameter pertama (regex) harus cocok dengan seluruh baris string? Bagaimana jika regex hanya cocok dengan sebagian string?
  • Apa yang harus disediakan untuk parameter kedua (Grup Parenthesis untuk memodifikasi (dibenarkan jika negatif))? Seperti yang saya pahami di sini saya perlu memberikan nomor grup yang diambil (dihitung dari 1), kan? Apakah "membenarkan jika negatif" berarti, jika saya ingin grup 3 disejajarkan dengan benar, saya akan memberikan -3input?
  • Apa arti parameter ketiga "jumlah spasi (atau kolom jika negatif)"? Saya benar-benar tidak mengerti apa yang dilakukan parameter ini.

Saya telah mengumpulkan beberapa contoh teks untuk dipraktikkan. Kalau ada yang bisa menggunakan teks di bawah ini sebagai contoh yang akan sangat membantu.


Dari

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

Untuk

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

Dari

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

Untuk

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

Jawaban:

31

OK, pertama keberpihakan dan kemudian penjelasan tentang cara kerjanya.

Untuk menyelaraskan pertama, pilih garis, lakukan C-u M-x align-regexpdan pilih: \(\s-*\):, 1, 1, dan y.

Untuk kedua, penggunaan ,\(\), 1, 1, dan y.

Bagaimana itu bekerja:

Regexp dicoba di setiap baris di wilayah tersebut. Pada masing-masing, jika garis belum sejajar, itu akan cocok pada kolom yang berbeda. Lebih khusus lagi, grup yang Anda pilih (parameter kedua, "grup tanda kurung untuk memodifikasi") akan berakhir pada kolom yang berbeda pada setiap baris. Fungsi ini akan menambahkan spasi ke akhir beberapa dari mereka dan menghapus karakter dari yang lain sampai semua grup berakhir pada kolom yang sama, dengan menghormati batasan spasi yang dimasukkan pada parameter ketiga.

Misalnya, mengambil beberapa baris dari case pertama:

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

Tanda kurung ( )mewakili grup pertama dari regexp yang cocok. Seperti yang Anda lihat, pada setiap baris berakhir pada kolom yang berbeda. Untuk menyelaraskan, fungsi akan menambahkan satu spasi ke yang ada di baris pertama, tiga spasi ke yang di baris kedua, dan tidak ada di yang ketiga.

Berapa banyak spasi yang akan ditambahkan (atau dihapus) diatur oleh parameter ketiga, "jumlah spasi". Parameter ini benar-benar berarti, berapa panjang “alami” dari grup kurung. Pada garis yang tidak membutuhkan perataan, panjangnya persis seperti ini.

Misalnya, pada kasus kedua, jika Anda memilih untuk menyelaraskan dengan regexp \(,\), spasi 1, Anda akan melihat bahwa pada baris kedua dan ketiga tidak ada spasi yang ditambahkan, karena koma sudah menyediakan "spasi" dari 1.

Jadi, untuk rekap:

  • regexp: cocokkan tempat yang Anda minati; untuk melakukannya, salah satu grup kurung akan diperluas dengan spasi, atau disingkat dengan menghapus karakter
  • grup tanda kurung: pilih yang mana
  • jarak: jika grup lebih pendek dari ini, spasi akan ditambahkan padanya; jika lebih panjang, karakter akan dihapus darinya, mulai dari akhir (kecuali jika lebih panjang untuk tujuan penyelarasan, tentu saja)
  • ulangi: saya kira ini sudah jelas

Varian parameter (tanda minus sebelumnya):

  • justify: karakter yang tidak kosong di dalam grup tidak akan dihapus, dan spasi yang diperlukan akan ditambahkan / dihapus dari kiri. Pada kasus kedua Anda, coba: regexp \([0-9]+\), grup -1.
  • kolom (bukannya spasi): sejajarkan dengan kolom tetap itu (tentu saja, itu tidak bekerja dengan baik dengan "ulangi").
angus
sumber
1

Bukan jawaban yang dalam untuk pertanyaan awal, tetapi sedikit kode yang saya tulis ini mungkin masih berkontribusi untuk memahami bagaimana parameter bekerja (dalam kode). Inilah tautannya

Kevin
sumber
Silakan kirim / jelaskan kode di sini; jawaban hanya tautan bisa bermasalah jika tautannya mati. Jika Anda lebih suka membiarkannya saja, harap ubah jawaban menjadi komentar.
Dan
Yah itu tautan ke jawaban emacs.stackexchange lainnya - jika itu mati, Anda juga tidak akan melihat jawaban ini! (Namun saya setuju bahwa jawaban ini lebih seperti komentar).
phils
1
Saya senang mempostingnya sebagai komentar, jawaban, potongan kode, atau apa pun yang Anda inginkan (bahkan menghapusnya tidak akan mengganggu saya). Saya hanya mencoba untuk membantu, dan sulit bagi pemula seperti saya untuk mengetahui jalur protokol yang minimal mengganggu (walaupun saya memang mencoba - sepertinya bagi saya bahwa "jawaban" saya lebih merupakan sudut pandang alternatif untuk jawaban daripada suatu mengomentari posting oleh orang lain, itulah sebabnya saya mempostingnya seperti yang saya lakukan. Ditto untuk menjelaskan tautan dengan memposting kode saya vs hanya memposting tautan. Saya pikir tautan tersebut sesuai dengan jawaban minor saya lebih baik daripada jawaban kode.) Salam hangat Kevin
Kevin