Come posso dividere il paragrafo in una riga per frase, ma comunque mantenerlo avvolto visivamente?


14

Questo è simile alla modifica dei file con una frase per riga (sia nella funzione che nel motivo), ma desidero avere un paragrafo completo e scorrevole anziché interruzioni visive in ogni frase.

Vorrei avere una modalità minore che, quando attiva, unirà visivamente le linee dello stesso paragrafo (non separate da \n\no paragraph-separateo ...) e quindi attiverà un comportamento (forse derivato da visual-line-mode) che avvolgerà la linea senza effettivamente inserirla \n.

Esiste una tale modalità? In caso contrario, come farei per modificare il processo di visualizzazione di un paragrafo per ottenere il risultato? (Dopotutto, questo è il punto cruciale di una tale modalità e si potrebbe sviluppare dal frammento.)


[...] si unirà visivamente [...]. Intendi mantenere il sottostante \n(se presente) o vuoi che rimuova effettivamente le nuove righe per fornire 1 paragrafo per riga?
Jonathan Leech-Pepin,

1
Forse potresti usare il buffer-display-tableper far apparire le nuove righe \ncome qualcos'altro come spazi o qualcosa del genere: vedi il seguente esempio nel link: stackoverflow.com/a/24842771/2112489 Il vantaggio di questo sarebbe che il testo nel il documento non è modificato. La nuova linea può essere praticamente qualsiasi cosa, ad es. Una faccina sorridente, spazi, un simbolo di una trappola, ecc. L'effetto visivo è che si verificherà un avvolgimento.
elenco delle leggi

@ JonathanLeech-Pepin Voglio mantenere le nuove righe dove presenti. In effetti, vorrei forzare la nuova riga a fine frase, ma questo può essere fatto tramite un hook separato.
Sean Allred,

1
@lawlist l'effetto visivo è che le nuove linee saranno andate ovunque, no? Tutti i paragrafi non saranno raggruppati in uno solo?
Malabarba,

1
Sono d'accordo con questa richiesta, ma penso che la modalità minore descritta da OP non sia la soluzione corretta. Il problema di fondo è che diff non funziona bene per il testo poiché è stato progettato per il codice. Risolvere questo problema in Emacs è una soluzione possibile ma non pulita per vari motivi. Sarebbe molto meglio migliorare diff per lavorare bene con il testo.
tmalsburg,

Risposte:


3

Come ha detto Tom, mettere una proprietà di visualizzazione sulle newline sarà una specie di lavoro.

Il problema è capire quali linee avvolgere.

Ecco un esempio per iniziare:

(let ((eol-regexp "[[:graph:]] ?\\(\n\\)[^\t\n ]"))
  (font-lock-add-keywords nil
   `((,eol-regexp 1 '(face default display " ")))))

(visual-line-mode 1)

Questo "rimuoverà" le nuove righe se è preceduta da caratteri grafici e la riga successiva non è rientrata o vuota. Dovrai sperimentare per trovare qualcosa che funzioni per te.

Qualche spiegazione in più:

  1. font-lock-add-keywordsaggiunge un elenco di regole al blocco dei caratteri (quindi il blocco dei caratteri deve essere abilitato. Il primo argomento può essere una modalità (ad es. text-mode); nel nostro caso è zero, il che significa aggiungere la regola solo per il buffer corrente.
  2. La nostra "regola" è (,eol-regexp 1 '(face default display " ")). Il primo elemento è l'espressione regolare che abbiamo creato in precedenza; la seconda è la sottoespressione a cui siamo interessati; il terzo è la "faccia" che vogliamo applicare.
  3. Mentre l'uso di un volto per le nuove righe non è di alcuna utilità per noi, possiamo anche aggiungere proprietà di testo. Quindi usiamo la faccia di default e poi aggiungiamo una proprietà display che sostituisce la sottostringa 1 (cioè la nuova riga) con uno spazio.
  4. Se ti spari nel piede, elimina il buffer o rimuovi la parola chiave con font-lock-remove-keywords.
  5. Potresti anche voler aggiungere displaya font-lock-extra-managed-props(non ho provato questo).
  6. La parte difficile è ottenere la regexp giusta. "\ (\ n \) [^ \ n]" corrisponderebbe a qualsiasi nuova riga che non è immediatamente seguita da un'altra. ". \ {30, \} \ (\ n \)" corrisponderebbe solo alle nuove righe precedute da almeno 30 caratteri.

È possibile trovare un'implementazione di quanto sopra come pacchetto su github.com/andersjohansson/tex-fold-linebreaks
zakkak

0

Se capisco correttamente il problema, è che vorresti conservare tutte le nuove righe nel buffer così come sono; ma ti piacerebbe mostrarne alcuni come spazi. Quindi, ti piacerebbe il ritorno a capo automatico.

Per il ritorno a capo di parole penso che tu possa usare visual-line-mode.

Per gestire le newline, penso che potresti forse mettere una displayproprietà con " "(una stringa composta da un singolo spazio) come valore sulle newline che vuoi visualizzare in modo diverso.

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.