web-dev-qa-db-fra.com

Execute la ligne courante en bash depuis vim

Cette question est similaire à Vim: exécuter le fichier actuel? mais au lieu d’exécuter le fichier en cours, je souhaite exécuter uniquement la ligne en cours. 

Est-ce possible?

Mise à jour: Idéalement, je recherche des solutions pouvant avoir des effets secondaires sur l’enveloppe externe .Par exemple, supposons que j’ai la ligne suivante:

alias foo=bar

Après avoir exécuté la commande dans vim, si je lance un shell avec :sh, l'alias foo est disponible, mais si je quitte vim à l'aide de :q, l'alias n'est plus disponible.

51
merlin2011

Bien sûr, vous pouvez «écrire» n'importe quel contenu du fichier actuel dans le stdin d'un autre programme:

:.w !bash

Ici, . (la partie avant w) fait référence à la plage de lignes que vous écrivez, et . correspond uniquement à la ligne actuelle. Ensuite, vous utilisez !bash pour écrire ces lignes dans bash.

87
Daan Bakker

Je fais ce genre de chose tout le temps avec:

:exec '!'.getline('.')

Vous pouvez même créer un mappage dans votre fichier .vimrc:

nmap <F6> :exec '!'.getline('.')

La réponse de Daan fonctionne également, je lui ai donné un vote positif.

28
cforbish

déplacez le curseur sur cette ligne et, en mode normal, appuyez sur:

!!bash<cr>
13
Kent

Cela pourrait être un commentaire si je peux commenter.

En ce qui concerne les lignes de redirection/canalisation du tampon actuel dans vim vers une commande externe, inspirée par la réponse géniale de Daan Bakker, j’ai écrit que je répondais ici ( Https://stackoverflow.com/a/40002312/3625404 ), sur une question concernantrun script python (tampon courant).

En plus du tampon complet, il montre comment exécuter une plage de lignes via une commande externe. Pour gagner du temps, je viens de le copier ci-dessous.

#####################

Dans vim, vous pouvez simplement rediriger n'importe quelle plage de votre tampon actuel vers une commande externe (bash, python ou votre propre script python).

# redirect whole buffer to python
:%w !python

supposons que votre tampon actuel contienne deux lignes comme ci-dessous,

import numpy as np
print np.arange(12).reshape(3,4)

alors :%w !python le lancera, qu’il soit sauvegardé ou non. et imprimez quelque chose comme ci-dessous sur votre terminal , 

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

Bien sûr, vous pouvez créer quelque chose de persistant, par exemple des cartes de clé.

nnoremap <F8> :.w !python<CR>
vnoremap <F8> :w !python<CR>

la première ligne en cours, la seconde en sélection visuelle, via un interpréteur python.

#!! be careful, in vim ':w!python' and ':.w !python' are very different, the
first write (create or overwrite) a file named 'python' with contents of
current buffer, the second redirect the selected cmdline range (here dot .,
which mean current line) to external command (here 'python').

pour la gamme cmdline, voir 

:h cmdline-ranges

pas en dessous de un, qui concerne la commande normale, pas un cmdline.

:h command-range

inspiré par https://stackoverflow.com/a/19883963/3625404

4
qeatzy

Considérez la commande suivante lancée sur le terminal,

seq 0 10 | xargs printf "%02x "

La sortie attendue est,

00 01 02 03 04 05 06 07 08 09 0a

Considérez que vous avez cette commande ci-dessus écrite dans un fichier. Pour exécuter cette commande récupérer cette sortie respective dans ce fichier, vous pouvez ajouter ce mappage dans le vôtre .vimrc,

nmap <leader>E :exec 'r!'.getline('.')<CR>

Notez que, pour exécuter la ligne mentionnée ci-dessus, vous devez l'écrire en ajoutant le caractère d'échappement pour '%' comme suit,

seq 0 10 | xargs printf "\%02x "

Allez cette ligne dans votre fichier et appuyez sur <leader>E. Dans mon cas, <leader> est associé à , et je vais donc appuyer sur ,E

0
Rohan Ghige

Si j'ai une commande sur une ligne de texte dans vi/vim comme ceci "

ls -la

Positionnez le curseur n'importe où sur la ligne et faites ":. !!" et appuyez sur Retour.

C’est-à-dire: retour de deux points bang bang

Cela exécutera le texte de cette ligne dans le shell actuel à partir de vi/vim et le résultat sera inséré dans le fichier texte.

Je pense que c'est ce que vous demandiez? c'est comme par magie.

0
Brux

Ajoutez ce mappage à votre fichier .vimrc,

nmap <leader>E yyp:.!csh<CR>

Explication:

  1. yy Ligne courante
  2. p Collez la ligne tirée en-dessous (et le curseur ira à la ligne suivante)
  3. :.!csh<CR> Exécutez (en utilisant csh) cette ligne nouvellement collée à la place. La sortie de cette ligne remplace cette ligne actuelle, donc avant d'exécuter la ligne, elle a été collée et collée ci-dessous.
0
Rohan Ghige