Modifica dei file con una frase per riga


28

Un po 'di sfondo.

Sto cercando di controllare la versione dei miei documenti in lattice e l'efficacia di questa iniziativa sarebbe notevolmente migliorata se adottassi un approccio a frase per riga .

Ad esempio, quanto segue sarà l'aspetto dei miei documenti.

Some text here.
New stencence on the same paragraph.
Some more text, still on the same paragraph.

This is another paragraph.

La mia domanda è semplice
Quanto posso automatizzare / migliorare con Emacs?

I seguenti due punti sono ciò che ho in mente.

  1. Le mie frasi sono lunghe , quindi ho bisogno di avvolgere le righe senza effettivamente riempirle. Cioè, una frase molto lunga deve essere visualizzata su più righe sul mio schermo, ma deve essere una singola riga nel file ".tex" . Questo sarebbe preferibilmente fatto in un modo che non avvolga le equazioni.

    visual-line-modeavvolge alla larghezza della finestra, che è troppo ampia. Ho bisogno di qualcosa che avvolga le linee e limiti la loro larghezza a circa 80 caratteri. Proprio come fill-paragraphfarebbe normalmente, ma senza effettivamente interrompere le linee nel file.

  2. Posso interrompere manualmente la riga dopo ogni frase, ma sarebbe altamente preferibile se potessi configurare fill-paragraph(o forse anche auto-fill-mode) inserire anche una frase per riga.

1
Che tipo di miglioramento / automazione cerchi esattamente? Vuoi sapere come modificare in modo efficace in file come questo?
Rangi Lin,

@RangiLin Sì. Il primo punto che ho citato è la cosa più importante per me. Ma qualsiasi altra cosa per renderlo più efficace è il benvenuto.
Malabarba,

La descrizione nel primo punto sembra visual-line-mode. Ma oltre a quella riga, devi anche inserire automaticamente un carattere di nuova riga dopo ogni frase, giusto?
Kaushal Modi,

@kaushalmodi Sì, ma la nuova riga dopo ogni frase è reale, dovrebbe essere nel file. Il problema con la modalità linea visiva è che è troppo largo per impostazione predefinita. Se c'è un modo per ridurlo, sarebbe fantastico.
Malabarba,

@Malabarba: sai perché? Per me è di gran lunga la modalità di avvolgimento più utile ...
Tikhon Jelvis,

Risposte:


11

Se vuoi qualcosa di simile visual-line-modema configurabile, puoi provare longlines-modequal è quello che uso per la maggior parte della mia prosa. longlines-modeavvolge il testo in modo simile a visual-line-modecon la larghezza configurata da fill-column.

Ecco uno screenshot con fill-columnimpostato su 70(la finestra in realtà si estende ancora di più a destra).

Un esempio di testo a capo in modalità palangari.

Configurare fill-paragraphsarebbe pulito, ma non sono sicuro di come farlo. Invece, ecco un ragionevole hack temporaneo: rendi il tuo .personaggio elettrico in modalità TeX, inserendo una nuova riga. Ciò implica semplicemente il suo rebinding in qualunque sia il gancio della modalità appropriata:

(defun my-electric-dot ()
  (interactive)
  (insert ".\n"))
