2011-01-11 32 views
13

Tôi đang làm việc trong Haskell và thường xuyên đi qua mã tương tự như sau:Emacs sắp xếp-regexp trên = nhưng không ==

func i j | i == j = i 
     | otherwise = j 

Tôi muốn sắp xếp vào nhân vật '=' sử dụng sắp xếp-regexp nhưng không có bí quyết tuyệt vời. Tôi đã cố gắng chỉ làm "=" mà không có dấu ngoặc kép, nhưng điều này chèn một ký tự không gian không mong muốn trước mỗi '='. Tôi đã tìm thấy một giải pháp đề xuất here nhưng tôi dường như không thể làm được điều đó.

Hãy giúp tôi viết một hàm hoặc macro được mã hóa cứng sẽ cho phép tôi đặt khóa liên kết cho việc này.

Trả lời

17

Củ Mxalign-regexpRET\(\s-*\) =RET1RET0RETn

(NB có một không gian sau khi '=', nhưng nó không phải là rất rõ ràng.)

Đó là để nói ...

Sử dụng đối số tiền tố để yêu cầu align-regexp yêu cầu bạn cung cấp nhiều thông số hơn mặc định.

Xem C-h falign-regexpC-h valign-rules-list để biết chi tiết, nhưng trong ngắn hạn:

\(\s-*\) là mặc định 'nhóm' để xóa/mở rộng. Chúng tôi nối thêm mẫu của chúng tôi vào cuối: '='. (Lưu ý rằng \s- là cú pháp regexp Emacs cho khoảng trống.)

1 chỉ đơn giản là tham chiếu đến nhóm được lồng dấu 1 (như trên). Đây là mặc định.

0 cho khoảng cách để sử dụng giữa hai phần của dòng. Theo mặc định, đây là 1 và là lý do bạn kết thúc bằng một khoảng trống bổ sung.

n để không căn chỉnh bất kỳ kết quả mẫu nào sau đó sau lần khớp đầu tiên trong mỗi dòng.

chỉnh sửa: Thực ra, Q & Một bạn liên kết với gần giống hệt nhau, và hoạt động tốt đối với tôi trên Emacs 23.2.1, vì vậy đây là một bản sao, nhưng để tiếp tục và trả lời các khía cạnh quan trọng ràng buộc:

Bạn có thể ràng buộc chuỗi (hoặc bất kỳ) nào đó thông qua các macro bàn phím. Đây là kết quả cuối cùng, mà bạn có thể chỉ cần thêm vào tệp init của bạn, mặc dù tôi khuyên bạn nên tự mình thực hiện quá trình này. Sử dụng bất cứ điều gì bạn thích thay cho C-c a cho khóa. C-c (letter) và F5-F9 được dành riêng cho người dùng cuối để ràng buộc theo ý muốn của họ, vì vậy một trong số đó sẽ được an toàn khỏi bị che khuất bởi sơ đồ bàn phím của chế độ.

(global-set-key (kbd "C-c a") (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([21 134217848 97 108 105 103 110 45 114 101 103 101 120 112 return 32 61 32 return return backspace 48 return 110] 0 "%d")) arg))) 

tôi đã làm điều đó bằng cách:

  1. chọn văn bản.
  2. F3 để bắt đầu quay.
  3. thực hiện các align-regexp như trên (cẩn thận để nhập mọi thứ nguyên văn, và không sử dụng lịch sử của minibuffer hoặc yanking).
  4. F4 để ngừng ghi.
  5. C-x C-k nalign-single-equalsRET để cung cấp cho các vĩ mô một tên
  6. M-xinsert-kbd-macroRETalign-single-equalsRET để có được lisp.
  7. Bao gồm biểu thức (lambda) với (global-set-key) để liên kết. (Mặc dù bạn cũng có thể sử dụng mã (fset 'align-single-equals ...) theo quy định, và sau đó gắn chìa khóa dẫn đến biểu tượng đó.

Nếu bạn thực hiện một sai lầm khi ghi macro phức tạp, không băn khoăn — Emacs cung cấp một thực sự trình chỉnh sửa macro tốt mà bạn có thể sử dụng để sửa bất kỳ lỗi nào sau khi bạn kết thúc ghi âm (chỉ cần nhập Cx Ck e), vì vậy bạn không cần phải hoàn hảo.

chỉnh sửa 2: Có thể thêm ví dụ về chức năng, theo nhận xét.

(defun my-align-single-equals() 
    "Align on a single equals sign (with a space either side)." 
    (interactive) 
    (align-regexp 
    (region-beginning) (region-end) 
    "\\(\\s-*\\) = " 1 0 nil)) 

(global-set-key (kbd "C-c a") 'my-align-single-equals) 
+0

Cảm ơn. Tôi đã có thể sử dụng giải pháp của bạn nhưng tạo ra một chức năng thay vì một vĩ mô, vì nó dễ đọc hơn cho tôi. – Karl

+0

Vâng, điều đó thậm chí còn tốt hơn :) Một chức năng chắc chắn là thích hợp hơn nếu bạn đang viết lisp, nhưng các macro rất tiện dụng nếu bạn không. – phils

+0

một chút muộn cho bữa tiệc, nhưng cách kinh điển để giải quyết điều này là thêm quy tắc vào 'align-rules-list' thay vì viết chức năng của riêng bạn. –

Các vấn đề liên quan