Utilizzare un'area di eco vuota per visualizzare informazioni


10

L'area dell'eco è vuota per la maggior parte del tempo, il che mi fa pensare che potrei usarla per visualizzare alcune informazioni. Ad esempio, org-clockvisualizza l'attività corrente, il tempo rimanente e il tempo totale trascorso sulla modeline. Questa informazione non è davvero leggibile lì (la modeline può essere piuttosto breve), viene ripetuta su ogni modeline (perché si applica all'intera sessione di emacs) e non è così utile che sono disposto a sacrificare un prezioso spazio di modeline per esso . D'altra parte, potrebbe apparire nell'area dell'eco quando non c'è nient'altro da visualizzare qui.

C'è un modo canonico per raggiungere questo obiettivo? Ho pensato di hackerare una funzione di inserimento minibuffer-inactive-mode-hook(ma non funziona in modo affidabile, ad esempio il messaggio scompare non appena l'area di eco viene riutilizzata) o di spamming di messaggi non registrati (ma questo sarà un casino con altri usi di l'area dell'eco e il minibuffer).

Una versione povera di questo userebbe i timer inattivi, ma l'area dell'eco può essere vuota senza che emacs sia inattivo (ad esempio quando si inserisce del testo).


1
L'area di eco visualizzata è il contenuto di `* Echo Area 0 *` o `* Echo Area 1 *` e questi sono buffer "normali". Dovrebbe essere possibile patchare Emacs in modo da fornire forse un hook run ogni volta che questi buffer vengono "svuotati" (o visualizzati e vuoti), in modo che questa funzionalità possa essere implementata in modo efficiente e affidabile.
Stefan,

Non è esattamente quello che hai in mente, ma Bastien Guerry ha fatto alcune cose interessanti per salvare la proprietà dello schermo soprattutto con la visualizzazione della linea di modalità nel titolo del fotogramma: bzg.fr/emacs-strip-tease.html
Dieter.Wilhelm

Risposte:


4

Un commento su questa domanda menziona che un pacchetto chiamato symon si avvale di tale funzione.

Si ottiene spamming di messaggi non registrati quando il minibuffer è inattivo e interrompendo la visualizzazione ogni volta che viene emesso un comando. Il bollettino è piuttosto breve, e dopo alcuni minuti di utilizzo, non ho potuto notare alcun problema: l'utilizzo dei messaggi e del minibuffer ha ancora la priorità sui messaggi.

I componenti chiave sono:

  • una funzione di visualizzazione, eseguita su un timer di inattività (chiama il messaggio con message-log-maximpostato su nil, in modo che la stringa visualizzata non entri nel *Messages*buffer)
  • una funzione di visualizzazione, eseguita su un timer
  • una funzione per arrestare il display, eseguire pre-command-hook

L'unico problema è che la visualizzazione viene interrotta ogni volta che viene eseguito un comando, incluso durante la digitazione.

Per chi fosse interessato, ho estratto il codice pertinente in un pacchetto boilerplate disponibile su github .


1

La risposta, IMO, è no . L'area di eco è per i messaggi effimeri . E molte cose cancellano esplicitamente tutto ciò che avrebbe potuto fare eco lì. Quindi realizzare ciò che richiedi in modo ragionevole è problematico, IMO.

Insomma, usa un'alternativa. Eccotene alcune:

  1. Utilizzare un altro buffer (ad es. Una piccola cornice o una finestra che si tiene aperta a tale scopo). Semplice da fare, puoi spostarlo, modificarlo, cancellarlo o fare qualsiasi altra cosa ti piaccia.

  2. Usa parte o tutta la linea di modalità (che hai già considerato, apparentemente).

  3. Usa una riga di intestazione.

  4. Usa un titolo per la cornice.

Se fossi in me, probabilmente sceglierei il n. 1. (Ma in realtà non voglio / ho bisogno di una tale visualizzazione a tempo pieno delle informazioni sullo stato. Definirei molto probabilmente un comando che mi mostra le informazioni (anche una cronologia / registro) su richiesta.)


Aggiornato dopo i tuoi commenti:

Hai già detto, nella tua domanda, " il messaggio scompare non appena l'area di eco viene riutilizzata ". Quindi sembrava che usare uno spazio così effimero come l'area dell'eco non si adattasse alle tue esigenze. Le tue risposte al commento sembrano contraddire questo.

Se vuoi davvero usare l'area dell'eco, usa minibuffer-inactive-mode-hook, come hai già detto, o usa un timer per chiamare messageo per inserire il messaggio orario nell'area dell'eco in qualche altro modo. Tuttavia, hai già notato i problemi con questo. Tali problemi (sovrascrittura, cancellazione) derivano dalla natura ( prevista ) effimera dell'area dell'eco .

In breve, si desidera utilizzare un'area destinata ai messaggi effimeri, ma non si desidera che i messaggi scompaiano non appena tale area viene riutilizzata.

(A proposito, scrivi che le informazioni sulla linea di modalità sono ripetute in ogni linea di modalità: non è necessario che sia così. Puoi rendere la linea di modalità specifica per un particolare buffer ecc. IOW, puoi scegliere una linea di modalità per sempre (o periodicamente) mostra l'orologio o altro.)


Grazie per i vostri suggerimenti! Innanzitutto, però, non capisco bene, perché è problematico? Vorrei cose che andrebbero nell'area atmo dell'eco per sovrascrivere qualsiasi altro uso dell'area dell'eco, quindi cancellare è OK. E le informazioni extra dovrebbero essere visualizzate solo quando l'area dell'eco è vuota, quindi non c'è nulla da cancellare. Non suona come una specifica ragionevole? Circa # 1, il problema è che non voglio sprecare spazio sullo schermo. L'area dell'eco è sempre presente, anche quando è vuota. Ho elencato alcuni problemi con # 2 e # 3 e # 4 condividono molti di questi problemi.
T. Verron,

Sul motivo per cui voglio la visualizzazione a tempo pieno delle informazioni, prendiamo ad esempio l' org-clockesempio della domanda: voglio che il timer ticchetti per ricordarmi cosa dovrei fare e che dovrei farlo proprio ora , come il più spesso possibile.
T. Verron,

"il messaggio scompare non appena l'area di eco viene riutilizzata" Ok non era chiaro. Quello che volevo dire era che se uso minibuffer-inactive-mode-hooked esco dal minibuffer, il messaggio mostra. Quindi se qualche altro comando stampa qualcosa nell'area dell'eco, questo nuovo messaggio viene aggiunto e il messaggio effimero non ritorna (perché il minibuffer non è stato coinvolto questa volta).
T. Verron,

Riguardo alla modeline, il problema principale è il piccolo spazio disponibile lì (ho spesso molte finestre, divise in orizzontale, quindi modelle molto brevi).
T. Verron,

Ancora una volta - " Riassumendo, si desidera utilizzare un'area destinata ai messaggi effimeri, ma non si desidera che i messaggi scompaiano non appena tale area viene riutilizzata. " Utilizzare un timer con messageo post-command-hook, se lo si desidera. Ma il problema essenziale della scomparsa / sovrascrittura a volte alzerà la testa, perché stai cercando di utilizzare un'area di visualizzazione temporanea per qualcosa che non vuoi essere temporaneo.
Drew
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.