Como inserir o resultado de um comando no texto no vim?

34

Por exemplo, :echo strftime(%c) mostrará a hora atual na parte inferior, mas como inserir essa seqüência de tempo no texto (logo após o cursor)?

    
por xzhu 25.02.2011 / 05:33

7 respostas

43

Você pode usar o registro de expressões, "= , com p (ou P ) no modo normal ou <C-R> no modo de inserção:

No modo normal:
( <C-M> aqui significa Controle + M , ou simplesmente pressione Enter / < kbd> Retornar )

"=strftime('%c')<C-M>p

No modo de inserção:
( <C-M> tem o mesmo significado acima, <C-R> significa Controle + R )

<C-R>=strftime('%c')<C-M>

Se você quiser inserir o resultado da mesma expressão várias vezes, convém mapeá-los para as chaves em .vimrc :
(aqui os <C-M> e <C-R> devem ser digitado literalmente (uma sequência de cinco caracteres imprimíveis - o Vim irá traduzi-los internamente))

:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>
    
por 25.02.2011 / 08:11
20

:r!date +\%c

veja :help :r!

    
por 25.02.2011 / 06:33
10

Estes comandos irão inserir a saída de strftime("%c") onde o seu cursor está:

:exe ":normal i" . strftime("%c")

e

:call feedkeys("i". strftime("%c"))

Existem outras maneiras de fazer o que você deseja (como, por exemplo, aquelas em Resposta de Mikel ).

Editar : ainda melhor, para inserção no local, use o registro = como Chris Johnsen descreve

    
por 25.02.2011 / 08:09
10

Se você quiser inserir a saída de um comando de vim (em oposição ao valor de retorno de uma chamada de função ), você terá que capturá-lo. Isso é realizado por meio do comando :redir , que permite redirecionar o equivalente da saída padrão do vim para uma variável, arquivo, registro ou outro destino.

:redir é dolorosamente inconveniente de usar; Eu escreveria uma função para encapsular sua funcionalidade de uma maneira mais conveniente, algo como

funct! Exec(command)
    redir =>output
    silent exec a:command
    redir END
    return output
endfunct!

Depois de declarar essa função, você pode usar o registro de expressão (como explicado por Chris Johnsen) para inserir a saída de um comando na posição do cursor. Então, no modo normal, pressione i^R=Exec('ls') para inserir a lista de buffers atuais do vim.

Esteja ciente de que o comando será executado no namespace da função, portanto, se você usar uma variável global, terá que explicitar o namespace, prefixando-o com g: . Observe também que Exec() , como descrito acima, anexará uma nova linha final a uma saída de uma linha. Você pode querer adicionar uma chamada para substitute() na função para evitar isso.

Veja também link para mais informações sobre redir e um link para um comando relacionado.

    
por 27.02.2011 / 18:22
4
:call append(line('.'), strftime("%c"))

Irá colocar na próxima linha, então você pode pressionar J ( Shift + J ) para juntar-se à posição atual.

Ou se você precisar de tudo em um comando, você poderia fazer

:call setline(line('.'), getline(line('.')) . strftime("%c"))

ou

:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))

dependendo se você quer um espaço inserido antes da data ou não.

    
por 25.02.2011 / 05:37
3

Melhorando a resposta @intuida para evitar o problema com espaços em branco iniciais e recuo crescente:

"Examples:
":call Exec('buffers')
"This will include the output of :buffers into the current buffer.
"
"Also try:
":call Exec('ls')
":call Exec('autocmd')
"
funct! Exec(command)
    redir =>output
    silent exec a:command
    redir END
    let @o = output
    execute "put o"
endfunct!

Isso simplesmente será inserido no local atual no arquivo quando você :call Exec('command') do modo normal. Conforme observado no comentário , a abordagem original (modo de inserção) Ctrl + R =Exec('command') com Exec(..) retornando uma string pode ser parcialmente corrigida usando set paste , mas não oferece uma oportunidade de colocar a set nopaste em qualquer lugar.

A sintaxe let @o = output define o registro o como o conteúdo da variável output , conforme explicado aqui: link

    
por 23.04.2015 / 06:55
1

É assim que eu faço. Ele coloca logo após o cursor porque usa p .

" save previous yank
let reg_save = @@

" save your text to the '@' register
let @@ = strftime('%c')
" paste it after the cursor
exec "normal! p"

" restore previous yank
let @@ = reg_save
    
por 20.05.2018 / 10:22

Tags