Bagaimana cara meluruskan beberapa item dalam modeline?

9

Diberikan konfigurasi modeline berikut:

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

Saya ingin item terakhir muncul lurus.

mkaito
sumber
1
Berikut ini tautan ke utas terkait: stackoverflow.com/q/16775855/2112489
lawlist
1
Karena Anda meminta spesifik mode-line-formatini bukan jawaban yang tepat, tetapi smart-mode-linebenar-meluruskan mode-line-misc-infosecara default, dan dapat benar-menyelaraskan daftar minor-mode dengan menetapkan sml/mode-widthuntuk 'right.
Malabarba

Jawaban:

11

Seperti jawaban dalam komentar, Anda dapat melakukannya sendiri dengan menulis kode untuk mengembalikan string dengan spasi yang baik.

Ini adalah cara sederhana yang hanya mendukung teks rata kiri dan kanan yang diterapkan pada spesifikasi Anda.

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

itu akhirnya tampak seperti ini: masukkan deskripsi gambar di sini

Juga perhatikan, saya menggunakan args mode-line-format Anda seperti yang Anda tentukan, tapi saya yakin Anda menggunakan% i salah, yang mencetak ukuran byte buffer, bukan jumlah baris. Anda dapat menggunakan sesuatu seperti (line-number-at-pos (point-max))untuk mendapatkan jumlah baris di buffer Anda.

Jordon Biondo
sumber
Satu tambahan - yang perlu Anda gunakan window-total-widthuntuk menghitung juga linum dan pinggiran bantalan tambahan.
sandric
Jawaban ini memiliki bug di mana ada mode-line yang dikembalikan akan dievaluasi kembali sebagai mode-line. %Karakter yang berarti akan berusaha diformat dua kali. Menyumbang ini dalam jawaban saya, emacs.stackexchange.com/a/37270/2418 - juga menggunakan window-total-width(terima kasih!)
ideasman42
Mengatasi
ideasman42
2

Untuk memperluas jawaban @ jordon-biondo dan menyelesaikan tampilan bug %.

Contoh ini menunjukkan bagaimana variabel garis mode mode dapat digunakan dengan penyelarasan - yang membutuhkan waktu beberapa saat untuk mencari tahu.

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

Contoh output:

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

gagasanman42
sumber
0

Ini tidak didukung di luar kotak tetapi smart-mode-linepaket mendukungnya. Anda bisa menggunakan paket itu, atau jika ia melakukan lebih dari yang Anda inginkan, ekstrak hanya bit yang mengimplementasikan fitur yang Anda minta.

tarsius
sumber
Karena op tidak menindaklanjuti, saya telah mengubah komentar @ Malabarba menjadi jawaban. Dengan cara ini pertanyaannya bukan "tidak dijawab" dan paket ini mungkin sangat baik untuk apa yang ingin digunakan oleh pengguna lain.
tarsius
Itulah yang akhirnya saya lakukan, mengekstraksi fungsionalitas yang relevan dari smart-mode-linedan menambahkannya ke dotemacs saya. Itu mengharuskan saya mencari tahu seberapa banyak ruang yang saya inginkan di sebelah kanan, tetapi lebih baik daripada tidak sama sekali. Kecuali jika seseorang memposting cara untuk menghilangkan penghitungan char manual, saya tidak akan menerima jawaban.
mkaito
0

Sementara itu mungkin untuk melakukan perataan kiri / kanan yang benar 'menambahkan metode alternatif karena sepenuhnya mengevaluasi kiri dan kanan hanya untuk perataan sedikit berat, ketika ada alternatif yang lebih sederhana.

Jika Anda tahu Anda hanya membutuhkan jumlah ruang yang tetap di sebelah kanan, Anda dapat mengisi semua kecuali N karakter, ini berfungsi selama ukuran yang tepat adalah panjang yang tetap.

Pemformatan string %12sdan sejenisnya dapat digunakan untuk memastikan string tidak mengubah ukuran.

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

Misalnya:

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

Perhatikan bahwa ini hanya berfungsi dengan baik jika Anda ingin menampilkan beberapa item di sisi kanan, seperti contoh ini - baris / kolom / persentase. Menampilkan semua mode minor untuk mis. Tidak akan berfungsi dengan baik.

gagasanman42
sumber