Tùy chỉnh giao diện chế độ vc trong chế độ dòng


7

Tôi sử dụng vc-modeđể hiển thị thông tin về trạng thái VC hiện tại trong dòng chế độ của mình, như thế này:

(setq mode-line-format '(… (vc-mode vc-mode) …))

Tuy nhiên, tôi tìm thấy định dạng mặc định của vc-modeverbose khá. Đáng chú ý, nó bao gồm tên của phụ trợ VC hiện tại, điều này không thú vị lắm đối với tôi. Tôi thường biết bộ đệm hiện tại của VCS là gì và tôi thực sự không sử dụng bất kỳ VCS nào ngoài Git.

Làm thế nào tôi có thể tùy chỉnh sự xuất hiện của vc-mode? Lý tưởng nhất là tôi ẩn tên của phần phụ trợ và chỉ hiển thị tên của nhánh hiện tại (hoặc có thể là một cái gì đó tương tự git describe).

Ngoài ra, nếu vc-modekhông thể được tùy chỉnh, bằng cách nào đó tôi có thể lấy tên chi nhánh hiện tại từ VC, để sử dụng trong (:eval …)cấu trúc tùy chỉnh không?

mode-line  git  vc 

Câu trả lời:


5

Làm thế nào tôi có thể tùy chỉnh sự xuất hiện của vc-mode? Lý tưởng nhất là tôi ẩn tên của phụ trợ và chỉ hiển thị tên của chi nhánh hiện tại.

Đó là khá nhiều những gì chế độ thông minh-line làm. Bạn có thể dùng thử hoặc bạn có thể sao chép lời khuyên mà nó sử dụng:

(defadvice vc-mode-line (after strip-backend () activate)
  (when (stringp vc-mode)
    (let ((noback (replace-regexp-in-string 
                   (format "^ %s" (vc-backend buffer-file-name))
                   " " vc-mode)))
      (setq vc-mode noback))))

Lưu ý rằng đây là một phiên bản hợp lý của nó. Bạn có thể tìm thấy mã đầy đủ cho lời khuyên ở đây , cũng áp dụng các khuôn mặt khác nhau tùy thuộc vào trạng thái của chi nhánh.


Thay vào đó, đây là một phiên bản thậm chí hợp lý hơn mà không sử dụng lời khuyên.

(setcdr (assq 'vc-mode mode-line-format)
        '((:eval (replace-regexp-in-string "^ Git" " " vc-mode))))

Điều đó sẽ có hiệu quả với Mặc dù tôi muốn sử dụng một :evalcấu trúc thay vì một lời khuyên, nhưng nó không chính xác như những gì tôi gọi là "tùy chỉnh". Đó là một hack bẩn, phải không? Tôi thực sự thích một cách sạch sẽ hơn

1
@lunaryorn Vâng, đó là một hack. vc-modekhông thể tùy biến cao trong khía cạnh này (mà tôi có thể nói). Tôi cũng thích một cách sạch sẽ hơn. :-)
Malabarba

2
@lunaryorn Tôi đã chỉnh sửa câu trả lời để sử dụng :evalcấu trúc.
Malabarba

3

Tôi cũng không hài lòng với hành vi mặc định. Tôi không bao giờ có thể giữ các ký tự thông tin vc thẳng ":" để chỉnh sửa, "@" để thêm, v.v. Bạn có thể thoải mái sử dụng phương pháp của tôi.

Tôi đã xác định một số khuôn mặt tùy chỉnh để hiển thị trạng thái với nhiều màu sắc khác nhau. Sau đó, tôi đã viết một hàm để dịch thông tin vc mặc định thành một chuỗi để chèn vào dòng chế độ. Sau đó, tôi đã thêm một :evaldòng trong định nghĩa dòng chế độ của tôi để hiển thị nó.

;; Xác định khuôn mặt.

(hủy kết nối / chế độ của tôi: vc-thêm
  `(
     (((màu lớp))
        (: nền "# FFAA55": tiền cảnh "đen"))
     (t
        (: trọng số đậm: gạch chân t))
   )
  "Mặt thẻ trạng thái VC cho các tệp vừa được thêm vào
kiểm soát phiên bản."
  : nhóm 'MY / chế độ)

(hủy kết nối / chế độ của tôi: vc-chỉnh sửa
  `(
     (((màu lớp))
        (: nền "# F05B80": tiền cảnh "đen")); "# F04040" có thể?
     (t
        (: trọng số đậm: gạch chân t))
   )
  "Mặt thẻ trạng thái VC cho các tệp nằm dưới sự kiểm soát phiên bản
nhưng đã được chỉnh sửa. "
  : nhóm 'MY / chế độ)

(hủy kết nối / chế độ của tôi: vc-in-sync
  `(
     (((màu lớp))
        (: nền "# 60CC60": tiền cảnh "đen"))
     (t
        (: trọng số đậm: gạch chân t))
   )
  "Mặt thẻ trạng thái VC cho các tệp nằm dưới sự kiểm soát phiên bản
và được đồng bộ hóa với kho lưu trữ. "
  : nhóm 'MY / chế độ)

(hủy kết nối / chế độ của tôi: vc-none
  `(
     (((màu lớp))
        (: nền "# 70A0D0": tiền cảnh "đen"))
     (t
        (: trọng số đậm: gạch chân t))
   )
  "Mặt thẻ trạng thái VC cho các tệp không thuộc phiên bản
điều khiển"
  : nhóm 'MY / chế độ)

(hủy kết nối / chế độ của tôi: vc-unknown
  `(
     (((màu lớp))
        (: nền "# FF0000": tiền cảnh "trắng"))
     (t
        (: trọng số đậm: gạch chân t))
   )
  "Mặt thẻ trạng thái VC cho các tệp có trạng thái kiểm soát phiên bản
không thể xác định."
  : nhóm 'MY / chế độ)

(defvar my-vc-mode-attrs
  '(("". ("NoVC" my / mode: vc-none))
    ("-". ("VC =" my / mode: vc-in-sync))
    (":". ("VC>" my / mode: vc đã chỉnh sửa))
    ("@". ("VC +" my / mode: vc đã thêm))
    ("?". ("? VC?" Của tôi / chế độ: vc không xác định))
    )
  "Bảng tra cứu để dịch ký tự chế độ vc sang một chuỗi / mặt khác."
)


;; Chức năng này giúp tôi hiểu trạng thái kiểm soát phiên bản.
(defun my-mode-line-vc-information ()
  "Trả về thông tin trạng thái kiểm soát phiên bản về tệp trong
bộ đệm hiện tại, như là một chuỗi chữ.

Biến dòng chế độ `vc-mode 'là không nếu tệp không ở dưới
kiểm soát phiên bản và hiển thị dấu gạch nối hoặc dấu hai chấm tùy thuộc vào việc
các tập tin đã được sửa đổi kể từ khi đăng ký. Tôi không bao giờ có thể giữ những
thẳng.

Hàm này trả về \ "NoVC \" nếu tệp không thuộc phiên bản 
điều khiển. Nó hiển thị một chuỗi có dấu = nếu tệp được đồng bộ hóa
với kiểm soát phiên bản của nó và một chuỗi có dấu> nếu tệp có
đã được sửa đổi kể từ lần đăng ký cuối cùng. "
  (hãy * ((lớp
          (cond
           ;; Nếu không thuộc kiểm soát phiên bản
           ((không phải chế độ vc)
            "")

           ;; Nếu dưới kiểm soát phiên bản giải mã ký tự -: @
           ((khớp chuỗi "\\`? \\ (?: CVS \\ | Git \\) \\ ([-: @] \\) \\ ([^^: ~ \ x00- \ x1F \\\ \ /] + \\)? "Chế độ vc)
            (kết hợp chuỗi-không-thuộc tính 1 vc-mode))

           ;; Nếu không, chỉ ra sự nhầm lẫn
           (t
            "?")
           ))

         (chi nhánh
          (nếu (bất kỳ lớp nào '("-" ":" "@"))
              (concat "" (match-string-no-property 2 vc-mode))
            ""))

         ;; Tìm nạp danh sách thuộc tính cho ký tự lớp ở trên
         (đạo cụ (cdr (lớp PGS my-vc-mode-attrs)))
         )

    (concat (orthtize (đạo cụ xe hơi) 'khuôn mặt (đạo cụ cadr))
            chi nhánh)))

(set-default 'mode-line-format
   '(
     ...
        (: eval (my-mode-line-vc-information))
     ...))

Cảm ơn. Cái này trông giống như thứ gì đó tôi thực sự cần sao chép vào cấu hình của chính mình :)

Tôi có thể lấy chức năng ở anyđâu?
MonLau
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.