vim r! na posição do cursor


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 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 nmapcria 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.


Seria possível encadear comandos para resolver isso. : r! data | : - | J ou i \ n \ n ^ [-:.! Date \ n -JJ #
Alexx Roche

4

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


1

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.
  • 0Dexclui a data, `eleva você de volta à posição marcada e PJxcoloca 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 datepode ajudar com isso).


0

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.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.