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.
A
que de fato anexa o texto à linha atual.:help function-list
para ver quais funções internas estão disponíveis.Respostas:
append()
insere várias linhas de texto abaixo da linha especificada como o primeiro argumento. Isso está alinhado com oappend
comando 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, oappend
comando 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:Onde
line('$')
está a última linha do arquivo eline('^')
sempre retorna0
(e eu poderia ter escrito isso sem problemas).Para obter o comportamento do Vim
A
ou de qualquer outro comando de modo normal do Vim, você pode usarnormal
. Para que a saídaFoo()
apareça no final de uma linha pode ser um pouco mais complicado, uma maneira é usarexecute
:Ou você pode usar anexar e executar
J
:(Observe que
x
é necessário remover o espaço gerado porJ
, mas isso pode não funcionar conforme o esperado se a sequência gerada porFoo()
iniciar com espaços).fonte
setline()
+getline()
é outra opção.gJ
que a união sem espaçosA
append()
função talvez devesse ter sido nomeadaappendline()
: apenas anexa linhas ao buffer. Você não pode alterar as linhas existentes com ele.É como usar a
a
bandeirafopen()
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 comoCoconuts
:Você pode usar
getline()
para obter o valor da linha atual; portanto, para adicionarCoconuts
à linha, use algo como:Você também pode definir várias linhas usando uma lista (assim como em
append()
):Para acrescentar texto a várias linhas, você precisará usar um
for
loop.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.fonte