Comment aligner à droite certains éléments de la modélisation?

9

Étant donné la configuration de modeline suivante:

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

J'aimerais que le dernier élément apparaisse aligné à droite.

mkaito
la source
1
Voici un lien vers un fil de discussion connexe: stackoverflow.com/q/16775855/2112489
lawlist
1
Puisque vous avez demandé un spécifique, mode-line-formatce n'est pas une bonne réponse, mais smart-mode-linealigne le droit mode-line-misc-infopar défaut, et il peut aligner à droite la liste des modes mineurs en définissant sml/mode-widthsur 'right.
Malabarba

Réponses:

11

Comme la réponse dans les commentaires, vous pouvez le faire vous-même en écrivant du code pour renvoyer une chaîne bien espacée.

Voici un moyen simple qui prend en charge uniquement le texte aligné à gauche et à droite appliqué à vos spécifications.

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

cela finit par ressembler à ceci: entrez la description de l'image ici

Notez également que j'ai utilisé vos arguments de format de ligne de mode comme vous l'avez spécifié, mais je pense que vous utilisez incorrectement% i, ce qui affiche la taille en octets du tampon, pas le nombre de lignes. Vous pouvez utiliser quelque chose comme (line-number-at-pos (point-max))pour obtenir le nombre de lignes dans votre tampon.

Jordon Biondo
la source
Un ajout - vous devez utiliser window-total-widthpour calculer également le rembourrage supplémentaire du linum et des franges.
sandric
Cette réponse a un bogue où la ligne de mode renvoyée sera évaluée à nouveau en tant que ligne de mode. Les %caractères signifiant tenteront d'être formatés deux fois. Tenu compte de cela dans ma réponse, emacs.stackexchange.com/a/37270/2418 - utilisez également window-total-width(merci!)
ideasman42
Résolution du bogue dans cette réponse: emacs.stackexchange.com/a/37270/2418
ideasman42
2

Pour développer la réponse de @ jordon-biondo et résoudre un bug apparaissant %.

Cet exemple montre comment les variables de ligne en mode mode peuvent être utilisées avec l'alignement - ce qui m'a pris un certain temps à comprendre.

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

Exemple de sortie:

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

ideasman42
la source
0

Ce n'est pas pris en charge prêt à l'emploi, mais le smart-mode-linepackage le prend en charge. Vous pouvez soit utiliser ce package, ou s'il fait plus que ce que vous voulez, extraire uniquement les bits qui implémentent la fonctionnalité que vous demandez.

tarse
la source
Depuis l'op n'a pas suivi, j'ai transformé le commentaire de @ Malabarba en réponse. De cette façon, la question n'est pas "sans réponse" et ce package pourrait très bien être ce que d'autres utilisateurs ayant la même question voudraient utiliser.
tarsius
C'est ce que j'ai fini par faire, extraire les fonctionnalités pertinentes smart-mode-lineet les ajouter à mes dotemacs. Cela me demande de déterminer combien d'espace je veux à droite, mais c'est mieux que rien. À moins que quelqu'un ne poste un moyen de se débarrasser du comptage manuel des caractères, je n'accepterai pas de réponse, cependant.
mkaito
0

Bien qu'il soit possible de faire un alignement gauche / droite `` correct '', l'ajout d'une méthode alternative, car l'évaluation complète de la gauche et de la droite juste pour l'alignement est un peu lourd, lorsqu'il existe une alternative plus simple.

Si vous savez que vous n'avez besoin que d'un espace fixe à droite, vous pouvez remplir tous les caractères sauf N , cela fonctionne tant que la bonne taille est une longueur fixe.

Le formatage des chaînes %12set similaire peut être utilisé pour garantir que la chaîne ne se redimensionne pas.

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

Par exemple:

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

Notez que cela ne fonctionne bien que si vous souhaitez afficher quelques éléments sur le côté droit, comme dans cet exemple - ligne / colonne / pourcentage. Afficher tous les modes mineurs, par exemple, ne fonctionnerait pas bien.

ideasman42
la source