Como posso anexar texto à linha atual?

8

Atualmente, estou tentando descobrir o vimscript e me deparei com a append()função. A documentação afirma que você pode especificar a linha à qual uma expressão deve ser anexada, então tentei:

:call append(line('.'), Foo())

Foo() retorna uma string.

O estranho é que a string é anexada à próxima linha após a atual. Então tentei line('.') - 1, apenas para ver que ele se anexa à linha acima da atual.

Estou impressionado, confuso e sem palavras neste momento.

Espero que alguém possa esclarecer isso.

Cookie Thumper
fonte
a documentação afirma claramente que a expressão Foo () nesse caso deve ser anexada como uma linha abaixo da linha especificada. Não deve ser confundido com o comando do modo normal, Aque de fato anexa o texto à linha atual.
Naumann
11
Dê uma olhada :help function-listpara ver quais funções internas estão disponíveis.
Antony

Respostas:

8

append()insere várias linhas de texto abaixo da linha especificada como o primeiro argumento. Isso está alinhado com o appendcomando ex. Você pode, por exemplo, digitar :append(e entrar no modo ex) e, em seguida, escrever várias linhas de texto e sair do modo ex (pressionando, <c-c>por exemplo), as linhas aparecerão após a linha em que o cursor estiver ativado. Em outras palavras, o appendcomando significa: acrescentar as linhas de texto que escreverei abaixo da atual.

A função VimScript append()permite especificadores de linha, o que a torna mais útil que o comando ex. Coisas úteis que costumam surgir são maneiras de injetar trechos de texto no início e no final de um arquivo. por exemplo, para o LaTeX, isso pode ser útil:

call append(line('^'), [ '\documentclass[12pt]{article}'
\                      , '\begin{document}'])
call append(line('$'), '\end{document}')

Onde line('$')está a última linha do arquivo e line('^')sempre retorna 0(e eu poderia ter escrito isso sem problemas).

Para obter o comportamento do Vim Aou de qualquer outro comando de modo normal do Vim, você pode usar normal. Para que a saída Foo()apareça no final de uma linha pode ser um pouco mais complicado, uma maneira é usar execute:

execute ':normal! A' . Foo()

Ou você pode usar anexar e executar J:

call append(line('.'), Foo())
normal! Jx

(Observe que xé necessário remover o espaço gerado por J, mas isso pode não funcionar conforme o esperado se a sequência gerada por Foo()iniciar com espaços).

grochmal
fonte
5
setline()+ getline()é outra opção.
Antony
2
gJque a união sem espaços
SergioAraujo
10

A append()função talvez devesse ter sido nomeada appendline(): apenas anexa linhas ao buffer. Você não pode alterar as linhas existentes com ele.

É como usar a abandeira fopen()ou usar >>no shell.


Se você deseja definir o valor das linhas existentes, a maneira mais fácil de fazer isso no VimScript é usar setline(). Por exemplo, para definir a linha atual como Coconuts:

:call setline('.', 'Coconuts')

Você pode usar getline()para obter o valor da linha atual; portanto, para adicionar Coconutsà linha, use algo como:

:call setline('.', getline('.') . 'Coconuts')

Você também pode definir várias linhas usando uma lista (assim como em append()):

:call setline('.', ['Coconuts', 'Bananas'])

Para acrescentar texto a várias linhas, você precisará usar um forloop.


Observe que o acima não é o único caminho. Outras maneiras seriam usar :substitute(por exemplo :s/$/\=Foo()/) ou a resposta de Grochmal . A "melhor" maneira depende do contexto em que você a está usando, bem como da preferência pessoal.

Martin Tournoij
fonte