Editando arquivos com uma frase por linha

28

Um pouco de fundo.

Estou tentando controlar meus documentos de látex com versão e a eficácia dessa iniciativa melhoraria bastante se eu adotasse uma abordagem de uma frase por linha .

Por exemplo, é a seguinte a aparência dos meus documentos.

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

This is another paragraph.

Minha pergunta é simples.
Quanto disso eu posso automatizar / melhorar com o Emacs?

Os dois pontos a seguir são o que tenho em mente.

  1. Minhas frases são longas , então eu preciso quebrar as linhas sem preenchê-las. Ou seja, uma frase muito longa precisa ser exibida em várias linhas na minha tela, mas precisa ser uma única linha no arquivo ".tex" . Isso seria preferencialmente feito de uma maneira que não envolvesse equações.

    visual-line-modeenvolve a largura da janela, que é muito larga. Preciso de algo que envolva linhas e limite sua largura para 80 caracteres ou mais. Exatamente como fill-paragraphfaria normalmente, mas sem realmente quebrar as linhas no arquivo.

  2. Posso quebrar manualmente a linha após cada frase, mas seria altamente preferível se eu pudesse configurar fill-paragraph(ou talvez até auto-fill-mode) colocar uma frase por linha também.
Malabarba
fonte
1
Que tipo de melhoria / automação você procura exatamente? Deseja saber como editar efetivamente em arquivos como este?
Rangi Lin
@RangiLin Yes. O primeiro ponto que mencionei é a coisa mais importante para mim. Mas qualquer outra coisa para tornar isso mais eficaz é bem-vinda.
Malabarba 29/09
A descrição no primeiro ponto é semelhante visual-line-mode. Mas, além dessa quebra de linha, você também precisa inserir automaticamente um caractere de nova linha após cada frase, correto?
Kaushal Modi
@kaushalmodi Sim, mas a nova linha após cada frase é real, deve estar no arquivo. O problema com o modo de linha visual é que ele é muito amplo por padrão. Se houver uma maneira de reduzi-lo, seria ótimo.
Malabarba 29/09
@ Malabarba: Você sabe o porquê? Para mim, é o modo de acondicionamento mais útil de longe ...
Tikhon Jelvis

Respostas:

11

Se você quer apenas algo parecido, visual-line-modemas configurável, pode tentar longlines-modequal é o que eu uso na maior parte da minha prosa. longlines-modeagrupa seu texto de maneira semelhante à visual-line-modelargura configurada por fill-column.

Aqui está uma captura de tela com fill-columndefinido como 70(a janela na verdade se estende ainda mais para a direita).

Um exemplo de quebra automática de texto no modo palangres.

A configuração fill-paragraphseria legal, mas não sei como fazê-lo. Em vez disso, aqui está um truque temporário razoável: torne seu .personagem elétrico no modo TeX, inserindo uma nova linha. Isso envolve apenas religá-lo em qualquer gancho de modo apropriado:

(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)
Tikhon Jelvis
fonte
1
Muito obrigado por apontar o modo de palangres! Consegui fazê-lo não quebrar equações e até mesmo corrigir a aparência de linhas recuadas. Aqui está o gist gist.github.com/c532f77144ddf86b4ea4.git
Malabarba
@ Malabarba: Legal. Provavelmente vou usar algumas dessas mudanças! Seu link não funciona corretamente; aqui está uma versão web-friendly: gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4
Tikhon Jelvis
Obrigado. Além disso, esqueci de mencionar, que o conselho usa uma função do pacote latex-extra.
Malabarba 30/09
A propósito, vale a pena notar que palangres-mode é marcado como obsoleto em 24,4 (não que ele tem uma alternativa equivalente),
Malabarba
2
O ponto elétrico não vai funcionar bem porque os pontos não são usados ​​apenas para terminar frases, mas também para todos os tipos de outros fins. Seria melhor substituir um ponto seguido por dois espaços por um ponto seguido por uma nova linha.
tmalsburg
13

Para (1), eu usaria uma margem ampliada, de modo que visual-line-modeagrupe as linhas na desejada fill-column. Isso afetará as linhas e as equações do texto.

Quanto a (2), pode-se definir um comando de preenchimento personalizado a ser vinculado M-qe preencher corretamente os parágrafos. Ainda não consegui escrever um comando com o comportamento correto para o preenchimento automático.

Envolvendo tudo isso em um modo menor, pode parecer com o seguinte. Não é um código muito bonito, mas deve funcionar na maioria dos casos. (Eu exerço a unfill-paragraphfunção init.elhá algum tempo sem perceber problemas).

(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)))) 
ffevotte
fonte
O preenchimento de parágrafos funciona muito bem, eu gostaria de poder aceitar duas respostas. Apenas substitua unfill-paragraphpor ospl/unfill-paragraph. As margens também funcionam, mas o texto recuado parece ruim e também inclui equações, enquanto eu consegui hackear o método dos palangres abaixo para corrigir esses dois problemas.
Malabarba 30/09
Corrigido, obrigado. Como eu disse, eu tenho unfill-paragraph(não corrigido) no meu init.elpor um longo tempo. Eu só prefixado ontem para a consistência e introduziu um bug ....
ffevotte
Sim, achei que era algo assim. Também percebi que provavelmente podemos preencher parágrafos apenas fazendo algo assim (let ((fill-column 1000000)) (fill-pragraph)). Ainda não testei ainda.
Malabarba 30/09
Sim, essa solução funciona. Eu só não gosto de ter constantes mágicas (mas meu código não é muito bonito ou, então, pode-se argumentar que é melhor ...)
ffevotte
1
Adoro esta solução. Existe uma maneira simples de evitar a quebra de linhas comentadas em várias linhas?
Ramprasad
9

Seus problemas de controle de versão seriam evitados / resolvidos se você usar git diff --color-words ou latexdiff? Então você pode olhar para as palavras alteradas.

Sacha Chua
fonte
2
Colorir palavras é realmente cheio! Mas ainda preciso da abordagem olps para ajudar a evitar conflitos ao mesclar as contribuições de outras pessoas e ao reverter os antigos compromissos.
Malabarba 30/09
2

Uma maneira de melhorar isso que eu tenho usado (às vezes) há vários anos é exibir frases com quebras de linha fluindo uma após a outra, dobrando as quebras de linha usando os recursos de tex-fold(uma parte do AUCTeX).

Isso significa que isso

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.

é dobrado para

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⁎

Recentemente, coloquei isso como um modo secundário em um pacote. Talvez alguém também ache isso útil: https://github.com/andersjohansson/tex-fold-linebreaks

Anders Johansson
fonte