Có chế độ điền đoạn hoàn toàn tự động cho nhận xét mã không?


18

Tôi đang tìm kiếm một chế độ nhỏ để giữ cho các đoạn được lấp đầy mọi lúc trong khi gõ (tương tự như những gì aggressive-indent-modeđể thụt lề). Nó cũng cần phải đủ thông minh để chỉ điền vào các bình luận (và có thể các chuỗi tùy thuộc vào ngôn ngữ).

Một số điều mà tôi đã thử là:

  • auto-fill-mode tự động điền vào trong khi bạn đang gõ các đoạn mới nhưng không nạp lại khi bạn chỉnh sửa các đoạn.

  • refill-mode không liên tục nạp các đoạn nhưng nó cố gắng bọc mã thành các đoạn cũng như các bình luận.

  • Tôi đã cố gắng thêm fill-paragraphvào after-change-functionsmóc nhưng nó vặn lại và nhiều thứ khác (điều này có thể sửa được nhưng sẽ mất một số nỗ lực).

Còn ý tưởng nào hay hơn không?


6
Ngoài ra: chương 7 của phần mở rộng GNU Emacs bằng văn bản của Glickstein sẽ trình bày cách bạn có thể thực hiện chức năng mà bạn theo đuổi. Có thể là một cơ hội tuyệt vời để học / thực hành với elisp.
Dân

Tôi đang tìm đoạn tự động điền (có bật tự động điền) org-mode, nhưng bạn có thể thử rebox2
CodyChan

Câu trả lời:


4

Tôi đã đưa ra một cách tối thiểu để thực hiện chức năng này: chỉ cần liên kết thanh không gian để gọi (fill-paragraph)!

(defun fill-then-insert-space ()
  (interactive)
  (fill-paragraph)
  (insert " "))
(global-set-key (kbd "SPC") #'fill-then-insert-space)

Có một vài cảnh báo mà tôi đã vấp ngã cho đến nay:

  1. elisp-mode(có thể là những người khác) thực hiện một số mã điền ưa thích khi bạn gọi fill-paragraph, điều này có thể hoặc không thể là những gì bạn muốn. Có thể khắc phục bằng cách kiểm tra nếu điểm nằm trong một nhận xét hoặc chuỗi, nhưng tôi không chắc làm thế nào để làm điều đó.

  2. Đôi khi bạn không thể dễ dàng nhập nhiều khoảng trắng (vì fill-paragraphsẽ giết chết mọi dấu cách). Vì thanh không gian bây giờ hoạt động như thế just-one-spacecó thể ổn để thay thế ràng buộc đó (insert " ").

Tôi đã tạo một chế độ nhỏ có chứa chức năng này, nó có sẵn trên github hoặc trong gói melpa aggressive-fill-paragraph.


Tôi thấy thật trớ trêu khi nó aggressive-fill-paragraphít gây hấn hơn refill-mode, nó hung dữ đến mức khá vô dụng (vì bạn thậm chí không thể trích dẫn ai đó > mà không sắp xếp lại chế độ nạp lại: ngay cả khi bạn sử dụng biểu thức chính quy để thay thế) .
Hi-Angel

1

Nếu bạn thích cách hoạt động của chế độ nạp lại (tôi không: p) nhưng không phải khi nó hoạt động, việc khắc phục tương đối dễ dàng bằng cách ức chế nó bất cứ khi nào bạn không ở trong điều kiện thích hợp

Ví dụ

(defvar plop/refill-enabler-function nil)

(defun plop/region-in-comment (beg end)
  ;; should really be comment-only-p, but that seems really broken for me
  (not
   (loop for c from beg to end
      if (not (eq 'font-lock-comment-face (get-char-property c 'face)))
      return t)))

(defun plop/refill-after-change-function (beg end len)
  (unless undo-in-progress
    (when (and plop/refill-enabler-function
               (funcall plop/refill-enabler-function beg end))
      (setq refill-doit end))))

(defun plop/install-refill-hack ()
  (if refill-mode
      (progn
        (add-hook 'after-change-functions 'plop/refill-after-change-function nil t)
        (remove-hook 'after-change-functions 'refill-after-change-function t))
    (progn
      (remove-hook 'after-change-functions 'plop/refill-after-change-function t))))

(defun plop/refill-hook ()
  (set (make-local-variable 'plop/refill-enabler-function)
       #'plop/region-in-comment)
  (add-hook 'refill-mode-hook 'plop/install-refill-hack t t)
  (refill-mode))

(add-hook 'some-hook 'plop/refill-hook)

Về cơ bản, nó loại bỏ chức năng kích hoạt nạp tiền after-change-functionsvà thay thế nó bằng chức năng bổ sung để kiểm tra xem chúng tôi đang ở trong một nhận xét trước khi thực hiện chính xác điều tương tự.


Trông giống như một khởi đầu tốt, nhưng vẫn không hoàn toàn đúng: nếu một lần nạp được kích hoạt trong khi chỉnh sửa một nhận xét, nó sẽ nạp lại toàn bộ đoạn văn, bao gồm cả mã xung quanh. Đây có thể là lỗi của chế độ xung quanh vì không xác định đúng giới hạn đoạn, nhưng tôi nghi ngờ điều đó: Tôi đã thử ở chế độ Emacs Lisp, mà tôi cho là làm những điều trong cuốn sách.
Gilles 'SO- ngừng trở nên xấu xa'

tốt, đó là lý do tại sao tôi nói tôi không thích refill-mode:) Vấn đề là refill-modesử dụng fill-regionthay vì fill-paragraph, do đó làm mất khả năng tôn vinh fill-paragraph-functionvà khiến mọi thứ trở nên lộn xộn
Sigma
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.