Substituir seleção por saída de comando externo


10

Supondo que eu tenha uma linha em um arquivo XXXXsendo um espaço reservado que eu selecionei da vseguinte maneira:

XXXX Some other text

Como posso alterar apenas a XXXXsaída de um comando externo, como date +%Y%m%d?

Cheguei até

:'<,'>!date +\%Y\%m\%d 

mas isso substituiu toda a linha.


Pergunta relacionada sobre stackoverflow: stackoverflow.com/q/8403599/…
Hotschke

Respostas:


15

Você pode excluir o texto e inserir a saída de um comando usando CtrlR- =:

CTRL-R {0-9a-z"%#*+:.-=}                                        i_CTRL-R
                Insert the contents of a register.  Between typing CTRL-R and
                the second character, '"' will be displayed to indicate that
                you are expected to enter the name of a register.
 …
                                                        i_CTRL-R_=
                        '='     the expression register: you are prompted to
                                enter an expression (see expression)

Para a expressão, você pode usar a system()função para executar comandos externos.

Depois de selecionar o texto, pressione e c, em seguida, <c-r>=use system('date +%Y%m%d')como expressão.


1
Isso adiciona uma nova linha entre o texto substituído e o restante da linha, não é?
muk.li

2
@ muk.li que faz parte da saída do date. Se você tentar algo como system('printf %s foo'), que não gera uma nova linha à direita, verá que há uma diferença.
Muru

4
@ muk.li se você quiser apenas a data no texto, existe a strftimefunção que você pode usar em vez de system('date …'). A cadeia de formato é a mesma.
Muru

2
Você não precisa excluir o texto selecionado. Você pode usar "=system('date +%Y%m%d')pna seleção visual.
precisa saber é o seguinte

5

Se você colocar o cursor nessa linha, poderá:

  • 0 para colocar o cursor na primeira coluna.
  • f Space para colocar o cursor no primeiro espaço em branco.
  • i Enter Esc para dividir a linha.
  • l para mover o cursor uma linha para cima.
  • :.!date +\%Y\%m\%d para executar o comando
  • J para juntar as linhas novamente.

De :h :visual_example:

Atualmente, o comando ":" funciona apenas em linhas inteiras. Quando você seleciona parte de uma linha, fazer algo como ":! Date" substituirá a linha inteira. Se você deseja que apenas parte da linha seja substituída, será necessário fazer um mapeamento para ela. Em uma versão futura ":" pode funcionar em linhas parciais.

Veja também :h visual-operatorspara detalhes.

A partir deste comentário: Você também pode tentar o plugin vis ou NrrwRgn . Ambos devem lidar com isso muito bem. (Obrigado @ christian-brabandt pela dica).


2

Crie um mapeamento temporário para essas substituições. Por exemplo:

:vnoremap qq c<C-R>=system('wc -c | perl -pe chomp', @")<CR><ESC>

Então, no modo visual, você pode selecionar o texto, digitar qqe ele será substituído pela saída do comando. Neste exemplo wc -cprocessará sua seleção, que é o @"parâmetro perl -pe chompé necessário para remover uma nova linha à direita da saída.


1
Observe que esta solução é um invólucro da resposta do muru, criar um mapeamento para um uso único pode não ser o método mais eficiente.
statox

1

Tente o seguinte:

:let @a = system('date +\%Y\%m\%d')[:-2]
:'<,'>g/XXXX/s/XXXX/\=@a/g
  • A primeira linha salva a saída do datecomando no registro a, com a nova linha final removida.
  • A segunda linha inspeciona globalmente sua seleção e marca as linhas que contêm XXXX( g/XXXX/) e
  • substitua todas as instâncias do XXXXcom o conteúdo do registro a ( s/XXXX/\=@a/g)

Veja :h let-@e :h :globaltambém a seção "Sublist" em:h list-index


0

Plugin: Comandos do bloco visual (vis) por DrChip

Instalação vis.vba.gze dependência cecutil.vba.gzno packpath do vim8

# shell brace expansion (bash >=3.0, zsh>=2.6)
$ mkdir -p ~/.vim/pack/manual/start/{vis,cecutil}
$ vim http://www.drchip.org/astronaut/vim/vbafiles/vis.vba.gz
:UseVimball ~/.vim/pack/manual/start/vis
:e http://www.drchip.org/astronaut/vim/vbafiles/cecutil.vba.gz
:UseVimball ~/.vim/pack/manual/start/cecutil

O exemplo de OP se torna

:'<,'>B !date +\%Y\%m\%d 
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.