com vim, se eu usar
:r!date
vim insira a data na próxima linha, semelhante a
:r!pwd
como posso inserir o comando de saída na posição do cursor e não em uma nova linha?
com vim, se eu usar
:r!date
vim insira a data na próxima linha, semelhante a
:r!pwd
como posso inserir o comando de saída na posição do cursor e não em uma nova linha?
Respostas:
Com " :read
" o Vim sempre inserirá a saída em uma nova linha. Infelizmente, a solução não é simples.
Você pode inserir a saída de um comando na posição atual do cursor quando estiver no modo de inserção pressionando ControlRe digitando =system('command')
Enter. Infelizmente, se a saída do comando tiver uma nova linha à direita (como a maioria irá) que também será inserida, sua linha será interrompida.
Isso pode ser corrigido com a adição de uma substitute()
chamada para remover as novas linhas à direita, mas isso torna o comando mais problemático do que vale a pena digitar manualmente.
A solução definitiva é criar algum tipo de mapeamento, mas isso fica ainda mais complexo devido à maneira como o Vim lida com o que chama de "digitação antecipada"; enquanto você pode fazer algo como:
:nmap \e i<c-r>=substitute(system('date'),'[\r\n]*$','','')<cr><esc>
Onde o comando está "conectado" no mapeamento, você não pode fazer algo como:
:nmap \e i<c-r>=substitute(system(input('Command: ')),'[\r\n]*$','','')<cr><esc>
Onde você tenta solicitar ao usuário que o comando seja executado, porque o Vim fica confuso, emite um bipe e entra no modo de inserção.
Portanto, você deve solicitar que o comando seja executado primeiro, armazene-o em uma variável e insira a saída processada. Nesse ponto, provavelmente é necessária uma função auxiliar para impedir que o próprio mapeamento se torne descontroladamente confuso, portanto, terminamos com algo assim:
function InlineCommand()
let l:cmd = input('Command: ')
let l:output = system(l:cmd)
let l:output = substitute(l:output, '[\r\n]*$', '', '')
execute 'normal i' . l:output
endfunction
nmap <silent> \e :call InlineCommand()<CR>
Observe que nmap
cria mapeamentos que são executados apenas quando digitados no modo normal.
Aliás, se você só queria inserir a data ou o diretório de trabalho atual, a resposta inicial que dei é viável. Basta entrar no modo de inserção e digite ControlR=strftime('%c')
Enterou ControlR=getcwd()
Enter.
Se você quiser na linha atual, tente apenas, mas lembre-se de que o conteúdo antigo da linha será apagado:
:.!date
Se você deseja a posição exata do cursor, pode:
:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b
Para encurtar a história: você precisa substituir porque quer se livrar de ^ @ (caracteres nulos) que também pode ser substituído por .s / \% x00 // g. Esta é uma versão mais curta com menos pipes:
:exec 'normal i'.substitute(system("date"),"[\n]*$","","")
E você também pode definir tags se quiser substituir em vários pontos na mesma linha:
Dada esta linha 1:
1 Date: <datehere> and also <datehere>
Executar:
:let a=system("date") | exec ".s/<datehere>/".a."/g" | .s/\%x00//g
Após a substituição:
1 Date: jue ago 9 02:34:52 ART 2012 and also jue ago 9 02:34:52 ART 2012
Testado no Vim 7.2
Você pode adicionar esse tipo de coisa no seu .vimrc:
" Insert the date in YYYY-MM-DD format inline just before cursor position (normal mode)
nnoremap <Leader>di me:r !date +\%F<CR>A <Esc>0D`ePJx
me
marca a posição atual.:r !date +\%F<CR>
coloca a data na próxima linha no formato AAAA-MM-DD (você pode alterar isso da maneira que quiser, basta sair de cada %
uma delas \
).A <Esc>
anexa um espaço ao final da saída da data.0D
exclui a data, `e
leva você de volta à posição marcada e PJx
coloca a data antes do cursor, junta as linhas (para se livrar da vazia abaixo) e mata o espaço à direita. Modifique o mapeamento como achar melhor.Se você quiser fazer isso no modo de inserção, li esta gema hoje em https://vimways.org/2018/the-mapping-business/
inoremap <C-g><C-t> <C-r>=strftime("%F")<CR>
Você pode modificar a saída da data para atender às suas necessidades ( man date
pode ajudar com isso).
No modo normal (modo escape / bip), cole
:exec 'normal i'.system("date \| tr '\n' ' '")
para obter a data inserida na posição atual. Se você copiar essa linha com um retorno de carro, Shift + Insert se tornará seu comando DateTime-Here.
Além disso, você pode vincular F12 a um comando com
:inoremap <F12> <C-r>=system("date \| tr '\n' ' '")<CR>
você pode inserir a data com a tecla de função 12 enquanto o modo de inserção estiver ativo. eu uso
:inoremap DHRE <C-r>=system("date \| tr '\n' ' '")<CR>
(Mudei de DHERE depois de descobrir que a colar ADHERE foi acionada) porque já uso F12 para outras coisas.
eu uso
grep -iE "dhere" /usr/share/dict/words
para verificar se há conflitos óbvios com as palavras existentes, o que sugere que você é relativamente seguro de usar:
:inoremap PWD <C-r>=system("pwd \| tr '\n' ' '")<CR>
(a menos que você esteja escrevendo determinada documentação.)