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 Controle R e digitando =system('command')
Enter . Infelizmente, se a saída do comando tiver uma nova linha à direita (como a maioria irá) também será inserida, então sua linha será quebrada.
Isso pode ser corrigido adicionando uma chamada substitute()
para remover novas linhas, mas isso torna o comando mais problemático do que vale a pena digitar à mão.
A solução final é criar algum tipo de mapeamento, mas isso fica ainda mais complexo devido a como o Vim lida com o que chama de "digitar adiante"; enquanto você pode fazer algo como:
:nmap \e i<c-r>=substitute(system('date'),'[\r\n]*$','','')<cr><esc>
Quando o comando é "hard wired" 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 irá ficar confuso, apitar e entrar no modo de inserção.
Portanto, você precisa solicitar que o comando seja executado primeiro, armazená-lo em uma variável e, em seguida, inserir a saída processada. Neste ponto, provavelmente é necessária uma função auxiliar para evitar que o próprio mapeamento se torne incontrolável, então acabamos 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ó são executados quando digitado no modo normal.
Por acaso, se você quiser inserir apenas a data ou o diretório de trabalho atual, a resposta inicial que eu dei é viável. Apenas entre no modo de inserção e digite Controle R =strftime('%c')
Insira ou Controle R =getcwd()
Digite .