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?
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)
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
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!
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).
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()
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.