Làm thế nào để làm nổi bật thụt lề không gian không được làm tròn theo chiều rộng hiện tại?


7

Có cách nào để làm nổi bật (ví dụ như đặt màu nền) không gian trước một dòng, khi vết lõm không được căn chỉnh theo chiều rộng thụt hiện tại?

4 chỗ thụt lề cho ví dụ:

fn my_func() {
    if foo() {
        ##bar();
        blob();
    ###fez();
        baz();
    }
}

trong đó các #ký tự đại diện cho nền hiển thị một màu khác nhau, trở lại cho đến khi vết lõm được căn chỉnh thành 4.

Tất nhiên điều này chỉ hữu ích khi mã tuân theo các quy ước thụt lề nghiêm ngặt.


Lưu ý rằng tôi biết về các tính năng tự động thụt đầu tiên của emacs và các plugin làm nổi bật thụt lề, nhưng sẽ thích một cái gì đó ít xâm phạm hơn, chỉ hiển thị khi có vấn đề. Một chút giống như làm nổi bật không gian dấu.


Điều này không trả lời câu hỏi của bạn, nhưng các chức năng như c-indent-defunsẽ sửa lỗi thụt lề cho bạn, có thể đạt được kết quả mong muốn.
Tyler

@Tyler, vấn đề là bạn không phải lúc nào cũng là người duy nhất viết mã. Kiểm tra các tệp được viết bởi người khác là một trường hợp sử dụng khá phổ biến - và bạn không luôn muốn thụt lại công việc của họ (sửa lỗi hoặc thay đổi để xem lại mã), vì vậy chỉ cần xem thụt lề là hữu ích.
ideaman42

Điều đó có ý nghĩa. Chỉ cần kiểm tra - đôi khi mọi người hỏi làm thế nào để đi được nửa đường đến một cái gì đó, không nhận ra rằng Emacs sẽ đưa bạn đến tất cả các mục tiêu. Nhưng trường hợp sử dụng của bạn là hợp lý.
Tyler

Câu trả lời:


3

Sử dụng khóa chữ ...

(font-lock-add-keywords nil
  '(("^ \\{4\\}*\\( \\{1,3\\}\\)[^ ]" 1 'match)))

Có thể tốt để sử dụng whitespace-trailingthay vìmatch
ideaman42

1
Được sửa đổi để đọc chiều rộng tab hiện tại (format "^ \\{%d\\}*\\( \\{1,%d\\}\\)[^ ]" tab-width (- tab-width 1))`
ideaman42

thêm một câu trả lời hơi mở rộng, hãy sao chép từ nó.
ideaman42

3

Điều này có thể được thực hiện bằng cách sử dụng font-lock-add-keywords.

Ví dụ dưới đây cho thấy bạn có thể chọn lọc kích hoạt tính năng này trong cấu hình của mình - cho các định dạng khác nhau.

  • Lưu ý thụt đầu dòng được đọc từ tab-width.
  • Ví dụ này sử dụng whitespace-trailing, bạn có thể muốn sử dụng matchhoặc bất kỳ màu nào khác.

ví dụ:

;; highlight non-aligning indent offset
(defun highlight-indent-offset ()
 (font-lock-add-keywords
  nil
  `((,(lambda (limit)
        (re-search-forward
         (format "^ \\{%d\\}*\\( \\{1,%d\\}\\)[^ ]" tab-width (- tab-width 1))
         limit t))
     1 'whitespace-trailing))))

Sau đó, chức năng này có thể được gọi cho các chế độ đặc biệt: vd

(add-hook
 'rust-mode-hook
 (lambda ()
   (setq tab-width 4)
   (highlight-indent-offset)
   (setq indent-tabs-mode nil)))

Đây là một thay đổi nhỏ đối với câu trả lời của @ politza.


Tại sao không đi tất cả các cách và làm cho nó một chế độ nhỏ.
Politza

Tôi chưa bao giờ viết một chế độ nhỏ trước đây, sẽ cần xem xét nó - nó có lợi thế gì?
ideaman42

Một chế độ nhỏ có thể bị vô hiệu hóa.
Politza
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.