Como passar o conteúdo do buffer vim através do comando shell e capturar a saída para uma janela dividida

7

Eu li muitos tópicos sobre a execução de comandos shell a partir do vim, muita documentação sobre comandos vim, .vimrc e tudo isso, mas eu simplesmente não consigo entender a linguagem "ex" ou os mapeamentos vim bem o suficiente para faça o que eu quero, então aqui estou fazendo essa pergunta. Aqui vai:

Eu tenho um buffer aberto no vim (usando o último MacVim estável no Snow Leopard, mas não no modo gui) cujo conteúdo posteriormente alimentarei em uma ferramenta de linha de comando que irá processá-lo e me fornecer alguma saída. O que eu quero é poder:

  1. Pressione uma tecla (ou combinação de teclas ou emita um comando vi)
  2. Executar meu utilitário de linha de comando com o conteúdo do meu buffer atual (que pode não ser salvo no arquivo) canalizado para ele
  3. Capture sua saída e mostre-a no vim, preferencialmente em uma nova janela dividida (como: ajuda)

Então, em resumo: eu posso rodar

$ cat ~/myinput.txt | myScript > output.txt

Mas eu quero fazer algo assim dentro do vim, colocando a saída em uma nova janela dividida, se possível.

UPDATE:
Claro, logo após postar, encontrei mais algumas informações sobre o assunto. Agora sei que posso fazer isso dentro do vim:

:%! myScript

E ele colocará a saída do myScript (com o conteúdo do buffer conectado a ele) no meu buffer atual, substituindo o que eu tenho nele agora.

Então, há uma maneira de colocar esses conteúdos em uma nova janela dividida, o buffer? Obrigado!

    
por malvim 05.04.2011 / 17:09

4 respostas

7

Eu colocaria algo assim em meu ~ / .vimrc ou em um arquivo com a extensão .vim em ~ / .vim / plugin /:

command! FW call FilterToNewWindow('myscript')

function! FilterToNewWindow(script)
    let TempFile = tempname()
    let SaveModified = &modified
    exe 'w ' . TempFile
    let &modified = SaveModified
    exe 'split ' . TempFile
    exe '%! ' . a:script
endfunction

Então você pode apenas fazer " :FW ".

Pode ser uma boa ideia alterar a definição do comando para exigir um argumento de nome de script de filtro para passar para a função em vez de "codificar".

    
por 05.04.2011 / 21:51
0

A função de @Heptite, mais genérica:

function! FilterToNewWindow()
    let TempFile = tempname()
    let SaveModified = &modified
    exe 'w ' . TempFile
    exe '!chmod +x ' . TempFile
    let &modified = SaveModified
    exe ':e ' . TempFile
    exe '%! ' . @%
   exe 'w!'
endfunction

" bash execute contents of current buffer and filter it to a new window
command! FW call FilterToNewWindow()

'' '

    
por 28.10.2016 / 13:26
0

Este comando fará metade do que você deseja.

map <Leader>r :!%:p<cr>

O buffer atual deve ser um executável com uma linha shebang para que isso funcione.

    
por 31.10.2016 / 20:31
0
por 10.05.2018 / 13:08