Mostrar algo na linha de modo ativo em vez de todas as linhas de modo

10

Eu configurei um indicador de org-timer na linha de modo com isso.

(setq-default
 mode-line-format
 (quote
  (
   ;; org-timer
   (:eval
    (unless (not org-timer-countdown-timer)
      (propertize (let* ((rtime (decode-time
                                 (time-subtract
                                  (timer--time org-timer-countdown-timer)
                                  (current-time))))
                         (rmins (nth 1 rtime))
                         (rsecs (nth 0 rtime)))
                    (format "🕔 %d:%d" rmins rsecs))
                  'face '(:foreground "cyan" :weight bold)
                  'help-echo "org-timer")))

   )))

Desejo que este indicador do org-timer seja mostrado apenas na linha de modo ativo , em vez de todas as linhas de modo. Como fazer isso?

stardiviner
fonte
@lawlist Não consegue entender o seu código. Não sei como aplicar no meu caso.
Stardiviner 13/08/16
11
O redisplaymecanismo é capaz de verificar cada janela em determinadas circunstâncias (por exemplo, quando a linha de modo é atualizada naturalmente ou quando é forçada a atualizar). Quando o mode-line-formatcontém a função (selected-window), uma janela diferente será retornada quando o reexibir visitar as várias janelas. Esse valor pode ser comparado com um valor pré-gravado - por exemplo, o post-command-hookpode ser usado para registrar o último conhecido selected-windowe esse valor pode ser comparado posteriormente com uma função dentro do mode-line-format. Então, eu uso o PCH para gravar / armazenar o selected-window.
lawlist
@lawlist Verifiquei o seu código, mas não encontrei uso geral para o meu caso. Se eu mudar para outra coisa em vez de org-timer. O que devo fazer? Espero uma maneira mais geral. Até isso me inspirou. Você pode me dar um exemplo de código mais exato? Porque achei o conjunto diferente 'face, mas preciso alterar a string de exibição.
Stardiviner 17/08/16
Eu não tentei isso, mas esta questão é semelhante a esta: emacs.stackexchange.com/q/13842/115
Kaushal Modi

Respostas:

7

No exemplo a seguir, a palavra “ATIVO” aparecerá na linha de modo da janela que está ativa e todas as outras janelas exibirão a palavra “INATIVO” na linha de modo.

Certifique-se de tentar este exemplo com emacs -Qpara verificar se funciona como anunciado. Depois disso, personalize-o conforme necessário.

Adicione ganchos adicionais conforme necessário para ligar ml-update-all.

(defvar ml-selected-window nil)

(defun ml-record-selected-window ()
  (setq ml-selected-window (selected-window)))

(defun ml-update-all ()
  (force-mode-line-update t))

(add-hook 'post-command-hook 'ml-record-selected-window)

(add-hook 'buffer-list-update-hook 'ml-update-all)

(setq-default mode-line-format
  '(:eval
      (if (eq ml-selected-window (selected-window))
        "ACTIVE"
        "INACTIVE")))
lista de leis
fonte