vim r! na posição do cursor

15

com vim, se eu usar

:r!date

vim insere a data na próxima linha, similar a

:r!pwd

como eu posso inserir o comando de saída sob a posição do cursor e não em uma nova linha?

    
por juanpablo 06.08.2012 / 02:12

3 respostas

16

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 .

    
por 06.08.2012 / 04:37
4

Se você quiser na linha atual, tente apenas, mas tenha em mente que o conteúdo antigo da linha será apagado:

:.!date

Se você quiser a posição exata do cursor, você pode:

:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b

Longa história curta: você precisa substituir porque você quer se livrar de ^ @ (caracteres nulos), que você também pode substituir com .s / \% x00 // g. Esta é uma versão mais curta com menos tubos:

:exec 'normal i'.substitute(system("date"),"[\n]*$","","")

E você também pode definir tags se quiser substituir 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

    
por 09.08.2012 / 07:33
0

No modo normal (modo escape / bleep), 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 ligar o 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 está ativo. Eu uso

:inoremap DHRE <C-r>=system("date \| tr '\n' ' '")<CR>

(eu mudei de DHERE depois de descobrir que colando ADHERE desencadeou) porque eu já uso F12 para outras coisas.

eu uso

grep -iE "dhere" /usr/share/dict/words

para verificar conflitos óbvios com palavras existentes, o que sugere que você é relativamente seguro para usar:

:inoremap PWD <C-r>=system("pwd \| tr '\n' ' '")<CR>

(a menos que você esteja escrevendo certa documentação).

    
por 17.07.2017 / 19:54

Tags