No modo normal: ( <C-M>aqui significa Control+ M, ou apenas pressione Enter/ Return)
"=strftime('%c')<C-M>p
No modo de inserção: ( <C-M>tem o mesmo significado que acima, <C-R>significa Control+ R)
<C-R>=strftime('%c')<C-M>
Se você deseja inserir o resultado da mesma expressão várias vezes, mapeá-lo nas chaves .vimrc: (aqui o <C-M>e <C-R>deve ser digitado literalmente (uma sequência de cinco caracteres imprimíveis - o Vim os traduzirá internamente))
para obter o valor de uma variável vim (por exemplo, opções de sessão): <C-R>=&sessionoptions- ele ainda completa a tabulação de modo selvagem!
26612 Justin Bieber Keyes
2
: put = strftime ('% c') <CM>
brunch875 13/08/2015
No modo de inserção, o uso <c-r>=é lento para o comando, que pode ter muita saída e também pode quebrar o recuo para que o texto de saída seja ilegível. Por exemplo, <c-r>=execute('nmap')a saída será escrita linha por linha, o que é muito lento.
dateé um comando externo e !chama comandos externos enquanto o OP solicita comandos vim.
Eelvex
@eelvex não, ele não fez. e a ! é um comando vim e vi. Este é o método canônico. Funciona para muitas outras coisas também.
Keith
5
@ Keith: yes !é um comando vi (m) que chama comandos externos . Você pode estar certo no OP, não desejando emitir apenas comandos vim, mas se ele o fizer, !não o fará.
Eelvex
11
Estes comandos irão inserir a saída strftime("%c")exatamente onde está o cursor:
:exe ":normal i" . strftime("%c")
e
:call feedkeys("i". strftime("%c"))
Existem outras maneiras de fazer o que você deseja (como, por exemplo, as da resposta de Mikel ).
Editar : Melhor ainda, para inserção no local, use o =registro como Chris Johnsen descreve
Se você deseja inserir a saída de um comando vim (em oposição ao valor de retorno de uma chamada de função ), é necessário capturá-lo. Isso é realizado através do :redircomando, que permite redirecionar o equivalente do vim à saída padrão para uma variável, arquivo, registro ou outro destino.
:rediré meio dolorosamente inconveniente de usar; Eu escreveria uma função para encapsular sua funcionalidade de uma maneira mais conveniente, algo como
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. Portanto, no modo normal, pressione i^R=Exec('ls')para inserir a lista dos 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, precisará explicitamente dar um namespace ao prefixá-lo g:. Observe também que Exec(), conforme escrito acima, anexará uma nova linha final até a saída de uma linha. Você pode querer adicionar uma chamada à substitute()função para evitar isso.
Isso funciona muito bem. Adicionei um set pastecomando antes de retornar a saída e um set nopastedepois, para evitar o recuo da escada quando as linhas começarem com espaços em branco. Na verdade, eu queria salvar o valor da opção de colar atual e devolvê-lo, mas não consegui fazê-lo.
Juan Lanus
1
@JuanLanus O set nopastenão deve funcionar depois return output, porque a instrução de retorno é um ponto de saída da função. Coloquei minha solução para esse problema como uma resposta separada nesta página.
Evgeni Sergeev
4
:call append(line('.'), strftime("%c"))
Colocará na próxima linha, e você poderá pressionar J( Shift+ J) para associá-lo à posição atual.
Ou, se você precisar de tudo em um comando, poderá fazer
Melhorando a resposta @intuited para evitar o problema com espaços em branco à esquerda 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"
return ''
endfunct!
Isso simplesmente será inserido no local atual do arquivo quando você :call Exec('command')sair do modo normal. Conforme observado no comentário , a =Exec('command')abordagem Ctrl + R original (modo de inserção) com o Exec(..)retorno de uma sequência de caracteres pode ser parcialmente corrigida usando set paste, mas não oferece a oportunidade de colocar o local em set nopastequalquer lugar.
É assim que eu faço. Ele coloca logo após o cursor, porque ele 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
Respostas:
É possível utilizar o registo expressão,
"=
, comp
(ouP
) no modo normal ou<C-R>
no modo de inserção:No modo normal:
(
<C-M>
aqui significa Control+ M, ou apenas pressione Enter/ Return)No modo de inserção:
(
<C-M>
tem o mesmo significado que acima,<C-R>
significa Control+ R)Se você deseja inserir o resultado da mesma expressão várias vezes, mapeá-lo nas chaves
.vimrc
:(aqui o
<C-M>
e<C-R>
deve ser digitado literalmente (uma sequência de cinco caracteres imprimíveis - o Vim os traduzirá internamente))fonte
"=
registro. : - /<C-R>=&sessionoptions
- ele ainda completa a tabulação de modo selvagem!<c-r>=
é lento para o comando, que pode ter muita saída e também pode quebrar o recuo para que o texto de saída seja ilegível. Por exemplo,<c-r>=execute('nmap')
a saída será escrita linha por linha, o que é muito lento.:r!date +\%c
Vejo
:help :r!
fonte
date
é um comando externo e!
chama comandos externos enquanto o OP solicita comandos vim.!
é um comando vi (m) que chama comandos externos . Você pode estar certo no OP, não desejando emitir apenas comandos vim, mas se ele o fizer,!
não o fará.Estes comandos irão inserir a saída
strftime("%c")
exatamente onde está o cursor:e
Existem outras maneiras de fazer o que você deseja (como, por exemplo, as da resposta de Mikel ).
Editar : Melhor ainda, para inserção no local, use o
=
registro como Chris Johnsen descrevefonte
Se você deseja inserir a saída de um comando vim (em oposição ao valor de retorno de uma chamada de função ), é necessário capturá-lo. Isso é realizado através do
:redir
comando, que permite redirecionar o equivalente do vim à saída padrão para uma variável, arquivo, registro ou outro destino.:redir
é meio dolorosamente inconveniente de usar; Eu escreveria uma função para encapsular sua funcionalidade de uma maneira mais conveniente, algo comoDepois 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. Portanto, no modo normal, pressione
i^R=Exec('ls')
para inserir a lista dos 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, precisará explicitamente dar um namespace ao prefixá-lo
g:
. Observe também queExec()
, conforme escrito acima, anexará uma nova linha final até a saída de uma linha. Você pode querer adicionar uma chamada àsubstitute()
função para evitar isso.Consulte também https://stackoverflow.com/questions/2573021/vim-how-to-redirect-ex-command-output-into-current-buffer-or-file/2573054#2573054 para obter mais reclamações
redir
e sobre um link para um comando relacionado.fonte
set paste
comando antes de retornar a saída e umset nopaste
depois, para evitar o recuo da escada quando as linhas começarem com espaços em branco. Na verdade, eu queria salvar o valor da opção de colar atual e devolvê-lo, mas não consegui fazê-lo.set nopaste
não deve funcionar depoisreturn output
, porque a instrução de retorno é um ponto de saída da função. Coloquei minha solução para esse problema como uma resposta separada nesta página.Colocará na próxima linha, e você poderá pressionar
J
( Shift+ J) para associá-lo à posição atual.Ou, se você precisar de tudo em um comando, poderá fazer
ou
dependendo se você deseja um espaço inserido antes da data ou não.
fonte
Melhorando a resposta @intuited para evitar o problema com espaços em branco à esquerda e recuo crescente:
Isso simplesmente será inserido no local atual do arquivo quando você
:call Exec('command')
sair do modo normal. Conforme observado no comentário , a=Exec('command')
abordagem Ctrl + R original (modo de inserção) com oExec(..)
retorno de uma sequência de caracteres pode ser parcialmente corrigida usandoset paste
, mas não oferece a oportunidade de colocar o local emset nopaste
qualquer lugar.A
let @o = output
sintaxe define o registroo
para o conteúdo da variáveloutput
, conforme explicado aqui: https://stackoverflow.com/a/22738310/1143274A
return ''
linha é para que o valor de retorno padrão de0
não seja inserido no buffer.fonte
É assim que eu faço. Ele coloca logo após o cursor, porque ele usa
p
.fonte