Modelindeki bazı öğeleri nasıl doğru hizalayabilirim?


9

Aşağıdaki model konfigürasyonu göz önüne alındığında:

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

Son öğenin sağa hizalı görünmesini istiyorum.


1
İlgili bir iş parçacığının bağlantısı: stackoverflow.com/q/16775855/2112489
lawlist

1
Bir özgü istedi beri mode-line-formatbu doğru bir cevap değil, ama smart-mode-linesağ hizalar mode-line-misc-infovarsayılan olarak ve ayarlayarak minör-modları listesini sağ hizalayabilirsiniz sml/mode-widthiçin 'right.
Malabarba

Yanıtlar:


11

Yorumlardaki cevap gibi, güzel aralıklı bir dize döndürmek için kod yazarak bunu kendiniz yapabilirsiniz.

Özelliklerinize yalnızca sola ve sağa hizalanmış metni destekleyen basit bir yol.

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

şöyle görünür: resim açıklamasını buraya girin

Ayrıca, belirttiğiniz gibi mod satırı biçimi argümanlarınızı kullandım, ancak% i yanlış kullandığınıza inanıyorum, satır sayısını değil tamponun bayt boyutunu yazdırıyor. Tamponuzdaki (line-number-at-pos (point-max))satır sayısını elde etmek gibi bir şey kullanabilirsiniz .


Bir ek - window-total-widthayrıca linum ve saçakların ek dolgularını hesaplamak için kullanmanız gerekir .
sandric

Bu yanıtta, döndürülen mod hattının tekrar mod hattı olarak değerlendirileceği bir hata var. Anlam %karakterleri iki kez biçimlendirilmeye çalışılacaktır. Cevabımda bunu açıkladı , emacs.stackexchange.com/a/37270/2418 - ayrıca kullanın window-total-width(teşekkürler!)
ideasman42

Bu cevaptaki hatayı çözdük
ideasman42

2

@ Jordon-biondo'nun cevabını genişletmek ve gösterilen bir hatayı çözmek için %.

Bu örnekte, mod modu satır değişkenlerinin hizalama ile nasıl kullanılabileceği gösterilmektedir - bu da anlaması biraz zaman aldı.

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

Örnek çıktı:

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


0

Kutudan çıktığı anda desteklenmiyor ancak smart-mode-linepaket bunu destekliyor. Bu paketi kullanabilir veya istediğinizden fazlasını yaparsa, yalnızca istediğiniz özelliği uygulayan bitleri ayıklayabilirsiniz.


Operasyon takip etmediğinden, @ Malabarba'nın yorumunu bir cevaba dönüştürdüm. Bu şekilde soru "yanıtlanmamış" değildir ve bu paket aynı soruyu taşıyan diğer kullanıcıların kullanmak istediği şey olabilir.
tarsius

smart-mode-lineSonunda bunu yaptım , ilgili işlevselliği çıkardım ve dotemac'larıma ekledim. Sağda ne kadar yer istediğimi bulmamı gerektiriyor, ama hiçbir şeyden daha iyi. Birisi manuel karakter sayımından kurtulmanın bir yolunu göndermediği sürece, bir yanıtı kabul etmeyeceğim.
mkaito

0

Sol ve sağ hizalamayı sadece hizalama için tam olarak değerlendirmek daha basit bir alternatif olduğunda biraz ağır olduğundan, alternatif bir yöntem ekleyerek sol / sağ hizalamayı 'düzeltmek' mümkün olsa da.

Yalnızca sağda sabit bir alana ihtiyacınız olduğunu biliyorsanız, N karakterleri hariç tümünü doldurabilirsiniz , bu doğru boyut sabit bir uzunluk olduğu sürece çalışır.

Dizenin %12syeniden boyutlandırılmamasını sağlamak için dize biçimlendirmesi ve benzeri kullanılabilir.

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

Örneğin:

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

Bunun yalnızca bu örnekte olduğu gibi sağ tarafta birkaç öğe görüntülemek istiyorsanız iyi çalıştığını unutmayın - satır / sütun / yüzde. Örneğin tüm küçük modları göstermek işe yaramaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.