(defun my-tex-hook ()
  (local-set-key (kbd ".") 'my-electric-dot))
(add-hook 'TeX-mode-hook 'my-tex-hook)

1
Grazie mille per aver sottolineato la modalità palangari! Sono riuscito a convincerlo a non avvolgere le equazioni e persino a correggere l'aspetto delle linee rientrate. Ecco il gist gist.github.com/c532f77144ddf86b4ea4.git
Malabarba

@Malabarba: Cool. Probabilmente userò alcune di queste modifiche da solo! Tuttavia, il tuo link non funziona correttamente; ecco una versione web-friendly: gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4
Tikhon Jelvis

Grazie. Inoltre, ho dimenticato di menzionare che i consigli utilizzano una funzione del pacchetto latex-extra.
Malabarba,

A proposito, vale la pena notare che la modalità palangari è contrassegnata come obsoleta in 24.4 (non che ha un'alternativa equivalente),
Malabarba

2
Il punto elettrico non funzionerà bene perché i punti non vengono utilizzati solo per terminare le frasi ma anche per tutti i tipi di altri scopi. Sarebbe meglio sostituire un punto seguito da due spazi con un punto seguito da una nuova riga.
tmalsburg,

13

Per (1), utilizzerei un margine allargato, in modo da visual-line-modeavvolgere le linee nel modo desiderato fill-column. Tuttavia, ciò influirà sia sulle righe di testo che sulle equazioni.

Per quanto riguarda (2), è possibile definire un comando di riempimento personalizzato da associare M-qe riempire correttamente i paragrafi. Non sono ancora riuscito a scrivere un comando con il comportamento corretto per il riempimento automatico.

Avvolgere tutto questo in una modalità minore potrebbe essere simile al seguente. Non è un codice molto bello, ma dovrebbe funzionare nella maggior parte dei casi. (Ho avuto la unfill-paragraphfunzione nel mio init.elper un po 'di tempo senza notare problemi).

(define-minor-mode ospl-mode
  "One Sentence Per Line"
  :init-value nil
  :lighter " ospl"
  :keymap (let ((map (make-sparse-keymap)))
            (define-key map (kbd "M-q") 'ospl/fill-paragraph)
            map)

  (if ospl-mode
      (progn
        (visual-line-mode 1)
        (setq right-margin-width (- (window-body-width) fill-column)))
    (visual-line-mode -1)
    (setq right-margin-width 0))

  ;; Account for new margin width
  (set-window-buffer (selected-window) (current-buffer)))


(defun ospl/unfill-paragraph ()
  "Unfill the paragraph at point.

This repeatedly calls `join-line' until the whole paragraph does
not contain hard line breaks any more."
  (interactive)
  (forward-paragraph 1)
  (forward-paragraph -1)
  (while (looking-at paragraph-start)
    (forward-line 1))
  (let ((beg (point)))
    (forward-paragraph 1)
    (backward-char 1)
    (while (> (point) beg)
      (join-line)
      (beginning-of-line))))


(defun ospl/fill-paragraph ()
  "Fill the current paragraph until there is one sentence per line.

This unfills the paragraph, and places hard line breaks after each sentence."
  (interactive)
  (save-excursion
    (fill-paragraph)         ; takes care of putting 2 spaces if needed
    (ospl/unfill-paragraph)  ; remove hard line breaks

    ;; insert line breaks again
    (let ((end-of-paragraph (make-marker)))
      (save-excursion
        (forward-paragraph)
        (backward-sentence)
        (forward-sentence)
        (set-marker end-of-paragraph (point)))
      (forward-sentence) 
      (while (< (point) end-of-paragraph)
        (just-one-space)
        (delete-backward-char 1)
        (newline)
        (forward-sentence))
      (set-marker end-of-paragraph nil)))) 

Il riempimento del paragrafo funziona alla grande, vorrei poter accettare due risposte. Sostituisci unfill-paragraphcon ospl/unfill-paragraph. Anche i margini funzionano, ma il testo rientrato sembra male e avvolgono anche le equazioni, mentre sono riuscito a hackerare il metodo dei palangari di seguito per risolvere questi due problemi.
Malabarba,

Risolto, grazie. Come ho detto, ho avuto unfill-paragraph(non risolto) nel mio init.elper molto tempo. L'ho prefissato ieri per coerenza e ho introdotto un bug ....
ffevotte,

Sì, ho pensato che fosse qualcosa del genere. Mi sono anche reso conto che probabilmente potremmo riempire il paragrafo semplicemente facendo qualcosa di simile (let ((fill-column 1000000)) (fill-pragraph)). Non l'ho ancora testato comunque.
Malabarba,

Sì, una tale soluzione funziona. Semplicemente non mi piace avere costanti magiche (ma il mio codice non è neanche molto bello, quindi si potrebbe discutere su quale sia meglio ...)
ffevotte

1
Adoro questa soluzione. Esiste un modo semplice per evitare di spezzare le righe commentate in più righe?
Ramprasad,

9

I tuoi problemi di controllo della versione verrebbero evitati / risolti se usi git diff --color-words o latexdiff? Quindi puoi guardare le parole cambiate.


2
Le parole da colorare sono davvero abbondanti! Ma ho ancora bisogno dell'approccio olps per evitare conflitti quando si fondono i contributi di altre persone e quando si ripristinano i vecchi impegni.
Malabarba,

2

Un modo per migliorare ciò che ho usato (a volte) per diversi anni è quello di visualizzare le frasi con interruzioni di riga che scorrono l'una dopo l'altra piegando le interruzioni di riga utilizzando le funzionalità di tex-fold(una parte di AUCTeX).

Questo significa che questo

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Mauris pellentesque fringilla justo, quis dapibus velit tincidunt quis?
Quisque varius ligula arcu, ut imperdiet risus maximus nec.

è piegato a

Lorem ipsum dolor sit amet, consectetur adipiscing elit⁎ Mauris pellentesque fringilla justo, quis dapibus velit tincidunt quis❓  Quisque varius ligula arcu, ut imperdiet risus maximus nec⁎

Di recente l'ho messo insieme come una modalità minore in un pacchetto. Forse anche qualcun altro lo troverà utile: https://github.com/andersjohansson/tex-fold-linebreaks

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.