Exécuter la ligne actuelle dans bash à partir de vim

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

Est-ce possible?

Mise à jour: Idéalement, je cherche des solutions qui peuvent avoir des effets secondaires dans la shell externe. Par exemple, supposons que je dispose de 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 utilisant :q , alors l’alias n’est plus disponible.

Bien sûr, vous pouvez “écrire” n’importe quel contenu du fichier en cours dans le fichier stdin d’un autre programme:

 :.w !bash 

Ici (la partie avant w) se réfère à la gamme de lignes que vous écrivez, et . est uniquement la ligne actuelle. Ensuite, vous utilisez !bash pour écrire ces lignes sur bash.

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  :exec '!'.getline('.') 

La réponse de Daan fonctionne aussi, je lui ai donné une note positive.

déplace le curseur sur cette ligne et en mode normal, appuie sur:

 !!bash 

Cela pourrait être un commentaire si je peux commenter.

Concernant les lignes de redirection / pipe du tampon courant dans vim à la commande externe, inspirez-vous de la bonne réponse de Daan Bakker, j’ai écrit ici ( https://stackoverflow.com/a/40002312/3625404 ) une question concernant l’exécution du script python ( tampon courant).

Outre l’exécution du tampon entier, la manière d’exécuter une plage de lignes via une commande externe est démontrée. Pour gagner du temps, je le copie simplement ci-dessous.

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

Dans vim, vous pouvez simplement redirect n’importe quelle plage de votre tampon actuel vers une commande externe (que ce soit 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 l’exécutera, qu’il soit enregistré 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 pourriez faire quelque chose de persistant, par exemple, certains keymaps.

 nnoremap  :.w !python vnoremap  :w !python 

d’abord une ligne courante, une seconde une 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 concernant la commande normale, pas une ligne de commande.

 :h command-range 

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