วิธีการจัดแนวรายการบางอย่างในแบบจำลองใช่ไหม?


9

รับการกำหนดค่า modeline ดังต่อไปนี้:

(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

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

มันจบลงด้วยการมีลักษณะเช่นนี้: ป้อนคำอธิบายรูปภาพที่นี่

โปรดทราบว่าฉันใช้รูปแบบบรรทัดรูปแบบของคุณตามที่คุณระบุ แต่ฉันเชื่อว่าคุณกำลังใช้% i ไม่ถูกต้องซึ่งพิมพ์ขนาดไบต์ของบัฟเฟอร์ไม่ใช่จำนวนบรรทัด คุณสามารถใช้สิ่งที่ต้องการ(line-number-at-pos (point-max))รับจำนวนบรรทัดในบัฟเฟอร์ของคุณ


นอกจากนี้หนึ่ง - คุณต้องใช้window-total-widthในการคำนวณยัง linum และขอบเพิ่มเติม paddings
sandric

คำตอบนี้มีข้อบกพร่องที่มีบรรทัดโหมดที่ส่งคืนจะถูกประเมินอีกครั้งเป็นโหมดบรรทัด %อักขระที่มีความหมายจะพยายามจัดรูปแบบสองครั้ง บัญชีนี้ในคำตอบของฉันemacs.stackexchange.com/a/37270/2418 - ใช้window-total-width(ขอบคุณ!)
คิด man42 42

แก้ไขข้อผิดพลาดในคำตอบนี้: 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และเพิ่มลงใน dotemac ของฉัน มันทำให้ฉันต้องหาว่าฉันต้องการพื้นที่ด้านขวาเท่าไหร่ แต่ก็ดีกว่าไม่มีอะไรเลย แม้ว่าจะไม่มีใครโพสต์วิธีกำจัดการนับถ่านด้วยตนเองฉันจะไม่ยอมรับคำตอบ
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.