Hiểu biết về emacs align-regapi


31

Tôi đã đọc tài liệu Emacs align-regexpnhưng vẫn gặp khó khăn trong việc hiểu cách thức hoạt động của nó. Những gì tôi đang nói là hình thức tiền tố của nó C-uM-xalign-regexp, không phải là hình thức đơn giản M-xalign-regexp. Đây là câu hỏi của tôi:

  • Tham số đầu tiên (regex) có phải khớp với toàn bộ chuỗi của chuỗi không? Điều gì xảy ra nếu regex chỉ khớp với một phần của chuỗi?
  • Cung cấp gì cho tham số thứ hai (Nhóm ngoặc đơn để sửa đổi (biện minh nếu âm))? Theo tôi hiểu ở đây, tôi cần cung cấp số nhóm bị bắt (đếm từ 1), phải không? Liệu "biện minh nếu tiêu cực" có nghĩa là, nếu tôi muốn nhóm 3 được căn phải, tôi sẽ cung cấp -3làm đầu vào?
  • Tham số thứ ba "lượng khoảng cách (hoặc cột nếu âm)" nghĩa là gì? Tôi hoàn toàn không hiểu thông số này làm gì.

Tôi đã thu thập một số ví dụ văn bản để thực hành. Nếu bất cứ ai có thể sử dụng văn bản dưới đây làm ví dụ sẽ rất hữu ích.


Từ

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

Đến

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

Từ

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

Đến

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

Câu trả lời:


31

OK, đầu tiên là sự sắp xếp và sau đó là lời giải thích về cách thức hoạt động của nó.

Để sắp xếp một đầu tiên, chọn dòng, làm C-u M-x align-regexpvà chọn: \(\s-*\):, 1, 1, và y.

Cho phần thứ hai, sử dụng ,\(\), 1, 1, và y.

Làm thế nào nó hoạt động:

Các regrec được thử trên mọi dòng trong khu vực. Trên mỗi dòng, nếu các dòng chưa được căn chỉnh, nó sẽ khớp trên một cột khác. Cụ thể hơn, nhóm bạn đã chọn (tham số thứ hai, nhóm dấu ngoặc đơn để sửa đổi) sẽ kết thúc trên một cột khác nhau trên mỗi dòng. Hàm sẽ thêm khoảng trắng vào cuối của một số trong số chúng và xóa các ký tự khỏi các ký tự khác cho đến khi tất cả các nhóm kết thúc tại cùng một cột, tôn trọng các ràng buộc khoảng cách được nhập trong tham số thứ ba.

Ví dụ: lấy một số dòng từ trường hợp đầu tiên:

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

Dấu ngoặc đơn ( )đại diện cho nhóm đầu tiên của biểu thức chính quy phù hợp. Như bạn có thể thấy, trên mỗi dòng nó kết thúc trên một cột khác nhau. Để căn chỉnh, hàm sẽ thêm một khoảng trắng vào một trong dòng đầu tiên, ba khoảng trắng cho một trong dòng thứ hai và không có trong không gian thứ ba.

Có bao nhiêu khoảng trắng mà nó sẽ thêm (hoặc xóa) được đặt bởi tham số thứ ba, số lượng khoảng cách giữa các khoảng cách. Tham số này thực sự có nghĩa là gì, độ dài tự nhiên của nhóm của nhóm nên là gì. Trong các dòng không cần căn chỉnh, nó sẽ có độ dài chính xác.

Ví dụ, trong trường hợp thứ hai, nếu bạn chọn căn chỉnh theo biểu thức chính quy \(,\), khoảng cách 1, bạn sẽ thấy rằng trên dòng thứ hai và thứ ba, không có khoảng trắng nào được thêm vào, bởi vì dấu phẩy đã cung cấp một khoảng cách giữa các nhịp 1.

Vì vậy, để tóm tắt lại:

  • regapi: phù hợp với nơi bạn quan tâm để sắp xếp; để làm điều đó, một trong các nhóm dấu ngoặc đơn của nó sẽ được mở rộng bằng dấu cách hoặc rút ngắn bằng cách xóa các ký tự
  • nhóm ngoặc đơn: chọn cái nào
  • khoảng cách: nếu nhóm ngắn hơn này, khoảng trắng sẽ được thêm vào nó; nếu nó dài hơn, các ký tự sẽ bị xóa khỏi nó, bắt đầu từ cuối (trừ khi nó dài hơn cho mục đích căn chỉnh, tất nhiên)
  • nhắc lại: tốt, điều này là hiển nhiên, tôi nghĩ

Các biến thể tham số (dấu trừ trước):

  • biện minh: các ký tự không trống trong nhóm sẽ không bị xóa và các khoảng trắng cần thiết sẽ được thêm / xóa từ bên trái. Trong trường hợp thứ hai của bạn, hãy thử: regrec \([0-9]+\), nhóm -1.
  • cột (thay vì khoảng cách): căn chỉnh với cột cố định đó (tất nhiên, nó không hoạt động tốt với Hồi lặp lại).

1

Không phải là một câu trả lời sâu sắc cho câu hỏi ban đầu, nhưng đoạn mã này tôi đã viết vẫn có thể góp phần hiểu cách các tham số hoạt động (trong mã). Đây là liên kết


Xin vui lòng gửi / giải thích mã ở đây; câu trả lời chỉ liên kết có thể có vấn đề nếu liên kết bị chết. Nếu bạn muốn để nó chỉ liên kết, xin vui lòng chuyển đổi câu trả lời thành một nhận xét.
Dân

Vâng, đó là một liên kết đến một câu trả lời khác của emacs.stackexchange - nếu điều đó bị chết, bạn cũng sẽ không thấy câu trả lời này! (Tôi đồng ý rằng câu trả lời này có vẻ giống như một bình luận, tuy nhiên).
phils

1
Tôi rất vui khi đăng nó dưới dạng bình luận, trả lời, đoạn mã hoặc bất cứ điều gì các bạn thích (thậm chí xóa nó sẽ không làm phiền tôi). Tôi chỉ cố gắng giúp đỡ, và thật khó để một người mới như tôi tìm ra các đường dẫn giao thức gây xáo trộn tối thiểu (mặc dù tôi đã cố gắng - dường như với tôi rằng "câu trả lời" của tôi giống như một quan điểm thay thế cho câu trả lời hơn là bình luận về bài đăng của người khác, đó là lý do tại sao tôi đăng nó theo cách tôi đã làm. Ditto đã giải thích liên kết bằng cách đăng mã của tôi so với chỉ đăng liên kết. Tôi cho rằng liên kết phù hợp với câu trả lời nhỏ của tôi tốt hơn câu trả lời mã.) Kevin
Kevin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.