Como alinhar à direita alguns itens na modelagem?

9

Dada a seguinte configuração de modelo:

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

Gostaria que o último item aparecesse alinhado à direita.

mkaito
fonte
11
Aqui está um link para um segmento relacionado: stackoverflow.com/q/16775855/2112489
lawlist
11
Como você solicitou uma mode-line-formatresposta específica, essa não é uma resposta adequada, mas smart-mode-linealinha à direita mode-line-misc-infopor padrão e pode alinhar à lista de modos secundários à direita, definindo sml/mode-widthcomo 'right.
Malabarba

Respostas:

11

Como a resposta nos comentários, você pode fazer isso sozinho escrevendo código para retornar uma string bem espaçada.

Aqui está uma maneira simples que suporta apenas o texto alinhado à esquerda e à direita aplicado às suas especificações.

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

acaba ficando assim: insira a descrição da imagem aqui

Observe também que usei os argumentos do modo de linha de modo conforme você especificou, mas acredito que você esteja usando% i incorretamente, o que imprime o tamanho de byte do buffer, não o número de linhas. Você pode usar algo como (line-number-at-pos (point-max))para obter o número de linhas no seu buffer.

Jordon Biondo
fonte
Uma adição - você precisa usar window-total-widthpara calcular também linum e franjas de almofadas adicionais.
Sandric
Esta resposta possui um erro no qual a linha de modo retornada será avaliada novamente como uma linha de modo. %Caracteres significantes tentarão ser formatados duas vezes. Responsável por isso na minha resposta, emacs.stackexchange.com/a/37270/2418 - também usar window-total-width(graças!)
ideasman42
Resolvido o bug nesta resposta: emacs.stackexchange.com/a/37270/2418
ideasman42
2

Para expandir a resposta de @jordon-biondo e resolver uma exibição de bug %.

Este exemplo mostra como as variáveis ​​de linha de modo de modo podem ser usadas com alinhamento - o que levou um tempo para descobrir.

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

Exemplo de saída:

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

ideasman42
fonte
0

Isso não é suportado imediatamente, mas o smart-mode-linepacote suporta isso. Você pode usar esse pacote ou, se ele fizer mais do que você deseja, extrair apenas os bits que implementam o recurso que você está solicitando.

tarso
fonte
Como a operação não deu seguimento, transformei o comentário de @ Malabarba em uma resposta. Dessa forma, a pergunta não é "sem resposta" e esse pacote pode muito bem ser o que outros usuários com a mesma pergunta gostariam de usar.
tarsius 18/01/15
Foi o que acabei fazendo, extraindo a funcionalidade relevante smart-mode-linee adicionando-a às minhas dotemacs. Isso exige que eu descubra quanto espaço quero à direita, mas é melhor que nada. A menos que alguém poste uma maneira de se livrar da contagem manual de caracteres, eu não aceitarei uma resposta.
mkaito
0

Embora seja possível fazer o alinhamento esquerdo / direito 'correto', adicione um método alternativo, porque avaliar completamente a esquerda e a direita apenas para o alinhamento é um pouco pesado, quando existe uma alternativa mais simples.

Se você souber que precisa apenas de uma quantidade fixa de espaço à direita, poderá preencher todos os caracteres, exceto N , isso funcionará desde que o tamanho certo seja um comprimento fixo.

Formatação de string %12se similares podem ser usados ​​para garantir que a string não seja redimensionada.

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

Por exemplo:

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

Observe que isso só funciona bem se você deseja exibir alguns itens no lado direito, como neste exemplo - linha / coluna / porcentagem. Mostrar todos os modos menores para, por exemplo, não funcionaria bem.

ideasman42
fonte