모델에서 일부 항목을 올바르게 정렬하는 방법은 무엇입니까?


9

다음과 같은 모델 구성이 제공됩니다.

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

마지막 항목이 오른쪽 정렬로 나타나기를 원합니다.


1
관련 스레드에 대한 링크는 다음과 같습니다. stackoverflow.com/q/16775855/2112489
lawlist December

1
특정 요구하기 때문에 mode-line-format이 적절한 대답이 아니라 smart-mode-line오른쪽 맞 춥니 다 mode-line-misc-info기본적으로, 그것은 설정하여 마이너 모드 목록을 마우스 오른쪽 버튼으로 정렬 할 수 있습니다 sml/mode-width'right.
Malabarba

답변:


11

주석의 대답과 같이 간격이 좋은 문자열을 반환하는 코드를 작성하여 직접 수행 할 수 있습니다.

다음은 사양에 적용된 왼쪽 및 오른쪽 정렬 텍스트 만 지원하는 간단한 방법입니다.

;; 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")))))

다음과 같이 보입니다. 여기에 이미지 설명을 입력하십시오

또한 지정한대로 mode-line-format args를 사용했지만 줄 수가 아닌 버퍼의 바이트 크기를 인쇄하는 % i를 잘못 사용하고 있다고 생각합니다. (line-number-at-pos (point-max))버퍼의 줄 수를 얻는 것과 같은 것을 사용할 수 있습니다 .


하나의 추가- window-total-width리듬을 계산하고 추가 패딩을 프린지하는 데 사용해야 합니다.
sandric

이 답변에는 반환 된 모드 라인이 모드 라인으로 다시 평가되는 버그가 있습니다. 의미 %문자는 두 번 형식화를 시도합니다. 내 대답에 이것을 설명 , emacs.stackexchange.com/a/37270/2418- 또한 사용 window-total-width(감사합니다!)
ideasman42

:이 답변의 버그 해결 emacs.stackexchange.com/a/37270/2418
ideasman42

2

@ jordon-biondo의 답변을 확장하고을 보여주는 버그를 해결하십시오 %.

이 예제는 모드 모드 라인 변수를 정렬과 함께 사용하는 방법을 보여줍니다.

(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))
        )
      )
    )
  )
)

출력 예 :

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


0

이것은 기본적으로 지원되지 않지만 smart-mode-line패키지는이를 지원합니다. 해당 패키지를 사용하거나 원하는 것 이상을 수행하는 경우 원하는 기능을 구현하는 비트 만 추출하십시오.


op가 후속 조치를 취하지 않았기 때문에 @Malabarba의 의견을 답변으로 바 꾸었습니다. 이런 식으로 질문에 "답변"이없고이 패키지는 같은 질문을 가진 다른 사용자가 사용하고 싶을 수도 있습니다.
tarsius

그것이 내가 끝낸 일이며 관련 기능을 추출하여 smart-mode-line내 dotemacs에 추가합니다. 내가 원하는 공간의 양을 파악해야하지만 아무것도 아닌 것보다 낫습니다. 누군가가 수동 문자 계산을 제거하는 방법을 게시하지 않으면 대답을 받아들이지 않습니다.
mkaito

0

더 간단한 대안이있을 때 정렬을 위해서만 왼쪽과 오른쪽을 완전히 평가하는 것이 약간 무겁기 때문에 대체 방법을 추가하여 '올바른'왼쪽 / 오른쪽 정렬을 수행 할 수 있습니다.

오른쪽에 고정 된 공간 만 필요하다는 것을 알고 있다면 N 자를 제외한 모든 문자를 채울 수 있습니다 . 올바른 크기가 고정 된 길이 인 한 작동합니다.

문자열의 %12s크기가 조정되지 않도록 문자열 형식 지정 및 이와 유사한 기능을 사용할 수 있습니다.

(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"
    )
  )
)

예 :

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

이 예는 선 / 열 / 백분율과 같이 오른쪽에 몇 가지 항목을 표시하려는 경우에만 잘 작동합니다. 예를 들어 모든 부 모드를 표시하면 제대로 작동하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.