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.
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.
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.
déplacez le curseur sur cette ligne et, en mode normal, appuyez sur:
!!bash<cr>
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
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
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.
Ajoutez ce mappage à votre fichier .vimrc,
nmap <leader>E yyp:.!csh<CR>
Explication:
yy
Ligne courantep
Collez la ligne tirée en-dessous (et le curseur ira à la ligne suivante):.!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.