Vim: linhas de e-mail wrap / indent / prefix com “alice” e “bob”

3

Em um tópico de e-mail, Alice e Bob me enviaram e-mails com linhas incrivelmente longas. Gostaria de enviar uma resposta semelhante a esta:

alice> blah blah blah, foo dee bar dee baz, ho hum and then
alice> she said: "what do you think I am, a top poster?"

Teh lulz

bob> that's not funny

Yes it is lol :D

Eu quero que cada linha tenha uma largura máxima de n caracteres, e eu quero que cada linha tenha um prefixo de "$ {name} >". Eu gostaria de não ter que mexer com cada linha, ou seja, eu gostaria de inserir algo bastante próximo do mínimo [nome 1, nome 2, ir embrulhar material], mas em ambos os casos algo que é O (1) no comprimento de as linhas de entrada (provavelmente O (k) no número de linhas longas, um g q } para cada).

Isso é possível e como? Se não, como posso aproximá-lo melhor?

    
por Jonas Kölker 17.01.2013 / 11:51

3 respostas

3

Uma opção é usar :set formatoptions+=n em conjunto com um formatlistpat personalizado. A opção n reformata listas numeradas, prefixando o número equivalente de espaços em linhas com quebra automática. Ele pode ser adaptado para uso neste caso, definindo um líder de lista apropriado:

set fo+=n
let &flp='\w\+> '

Para ilustrar os efeitos, considere o seguinte exemplo:

alice> foo bar baz qux foo bar baz qux
bob> foo bar baz qux foo bar baz qux

Usando tw=20 neste caso, g q } produz:

alice> foo bar baz
       qux foo bar
       baz qux
bob> foo bar baz qux
     foo bar baz qux

Esse método envolve corretamente as linhas sem alterar tw , mas apenas preenche os espaços. Se name> precisar ser acrescentado a cada nova linha, outra operação será necessária, mas isso pelo menos manipulará a quebra automática.

Como alternativa, as cotações nesse formato podem ser tratadas como comments . Infelizmente este método não aceita regex e, portanto, requer nomes explícitos. O b flag pode ser usado para exigir espaço em branco após o líder do comentário:

set comments+=b:alice>,b:bob>

Com isso, usando o mesmo exemplo acima, a reformatação produz:

alice> foo bar baz
alice> qux foo bar
alice> baz qux
bob> foo bar baz qux
bob> foo bar baz qux

Aqui está uma função simples que utiliza isso e um comando correspondente por conveniência:

function! Format(name1, name2)
    execute "set comments+=b:" . a:name1 . ">,b:" . a:name2 . ">"
    execute "normal gq}"
    execute "set comments-=b:" . a:name1 . ">,b:" . a:name2 . ">"
endfunction

command! -nargs=* F call Format(<f-args>)

Assim, :F alice bob pode ser usado para produzir os resultados da amostra acima.

    
por 20.01.2013 / 14:09
1

Se você tiver uma versão recente do Vim ( echo v:version > 703 || v:version == 703 && has("patch541") ), poderá usar set formatoptions+=j .

Isso informa ao Vim, quando reformatar com gqq , para preservar os líderes de comentários (por exemplo, # na maioria das linguagens de script ou * para comentários no estilo javadoc).

Tudo o que resta fazer é configurar comments corretamente:

set comments+=b:alice>,b:bob>

Como observado anteriormente, comments ainda não suporta regexes, portanto, é necessário especificar explicitamente os nomes de todos os questionados.

    
por 16.02.2013 / 14:07
0

Um método, que acho profundamente insatisfatório, é:

  • calcula a largura na qual o texto de uma linha longa deve ser agrupado
  • define a largura do envelope (err, textwidth , no?) de acordo
  • envolva a linha longa
  • : '<,' > s / ^ / alice /
  • repita para a próxima linha longa
  • quando todas as linhas longas forem concluídas, restaure a largura do envoltório para o normal.

Em particular, sou preguiçoso e não quero fazer o cálculo. A entrada é O (1) e O (k), embora minha lista de requisitos esteja aparentemente incompleta. Tal é a vida: -)

    
por 17.01.2013 / 12:21