2009-09-12 30 views
6

Tôi hiện đang sử dụng Emacs 23 với chế độ dòng trực quan để chỉnh sửa văn bản nhưng vẫn tiếp tục nhấn Mq ra khỏi thói quen (do đó thêm kết thúc dòng cứng ...) . Tôi tự hỏi nếu có một cách để thêm một điều kiện để vô hiệu hóa điền đoạn (hoặc loại bỏ ràng buộc để Mq) cho chế độ trong đó chế độ dòng trực quan được bật, nhưng để kích hoạt lại nó cho những người mà tôi vẫn còn sử dụng chế độ tự động điền? Cảm ơn!emacs: visual-line-mode và fill-paragraph

Trả lời

7
(defun maybe-fill-paragraph (&optional justify region) 
    "Fill paragraph at or after point (see `fill-paragraph'). 

Does nothing if `visual-line-mode' is on." 
    (interactive (progn 
     (barf-if-buffer-read-only) 
     (list (if current-prefix-arg 'full) t))) 
    (or visual-line-mode 
     (fill-paragraph justify region))) 

;; Replace M-q with new binding: 
(global-set-key "\M-q" 'maybe-fill-paragraph) 

Thay vì sử dụng global-set-key, bạn cũng có thể rebind M-q chỉ ở chế độ cụ thể. (Hoặc, bạn có thể thay đổi ràng buộc toàn cầu, và sau đó ràng buộc M-q quay lại fill-paragraph trong một chế độ cụ thể.) Lưu ý rằng nhiều chế độ được tự động tải, vì vậy sơ đồ phím của chúng có thể không được xác định cho đến khi chế độ được kích hoạt. Để thiết lập một chế độ cụ thể ràng buộc, tôi thường sử dụng một chức năng như thế này: (. Các remove-hook là không thực sự cần thiết, nhưng chức năng chỉ cần chạy một lần)

(add-hook 'text-mode-hook 
    (defun cjm-fix-text-mode() 
    (define-key text-mode-map "\M-q" 'maybe-fill-paragraph) 
    (remove-hook 'text-mode-hook 'cjm-fix-text-mode))) 

+0

cài đặt chung trên toàn cầu 'M-q' là điều ác, vì nó ảnh hưởng đến tất cả các chế độ. nếu bạn phải làm điều này, sử dụng 'thay thế-key-definition' (hoặc sử dụng defadvice hoặc fset) – mihi

+0

Nhưng đó là toàn bộ vấn đề. M-q đã là một ràng buộc toàn cầu. Anh ta muốn nó phục hồi chức năng kiểm tra chế độ trực quan. – cjm

+0

Hmmm ... cũng là một lựa chọn tuyệt vời ... Thiết lập toàn cầu của M-q có thể nguy hiểm nhưng chức năng này đủ đơn giản (và thanh lịch) mà hậu quả của nó có thể dự đoán được? – hatmatrix

5

bạn có thể sử dụng một tư vấn cho việc này.

Đối với emacs của bạn:

(defadvice fill-paragraph (around disable-for-visual-line-mode activate) 
    (unless visual-line-mode 
    ad-do-it)) 

này sẽ thay đổi fill-đoạn để làm gì khi hình ảnh-line-mode được bật lên. Bạn cũng có thể thêm lỗi nếu bạn thích điều đó.

+0

Lưu ý rằng điều này sẽ vô hiệu hóa hoàn toàn' fill-paragraph' khi chế độ dòng trực quan được bật, ngay cả khi nó được gọi từ một hàm elisp. Bạn có thể không muốn là quyết liệt. – cjm

+0

Tôi đồng ý, rất đẹp ... nhưng cjm có một điểm ... mặc dù tôi không biết làm thế nào thường điền đoạn được gọi là từ bên trong chức năng elisp. – hatmatrix

+0

(Tôi yêu mặc định vì bạn cũng có thể tắt nó mà không cần khởi động lại các emacs) – hatmatrix

2

chế độ dòng trực quan có sơ đồ bàn phím riêng: visual-line-mode-map. Tôi khuyên bạn nên khôi phục M-q chỉ trong sơ đồ bàn phím đó.

Bản đồ được xác định là một phần của quá trình khởi động, vì vậy bạn không cần đánh giá sau khi tải. Chỉ cần vô hiệu hóa ràng buộc ở chế độ đó:

(define-key visual-line-mode-map [remap fill-paragraph] 'ignore) 
+1

'ignore' là lệnh" lấy bất kỳ đối số nào và không làm gì ". – phils

+0

Tuyệt vời! Cảm ơn bạn @phils, tôi đã chỉnh sửa câu trả lời của mình. (Ed: trước đây tôi đã định nghĩa hàm noop của riêng mình thay vì 'bỏ qua.) – Dato

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