2011-12-16 21 views
12

Trong khi câu hỏi này liên quan đến định dạng của LaTeX trong Emacs (và có thể là Auctex), tôi tin rằng điều này có thể được áp dụng cho các tình huống chung hơn trong Emacs liên quan đến dấu phân cách như dấu ngoặc đơn, dấu ngoặc và dấu ngoặc.Làm thế nào bạn có thể sửa đổi hai dấu phân tách phù hợp cùng một lúc với Emacs?

Tôi đang tìm cách có thể thực hiện những điều sau với Emacs (và elisp) và không biết bắt đầu từ đâu. Nói rằng tôi có:

(This is in parentheses) 

Với một số keybinding trong Emacs, tôi muốn Emacs để tìm các dấu phân cách phù hợp để bất cứ ai bởi con trỏ của tôi (điều mà tôi biết Emacs có thể làm vì nó có thể làm nổi bật delimiters phù hợp trong chế độ khác nhau) và có thể thay đổi cả trong số họ để

\left(This is in parentheses \right) 

các delimiters tôi muốn này để làm việc với là: (...), [...], \lvert ... \rvert, \langle ... \rangle, \{ ... \}. Tôi cần làm gì để hoàn thành nhiệm vụ này?

Các cách chung khác để xử lý các dấu phân cách phù hợp được hoan nghênh.

+1

+1 Ý tưởng hay! Một điều như vậy sẽ luôn hữu ích ... –

+0

Vui lòng làm rõ nơi sửa đổi đến từ đâu? Việc sửa đổi có luôn là vấn đề của việc thêm "\ left" và "\ right" vào các dấu phân cách không? –

+0

Sửa đổi xuất phát từ LaTeX vì '\ left' và' \ right' làm cho các dấu phân cách đó có kích thước của văn bản/toán học chứa trong chúng (đôi khi tôi không đủ khả năng nhận ra rằng tôi sẽ cần chúng). Và có, sửa đổi sẽ là vấn đề của việc thêm vào trước '\ left' và' \ right' cho các dấu phân tách. Tuy nhiên, nếu có nhiều cách để làm những việc khác cho họ (ví dụ như thay đổi dấu ngoặc đơn thành dấu ngoặc đơn hoặc dấu ngoặc ôm), điều đó cũng sẽ tốt đẹp. – qgp07

Trả lời

8

Đánh giá lệnh bên dưới trong Emacs. Sau khi tải lại, bạn có thể đặt điểm (con trỏ văn bản) ngay sau dấu ngoặc đóng. Sau đó, hãy thực hiện M-x replace-matching-parens để thay thế việc đóng ) bằng \right) và bắt đầu kết hợp paren ( với \left(.

(defun replace-matching-parens() 
    (interactive) 
    (save-excursion 
    (let ((end-point (point))) 
     (backward-list) 
     (let ((start-point (point))) 
     (goto-char end-point) 
     (re-search-backward ")" nil t) 
     (replace-match " \\\\right)" nil nil) 

     (goto-char start-point) 
     (re-search-forward "(" nil t) 
     (replace-match "\\\\left(" nil nil))))) 

Các interactive chút chỉ ra rằng tôi muốn có một "lệnh", do đó nó có thể được thực hiện bằng M-x. Để tránh con trỏ kết thúc ở một nơi lạ sau khi thực hiện, tôi đang gói logic trong save-excursion. Điểm nhảy trở lại dấu ngoặc mở bằng cách sử dụng backward-list và giữ vị trí bắt đầu và kết thúc của vùng được so khớp paren. Cuối cùng, bắt đầu từ cuối và làm việc ngược tôi thay thế các chuỗi. Bằng cách thay thế ngược lại thay vì chuyển tiếp, tôi tránh vô hiệu hóa end-point trước khi tôi cần.

Việc tổng hợp điều này để xử lý các loại dấu phân tách khác nhau không được quá tệ. backward-list nên làm việc với bất kỳ cặp dây emacs công nhận là tương tự của (). Để thêm các cặp chuỗi giống như dấu ngoặc đơn, hãy xem set-syntax-table trong bài viết Parenthesis Matching này.

Sử dụng global-set-key để thiết lập ràng buộc khóa replace-matching-parens.

Fair cảnh báo: replace-matching-parens là lệnh elisp đầu tiên tôi đã thực hiện, vì vậy nó có thể không phù hợp với thông lệ tốt nhất. Đối với tất cả các bậc thầy, tôi mở cửa cho những lời chỉ trích mang tính xây dựng.

+0

Đây chính là điều tôi muốn! Làm việc như một say mê. – qgp07

+0

Rất vui khi được nghe!Cảm ơn vì đã cho tôi một thử thách tuyệt vời. –

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