Hoán đổi hành vi mặc định của lệnh với hành vi Cu


7

Nhiều lệnh Emacs thay đổi hành vi của chúng khi được gọi bằng một hoặc nhiều C-utiền tố. Trong một số trường hợp, hành vi mặc định của lệnh ít hữu ích hơn so với hành vi tôi nhận được khi tiền tố với nó C-u. Đồng thời, tôi không muốn loại bỏ hoàn toàn hành vi mặc định.

Để đưa ra một ví dụ cụ thể, quit-windowlệnh (ràng buộc qtrong help-mode) thoát khỏi cửa sổ hiện tại và chôn bộ đệm được hiển thị trong đó theo mặc định. Khi được gọi với C-unó sẽ giết bộ đệm thay thế. Tôi muốn lệnh giết bộ đệm theo mặc định và chôn nó khi được gọi với C-utiền tố.

H: Làm thế nào tôi có thể bảo Emacs thực hiện một lệnh hoạt động như thể nó được gọi với C-u tiền tố theo mặc định trong khi di chuyển hành vi mặc định sang C-u tiền tố ?

Tôi biết rằng tôi có thể giải quyết vấn đề này bằng cách xác định lại lệnh ban đầu hoặc gói nó trong một lệnh tùy chỉnh vượt qua tiền tố args theo sở thích của tôi. Nhưng tôi muốn làm một cái gì đó như thế này:

(swap-args 'quit-window)

Câu trả lời:


4

Một cái gì đó như thế này:

(defun swap-args (fun)
  (if (not (equal (interactive-form fun)
                  '(interactive "P")))
      (error "Unexpected")
    (advice-add
     fun
     :around
     (lambda (x &rest args)
       "Swap the meaning the universal prefix argument"
       (if (called-interactively-p 'any)
           (apply x (cons (not (car args)) (cdr args)))
         (apply x args))))))

Rõ ràng, chỉ làm việc cho (interactive "P"). Đối với các loại khác của interactivenó có thể không có ý nghĩa để phủ nhận đối số đầu tiên.


1
Có thể đơn giản hơn một chút bằng cách sử dụng :filter-argsthay vì :around, tôi nghĩ.
npostavs

Cảm ơn, swap-argshoạt động ở chỗ nó làm cho C-uhành vi trở thành mặc định khi áp dụng nó vào một lệnh. Tuy nhiên, khi tôi gọi lệnh với C-u, tôi không nhận được hành vi ban đầu. Có lẽ called-interactively-plà để đổ lỗi? Tôi hiểu rằng với một đối số 'any, hàm này sẽ chỉ trả về nilnếu lệnh chứa được gọi từ Lisp, vì vậy khi gọi lệnh được khuyên thông qua một ràng buộc khóa, nhánh khác không thể đạt được.
itjeyd

'anyvẫn ổn, tôi đã sử dụng funcallthay vì applynhầm lẫn.
abo-abo

2
Bạn cũng nên thêm một cái gì đó vào chuỗi doc, nếu không điều này chắc chắn sẽ gây nhầm lẫn.
Gilles 'SO- ngừng trở nên xấu xa'

1
Khó chịu một số chức năng (ví dụ. org-insert-subheading) Kiểm tra theo nghĩa đen đối với đối số phổ quát thô (rõ ràng (4)) thay vì kiểm tra cưỡng chế sự thật.
olejorgenb

1

Một phương pháp khác dựa trên thực tế là một interactive-formthuộc tính trong hàm của hàm ghi đè biểu mẫu được chỉ định trong mã: ( ref )

(put 'org-insert-subheading
     'interactive-form
     '(interactive (progn (if current-prefix-arg
                              '(nil)
                            '((4))))))

Sử dụng (interactive-form 'function)để có được thông số kỹ thuật hiện tại, cũng có thể xử lý các thông số kỹ thuật phức tạp hơn.

Tôi nghĩ rằng giải pháp tốt nhất (nếu có thể) là để bọc các chức năng với (let ((prefix-arg (not current-prefix-arg)))


0

Không dễ như suy nghĩ. Tuy nhiên, vì nó tầm thường khi có lệnh hoán đổi:

(defun my-quit-window-args-swapped (&optional bury window)
"Adapted docstring blah, blah "
  (interactive "P")
  (quit-restore-window window (if bury 'bury 'kill)))

Cảm ơn, nhưng như tôi đã đề cập trong câu hỏi của mình, tôi đang tìm kiếm một giải pháp chung mà tôi có thể áp dụng cho các lệnh khác nhau, không phải là một trình bao bọc dành riêng cho quit-windowlệnh.
itjeyd

@itsjeyd Không có giới hạn hữu hạn WRT đối với kết quả và việc làm của một đối số. Đó không phải là về "(hoán đổi ..." mà là về cách sử dụng và ý nghĩa của args - cuối cùng là miễn phí.
Andreas Röhler

1
Tôi nên chọn từ ngữ của tôi cẩn thận hơn. Tôi không có ý đề nghị rằng giải pháp của bạn không thể thích nghi để làm việc cho các lệnh khác. Đó là một giải pháp hoàn toàn tốt để hoán đổi mặc định và C-uhành vi, và tôi chắc chắn rằng những người khác đi qua bài đăng của bạn sẽ được nó giúp đỡ! Cá nhân, tôi sẽ không sử dụng nó bởi vì tôi có nhiều lệnh có hành vi tôi muốn thay đổi và muốn tránh phải xác định nhiều hàm bao.
itjeyd 27/05/2015

@itsjeyd AFAIU điều duy nhất được xác định ở đây là cách cơ thể tiếp nhận Cu. Không có tiêu chuẩn tại điểm mà cơ thể được sử dụng, cũng có nhiều cách để sử dụng nó - theo nghĩa boolean ở đây. Chắc chắn, bạn có thể sử dụng một số loại AI để trang trải và đối phó với tất cả những khả năng này. :)
Andreas Röhler
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.