Como posso dividir o parágrafo em uma linha por frase, mas ainda assim mantê-lo visualmente?

14

Isso é semelhante a Edição de arquivos com uma frase por linha (tanto na função quanto no motivo), mas eu gostaria de ter um parágrafo completo e fluido, em vez de quebras visuais em cada frase.

Eu gostaria de ter um modo secundário que, quando ativo, junte visualmente linhas do mesmo parágrafo (não separadas por \n\nou paragraph-separateou ...) e, em seguida, ative o comportamento (talvez derivado de visual-line-mode) que envolverá a linha sem realmente inserir \n.

Existe esse modo? Se não, como eu iria sobre o processo de alterar as propriedades de exibição de um parágrafo para alcançar o resultado? (Afinal, esse é o cerne de um modo desse tipo e um pode ser desenvolvido a partir do snippet.)

Sean Allred
fonte
[...] se juntará visualmente [...]. Você quer dizer manter o subjacente \n(se presente) ou deseja que ele remova as novas linhas para fornecer 1 parágrafo por linha?
Jonathan Leech-Pepin
1
Talvez você possa usar o buffer-display-tablepara fazer com que as novas linhas \npareçam algo como espaços ou algo assim - veja o exemplo a seguir no link: stackoverflow.com/a/24842771/2112489 A vantagem disso seria que o texto no campo documento não é modificado. A nova linha pode ser praticamente qualquer coisa - por exemplo, uma carinha sorridente, espaços, um símbolo de peregrinação, etc. O efeito visual é que a embalagem ocorrerá.
lawlist
@ JonathanLeech-Pepin Quero manter as novas linhas sempre que presentes. Na verdade, eu gostaria de forçar a nova linha no final da frase, mas isso pode ser feito por meio de gancho separado.
Sean Allred
1
@lawlist, o efeito visual é que as novas linhas desaparecerão em todos os lugares, não é? Todos os parágrafos não serão recolhidos em um?
Malabarba
1
Sou favorável a essa solicitação, mas acho que o modo secundário descrito pelo OP não é a solução correta. O problema subjacente é que o diff não funciona bem para o texto, pois foi projetado para o código. A solução desse problema no Emacs é uma solução possível, mas não limpa, por vários motivos. Seria muito melhor melhorar o diff para funcionar bem com o texto.
tmalsburg

Respostas:

3

Como Tom disse, colocar uma propriedade de exibição nas novas linhas funcionará.

O problema é descobrir quais linhas devem ser quebradas.

Aqui está um exemplo para você começar:

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

(visual-line-mode 1)

Isso "removerá" novas linhas se for precedido por caracteres gráficos e a próxima linha não for recuada ou vazia. Você terá que experimentar para encontrar algo que funcione para você.

Mais algumas explicações:

  1. font-lock-add-keywordsadiciona uma lista de regras ao bloqueio de fontes (portanto, o bloqueio de fontes deve ser ativado. O primeiro argumento pode ser um modo (por exemplo text-mode); no nosso caso, é nulo, o que significa adicionar a regra apenas ao buffer atual.
  2. Nossa "regra" é (,eol-regexp 1 '(face default display " ")). O primeiro elemento é a expressão regular que criamos anteriormente; a segunda é a subexpressão na qual estamos interessados; o terceiro é o "rosto" que queremos aplicar.
  3. Embora o uso de uma face para as novas linhas não seja útil para nós, também podemos adicionar propriedades de texto. Portanto, usamos a face padrão e, em seguida, adicionamos uma propriedade de exibição, que substitui a subcadeia 1 (ou seja, a nova linha) por um espaço.
  4. Se você se atirar no pé, exclua o buffer ou remova a palavra-chave com font-lock-remove-keywords.
  5. Você também pode querer adicionar displaya font-lock-extra-managed-props(eu não tentei isso).
  6. A parte complicada é acertar a regexp. "\ (\ n \) [^ \ n]" corresponderia a qualquer nova linha que não seja seguida imediatamente por outra. ". \ {30, \} \ (\ n \)" corresponderia apenas às novas linhas precedidas por pelo menos 30 caracteres.
olaf b
fonte
Pode-se encontrar uma implementação do acima como um pacote em github.com/andersjohansson/tex-fold-linebreaks
zakkak
0

Se eu entendi o problema corretamente, é que você gostaria de preservar todas as novas linhas no buffer como elas são; mas você gostaria de exibir alguns deles como espaços. Então, você gostaria de agrupar as palavras.

Para quebra de palavras, acho que você pode usar visual-line-mode.

Para lidar com as novas linhas, acho que você poderia colocar uma displaypropriedade com " "(uma sequência que consiste em um único espaço) como um valor nas novas linhas que você deseja exibir de maneira diferente.

Tom Tromey
fonte