Làm thế nào để căn chỉnh một số mục trong modeline?


9

Cho cấu hình modeline sau:

(setq-default mode-line-format
   (list
    ;; Current buffer name
    "%b "
    ;; Major mode
    "[%m] "
    ;; Modified status
    "[%*] "
    ;; Cursor position
    "Line: %l/%i Column: %c"))

Tôi muốn cho mục cuối cùng xuất hiện liên kết bên phải.


1
Đây là một liên kết đến một chủ đề liên quan: stackoverflow.com/q/16775855/2112361
luật

1
Vì bạn đã hỏi một cách cụ thể mode-line-formatnên đây không phải là một câu trả lời thích hợp, nhưng điều chỉnh smart-mode-lineđúng mode-line-misc-infotheo mặc định và nó có thể điều chỉnh đúng danh sách các chế độ phụ bằng cách đặt sml/mode-widththành 'right.
Malabarba

Câu trả lời:


11

Giống như câu trả lời trong các bình luận, bạn có thể tự làm điều này bằng cách viết mã để trả về một chuỗi cách đều nhau.

Đây là một cách đơn giản chỉ hỗ trợ văn bản căn lề trái và phải áp dụng cho thông số kỹ thuật của bạn.

;; write a function to do the spacing
(defun simple-mode-line-render (left right)
  "Return a string of `window-width' length containing LEFT, and RIGHT
 aligned respectively."
  (let* ((available-width (- (window-width) (length left) 2)))
    (format (format " %%s %%%ds " available-width) left right)))


;; use the function in conjunction with :eval and format-mode-line in your mode-line-format
(setq mode-line-format
      '((:eval (simple-mode-line-render
                ;; left
                (format-mode-line "%b [%m] [%*]")
                ;; right
                (format-mode-line "Line: %l/%i Column: %c")))))

nó kết thúc như thế này: nhập mô tả hình ảnh ở đây

Cũng lưu ý, tôi đã sử dụng đối số định dạng dòng chế độ của bạn như bạn đã chỉ định, nhưng tôi tin rằng bạn đang sử dụng% i không chính xác, in kích thước byte của bộ đệm, không phải số lượng dòng. Bạn có thể sử dụng một cái gì đó như (line-number-at-pos (point-max))để có được số lượng dòng trong bộ đệm của bạn.


Một bổ sung - bạn cần sử dụng window-total-widthđể tính toán linum và tua thêm phần đệm.
Sandric

Câu trả lời này có một lỗi trong đó dòng chế độ trả về sẽ được đánh giá lại dưới dạng dòng chế độ. Các %ký tự có nghĩa sẽ cố gắng được định dạng hai lần. Tài khoản cho câu trả lời này của tôi, emacs.stackexchange.com/a/37270/2418 - cũng sử dụng window-total-width(cảm ơn!)
ideaman42

Đã giải quyết lỗi trong câu trả lời này: emacs.stackexchange.com/a/37270/2418
ideaman42

2

Để mở rộng câu trả lời của @ jordon-biondo và khắc phục lỗi hiển thị %.

Ví dụ này cho thấy cách các biến dòng chế độ có thể được sử dụng với căn chỉnh - điều này khiến tôi mất một lúc để tìm ra.

(defun simple-mode-line-render (left right)
  "Return a string of `window-width' length containing LEFT, and RIGHT aligned respectively."
  (let* ((available-width (- (window-total-width) (+ (length (format-mode-line left)) (length (format-mode-line right))))))
    (append left (list (format (format "%%%ds" available-width) "")) right)
    )
  )

(setq-default
  mode-line-format
  '
  (
    (:eval
      (simple-mode-line-render
        ;; left
        (quote ("%e " mode-line-buffer-identification " %l : %c" evil-mode-line-tag "[%*]"))
        ;; right
        (quote ("%p " mode-line-frame-identification mode-line-modes mode-line-misc-info))
        )
      )
    )
  )
)

Ví dụ đầu ra:

init.el 1 : 0 <N> [-] Top -F1 (Emacs-Lisp WK ivy drag AC GitGutter)


0

Điều này không được hỗ trợ ngoài luồng nhưng smart-mode-linegói hỗ trợ này. Bạn có thể sử dụng gói đó hoặc nếu nó thực hiện nhiều hơn những gì bạn muốn, chỉ trích xuất các bit thực hiện tính năng bạn đang yêu cầu.


Vì op không theo dõi, tôi đã biến bình luận của @ Malabarba thành một câu trả lời. Bằng cách này, câu hỏi không phải là "chưa được trả lời" và gói này rất có thể là những gì người dùng khác có cùng câu hỏi muốn sử dụng.
tarsius

Đó là những gì tôi đã làm, trích xuất các chức năng có liên quan từ smart-mode-linevà thêm nó vào dotemacs của tôi. Nó đòi hỏi tôi phải tìm ra bao nhiêu không gian tôi muốn ở bên phải, nhưng tốt hơn là không có gì. Trừ khi ai đó đăng một cách để thoát khỏi việc đếm char thủ công, tôi sẽ không chấp nhận câu trả lời.
mkaito

0

Mặc dù có thể thực hiện 'chính xác' căn chỉnh trái / phải bằng cách thêm một phương pháp thay thế bởi vì việc đánh giá đầy đủ bên trái và bên phải chỉ để căn chỉnh là hơi nặng nề, khi có một cách thay thế đơn giản hơn.

Nếu bạn biết bạn chỉ cần một khoảng trống cố định ở bên phải, bạn có thể điền vào tất cả trừ N ký tự, điều này hoạt động miễn là kích thước phù hợp là một độ dài cố định.

Định dạng chuỗi %12svà tương tự có thể được sử dụng để đảm bảo chuỗi không thay đổi kích thước.

(defun mode-line-fill (face reserve)
  "Return empty space using FACE and leaving RESERVE space on the right."
  (when
    (and window-system (eq 'right (get-scroll-bar-mode)))
    (setq reserve (- reserve 3)))
  (propertize " "
    'display
    `((space :align-to (- (+ right right-fringe right-margin) ,reserve)))
    'face face
    )
  )

(setq-default
  mode-line-format
  (list
    ;; left align
    "%e %b [%*]"
    ;; right align
    (mode-line-fill 'mode-line 18)
    "%6l, %4c, %8p"
    )
  )
)

Ví dụ:

CMakeLists.txt [-] 1590, 0, 94%

Lưu ý rằng điều này chỉ hoạt động tốt nếu bạn muốn hiển thị một vài mục ở phía bên tay phải, như với ví dụ này - dòng / cột / phần trăm. Hiển thị tất cả các chế độ nhỏ, ví dụ như sẽ không hoạt động tốt.

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.