Visualizza l'elenco di parole nella parte inferiore del riquadro?


20

Vorrei visualizzare 3 elenchi di parole su righe separate orizzontalmente lungo la parte inferiore (anche se top funzionerebbe anche) di ogni frame di emacs che ho aperto. Ho pensato a 6 modi per farlo, e tutti hanno problemi:

  1. Il mio primo pensiero è stato quello di aggiungere una linea alla mia linea di modalità, ma AFAICT non puoi usare il carattere di nuova riga in una linea di modalità, viene semplicemente convertito in "^ J".

  2. Il mio secondo pensiero è stato quello di avere la linea nella parte superiore dello schermo e usare la linea di intestazione, ma non supporta nemmeno il carattere di nuova riga.

  3. Potrei visualizzare una sovrapposizione sopra le ultime 3 righe della finestra, ma rendere questo robusto sembra difficile: lo scorrimento dovrebbe essere attivato quando il punto raggiunge la sovrapposizione anziché la fine reale della finestra, e dovrei riposizionare costantemente la sovrapposizione poiché le sovrapposizioni sono nello spazio di testo e non nello spazio della finestra.

  4. Potrei provare a creare finestre dedicate nella parte inferiore della cornice. Ho provato a codificarlo, ma non è nemmeno molto robusto, non sembra funzionare bene quando un frame contiene già finestre divise e ho dovuto ricollegare Cx, 1 a una versione personalizzata di delete-other-windows che ignora le mie finestre speciali e sono sicuro che ci sono altri casi d'angolo. Inoltre, quando una finestra di aiuto si apre ora si apre verticalmente perché pensa che ci sia già una divisione orizzontale (che tecnicamente c'è ma è solo per visualizzare una finestra di una riga).

  5. Potrei avere un frame dedicato per questo, ma poi la mia configurazione non funzionerà in modalità terminale e dovrei scriptare il mio gestore di finestre per gestirlo mantenendolo nella parte inferiore dello schermo, rendendolo non selezionabile, senza influire sul layout, ecc ecc.

  6. Potrei inserire il testo per le 3 righe direttamente nel minibuffer. L'ho parzialmente funzionato, posso far crescere il minibuffer per accogliere le 3 linee e posso visualizzarle. Tuttavia, ogni volta che viene riprodotto un messaggio, le righe scompaiono fino a quando non emetto un altro comando, a quel punto riappaiono. Idealmente le 3 linee e l'area dell'eco non si sovrappongono, così potrei vedere entrambe. Ciò sarebbe meno fastidioso se potessi filtrare in modo affidabile quali messaggi vanno nell'area di eco - ho trovato una soluzione su EmacsWiki ma non sembra funzionare per i messaggi che hanno origine nella sorgente C di emacs (in particolare mi piacerebbe ottenere sbarazzarsi dei file salvando i messaggi perché mi salva spesso su un timer).

Per il contesto, il mio obiettivo è quello di avere costantemente una visualizzazione delle parole utilizzate più frequentemente nel buffer corrente, le parole punto più vicino nel buffer corrente e le parole utilizzate più di recente nel buffer corrente. Intendo essere in grado di inserirli nel buffer tramite comandi vocali. Quindi potrei dire "2 più vicini" e farlo scegliere il secondo elemento dall'elenco di parole punto più vicino e inserirlo. Mi interessa solo che gli elenchi di parole siano visibili per qualsiasi buffer che sto attualmente modificando. Non voglio usare le finestre pop-up usate dalle varie modalità di completamento del codice perché ho bisogno che gli elenchi siano sempre visibili.


Bella domanda e ben posata. Spero che tu abbia dei suggerimenti utili.
Disegnato il

Mi chiedo le altre parti del numero 5, oltre alla necessità della modalità terminale (che è importante). È possibile utilizzare una cornice dedicata posizionata nella parte inferiore (nessun problema). Cosa intendi per non selezionabile e perché ne hai bisogno? Se vuoi dire di sola lettura, anche questo non è un problema. Cosa intendi per non influire sul layout ? Insomma, # 5 non è troppo chiaro per me.
Estratto il

