web-dev-qa-db-fra.com

Vim: diriger le texte sélectionné vers Shell cmd et recevoir la sortie sur la ligne d'informations / commande vim

Je veux diriger le texte sélectionné vers une commande Shell et recevoir la sortie d'une ligne de cette commande Shell sur la ligne de commande/info vim?

Ce que j'essaie vraiment de faire: canaliser le texte sélectionné vers une commande Shell de type Pastebin et je veux recevoir la sortie de la cmd Shell (qui est le lien http vers Pastebin). Est-ce possible?

54
ikwyl6

Je le ferais comme ça:

Placez cette fonction dans votre vimrc:

function Test() range
  echo system('echo '.shellescape(join(getline(a:firstline, a:lastline), "\n")).'| pbcopy')
endfunction

Cela vous permettra d'appeler cette fonction en faisant:

:'<,'>call Test()

Ensuite, vous pouvez également mapper cela comme ceci (juste sous la déclaration de fonction dans votre vimrc):

com -range=% -nargs=0 Test :<line1>,<line2>call Test()

Vous pouvez donc appeler la fonction en procédant comme suit:

:'<,'>Test

Remarque::<','> sont des sélecteurs de plage, pour les produire il suffit de sélectionner les lignes pertinentes en mode visuel puis de passer en mode commande (en appuyant sur la touche deux-points)

17
matias

Pour la version multi-lignes, vous pouvez le faire après avoir sélectionné le texte:

:'<,'>:w !command<CR>

Vous pouvez le mapper à un raccourci en mode visuel simple comme celui-ci:

xnoremap <leader>c <esc>:'<,'>:w !command<CR>

Appuyez sur la touche de repère + c en mode visuel pour envoyer le texte sélectionné à un stdin de la commande. stdout de la commande sera imprimé sous la barre d'état de vim.

Exemple du monde réel avec CoffeeScript:

https://github.com/epeli/vimconfig/commit/4047839c4e1c294ec7e15682f68563a0dbf0ee6d

100
Epeli

Mettez simplement en surbrillance les lignes à l'aide de la sélection de ligne visuelle shift-v, le hit:! et tapez la commande à laquelle vous souhaitez envoyer les commandes. La sortie résultante remplacera alors votre texte sélectionné.

Lorsque vous tapez votre commande, elle apparaîtra en bas comme:

:'<,'>!somecmd

le '<,'> indique que la plage que vous avez visuellement sélectionnée sera transmise à la commande spécifiée après le!

30
Neg_EV

Vous devriez peut-être utiliser quelque chose comme

:echo system('echo '.shellescape(@").' | YourCommand')

À partir d'une version vim-7.4, il est préférable d'utiliser

:echo system('YourCommand', getreg('"', 1, 1))

. C'est fondamentalement la seule façon de garder les octets NUL intacts s'ils sont présents dans le fichier. Qui passe @" d'une manière ou d'une autre transformera les octets NUL en NL (nouvelle ligne).

4
ZyX

La solution de @matias ne fonctionne pas bien pour moi, car il semble que shellescape ajoutera \ à chaque ligne.

J'utilise donc sed pour accomplir cela, et cela fonctionne très bien!

"dump selected lines
function! DumpLines() range
  echo system('sed -n '.a:firstline.','.a:lastline.'p '.expand('%'))
endfunction

com! -range=% -nargs=0 Dump :<line1>,<line2>call DumpLines()
2
Harry Lee

Une autre réponse:

function Pastebin() range
    let savedreg=@"
    silent execute a:firstline.",".a:lastline."yank"
    python import vim, subprocess
    python p=subprocess.Popen(["Pastebin"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    python p.stdin.write(vim.eval('@"'))
    let @"=savedreg
    python p.stdin.close()
    python retstatus=p.poll()
    python print p.stdout.read()
endfunction

Nécessite python support. Utilisez-le comme la fonction de matias.

1
ZyX