No vi / vim, como eu adiciono um arquivo em vez de sobrescrevê-lo?

7

Eu sei que posso escrever em um arquivo simplesmente fazendo :w <file> . Gostaria de saber como posso escrever em um arquivo anexando-o em vez de sobrescrevê-lo.

Exemplo de caso de uso: Eu quero tirar algumas amostras de um arquivo de log em outro arquivo. Para conseguir isso hoje eu posso fazer:

  1. Abra o arquivo de log
  2. Selecione algumas linhas com Shift+v
  3. Escreva para um arquivo: :w /tmp/samples
  4. Selecione mais algumas linhas com Shift+v
  5. Anexar a /tmp/samples com :w !cat - >> /foo/samples

Infelizmente, o passo 5 é longo, feio e sujeito a erros (perder um > faz com que você perca dados). Espero que o Vim tenha algo melhor aqui.

    
por Bruno Polaco 04.04.2016 / 17:39

2 respostas

22

Em :h :w :

                                                :w_a :write_a E494
:[range]w[rite][!] [++opt] >>
                        Append the specified lines to the current file.

:[range]w[rite][!] [++opt] >> {file}
                        Append the specified lines to {file}.  '!' forces the
                        write even if file does not exist.

Então, se você selecionou o texto usando o modo visual, apenas :w >> /foo/samples ( :'<,'> será prefixado automaticamente). Se você perder um > , o Vim irá reclamar:

E494: Use w or w>>
    
por 04.04.2016 / 17:50
0

Defina uma função:

fun! App(filename)
    exec "w !cat - >> " . shellescape(a:filename)
endfunc

Chame uma função:

call App('/foo/samples')
    
por 04.04.2016 / 17:53