@Drew: Voglio dire che guido il mio WM usando la tastiera, ed è improbabile che io abbia mai voluto focalizzare lo scopo su quel frame, quindi vorrei che i miei binding della finestra successiva / della finestra precedente lo ignorassero. Allo stesso modo vorrei che i layout delle finestre si comportassero come se quella cornice fosse solo parte di un pannello / barra delle applicazioni. Modifica: ovunque in questo commento ho detto 'finestra' intendo X window, non emacs window; p
Joseph Garvin,

Un'altra possibilità che mi è stata suggerita è di usare il minibuffer. Non ho idea se è possibile visualizzare passivamente il testo laggiù senza che interferisca con tutto il resto cercando di usarlo però ...
Joseph Garvin,

Aggiunta di una nota sul tentativo di utilizzare il minibuffer.
Joseph Garvin,

Risposte:


8

Con molta sperimentazione sfrenata sono stato in grado di portare il numero 6 (usando il testo del minibuffer) ad uno stato di lavoro "abbastanza buono". Ecco uno screenshot:

Schermata della cintura in azione

Esistono diverse parti chiave per farlo funzionare:

  • L'inserimento di testo nel minibuffer sorprendentemente quasi fa la cosa giusta fuori dalla scatola. Il testo inserito verrà effettivamente visualizzato.
  • Rendendo il testo la 'stringa successiva di un overlay invece del testo normale, lo rendi non selezionabile e non devi preoccuparti che il cursore vi acceda accidentalmente.
  • Per far funzionare correttamente i comandi di richiesta del minibuffer, è necessario inibire l'inserimento del testo / overlay quando la finestra del minibuffer è attiva.
  • Se si tenta di ridimensionare il minibuffer con le normali funzioni di ridimensionamento delle finestre, si otterranno errori su finestre troppo piccole, se si utilizza la funzione md-resize-minibuf non documentata, è possibile ridimensionare al numero esatto di righe desiderato, purché si ho impostato prima resize-mini-windows a zero.
  • Per risolvere gli elenchi che scompaiono ogni volta che è presente un messaggio, è necessario avvisare la funzione di intercettazione dei messaggi. Quindi li inserirai tu stesso nel minibuffer. Devi anche guardare la variabile del messaggio corrente, che memorizza tutto ciò che è stato mostrato per ultimo nell'area dell'eco (sorprendentemente l'area dell'eco e il minibuffer sono tecnicamente distinti e alcune funzioni del codice sorgente C vengono stampate direttamente nell'area dell'eco senza passare attraverso il messaggio funzione). Il codice che fornisco di seguito per questo è imperfetto, i messaggi persistono più a lungo di quanto normalmente dovrei indagare (controllare l'ultima voce in * Messaggi * potrebbe essere più semplice e più affidabile) ma per ora è 'abbastanza buono'.

Ecco un link alla mia implementazione con una cintura di esempio che mostra l'anello di uccisione. Alla fine questo farà parte di un progetto adeguato: https://gist.github.com/jgarvin/ce37d08654978fd7e4c9

Questa è la prima volta che scrivo qualsiasi quantità significativa di elisp, quindi la qualità è probabilmente scadente, ma funziona.


1

Sfortunatamente, né la riga di modalità né la riga di intestazione possono essere più righe. Ho chiesto prima di questo e non c'è (almeno non c'era) alcuna opzione nascosta per farlo funzionare. Quindi 1 e 2 sono fuori. Sento anche che 3 e 6 sono hack che non ti renderanno felice a lungo termine. 3 e 4 sembrano ottimi approcci, ma farli funzionare in modo affidabile sarà piuttosto un investimento.

Quindi ti consiglio di farlo prima su emacs-devel . Nella mia esperienza, alla fine le cose vengono implementate se ti preoccupi di spiegare attentamente cosa vuoi e perché è una buona cosa. Potrebbe volerci un po 'di tempo, almeno fino alla prossima versione, ma se stai aspettando un po' o usando la versione di sviluppo, allora potresti ottenere esattamente quello che vuoi, con molto meno sforzo.


Grazie per il suggerimento di contattare emacs-devel. Anche se ho trovato una soluzione, era piuttosto confuso e sarebbe bello avere un'API reale per disegnare direttamente sulle coordinate dello schermo, quindi quando avrò il tempo probabilmente farò una e-mail a modo loro.
Joseph Garvin,
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.