web-dev-qa-db-fra.com

Comment pouvez-vous utiliser Python dans Vim?

Je perds beaucoup de temps entre Vim et Python. Je trouve qu'il est trop lent pour copier-coller manuellement de Python vers Vim et vice versa. Un bon exemple cassé est:

%! python pour i dans xrange (25); imprimer 6 * i\n

Comment pouvez-vous faire de tels réglages directement dans Vim? [Résolu]

[Clarification] J'ai besoin de choses à Vim, comme des séquences d'impression, de l'arithmétique ... - des choses que je ne peux pas faire dans Vim.

[?] Quelqu'un peut-il préciser ce point: "votre script peut lire stdin pour agir directement sur les lignes données (.,%, ...). "

[Plus de précisions]

Si je veux imprimer "Bonjour" aux lignes 4, 5, 6 et 7, qu'est-ce qui ne va pas:

: 4-7! Python -c "affiche 'bonjour'"

Le point . modifie la ligne en cours. Puis-je imprimer sur plusieurs lignes 7, 32 et 99:

: 7,32,99! Python -c "affiche 'bonjour'"

Clairement ne fonctionne pas. Comment?

Dans l’une de vos fenêtres vim, tapez quelque chose comme ceci:

for x in range(1,10):
    print '-> %d' % x

Sélectionnez visuellement ces deux lignes (V pour démarrer le mode visuel) et tapez ce qui suit:

:!python

Parce que vous avez appuyé sur ':' en mode visuel, cela ressemblera à:

:'<,'>!python

Appuyez sur Entrée et la sélection est remplacée par la sortie des instructions print. Vous pouvez facilement le transformer en une cartographie:

:vnoremap <f5> :!python<CR>
164
too much php

Quelqu'un peut-il préciser ce point: "votre script peut lire à partir de stdin pour agir directement sur les lignes données (.,%, ...)."

Une utilisation courante consiste à trier les lignes de texte à l'aide de la commande 'sort' disponible dans votre shell. Par exemple, vous pouvez trier le fichier entier en utilisant cette commande:

:%!sort

Vous pouvez également trier quelques lignes en les sélectionnant en mode visuel, puis en tapant:

:!sort

Vous pouvez trier les lignes 5 à 10 en utilisant cette commande:

:5,10!sort

Vous pouvez écrire votre propre script de ligne de commande (en supposant que vous savez comment faire cela) qui inverse les lignes de texte. Cela fonctionne comme ceci:

bash$ myreverse 'hello world!'
!dlrow olleh

Vous pouvez l'appliquer à l'un de vos fichiers ouverts dans vim de la même manière que vous avez utilisé sort:

:%!myreverse      <- all lines in your file are reversed
6
too much php

Dans votre exemple, il semble que vous souhaitiez exécuter un script Python et que la sortie du script apparaisse dans le tampon Vim actuel. Si cela est correct, vous pouvez effectuer les opérations suivantes à la ligne de commande dans Vim:

%!python -c "for i in xrange(25): print 6*i"

L'option -c de python lui donne un script à exécuter. Cependant, cette technique ne peut être utile que dans de très brefs cas, car contrairement à d'autres langages, Python ne se prête pas bien à l'écriture de programmes complets sur une seule ligne.

5
Greg Hewgill

si vous avez écrit votre script python dans un nouveau tampon [No Name], vous pouvez utiliser les éléments suivants:

:0,$!python

quand vous avez un tampon sans nom, vous ne pouvez pas utiliser '%', d'où la nécessité de 0, $ qui signifie toutes les lignes du tampon commençant par la ligne zéro jusqu'à la dernière ligne

la sortie sera écrite dans le tampon et malheureusement pas à la fin

1
serup

Je pense que vous ne manquez pas le drapeau -c. Par exemple:

:.!python -c "print 'hello'"

Vous ne devriez pas que le script que vous fournissez serve de filtre sur la sélection de ligne. C'est-à-dire que votre script peut lire à partir de stdin pour agir directement sur les lignes données (., %, ...). Cependant, vous feriez mieux de placer les commandes python dans un fichier de script qui lui est propre.

1
Martin Carpenter

Vous pouvez exécuter le code, lire la sortie sur le curseur et terminer par u, en supposant que vous exécutiez du code python. Simple et rapide.

:r !python %

u

J'aime bien sur la cartographie et la sélection en mode visuel, comme avec too-much-php , parce que la base reste simple!

1
hhh

Je viens d'écrire le module suivant qui vous permet de modifier un tampon temporaire dans vim directement dans l'interpréteur Python.

http://philipbjorge.github.com/EditREPL/

1
philip bjorge

Si je veux imprimer "Bonjour" aux lignes 4, 5, 6 et 7, qu'est-ce qui ne va pas:

Si vous voulez faire quelque chose à des endroits choisis au hasard dans votre fichier, vous ferez mieux d’enregistrer et de les rejouer. Accédez à la première ligne que vous souhaitez modifier, puis appuyez sur qz pour commencer l’enregistrement dans le registre z. Faites les modifications souhaitées pour cette ligne et appuyez à nouveau sur q lorsque vous avez terminé. Passez à la ligne suivante que vous souhaitez modifier et appuyez sur @z pour rejouer la macro.

0
too much php

Si vous voulez faire des appels python sans compiler vim avec l'interpréteur python (cela vous permettrait d'écrire des plug-ins en Python, mais c'est également nécessaire pour Omnicomplete), vous pouvez essayer comme ceci:

:.!python -c "import os; print os.getcwd()"

Cela vous indiquerait où vous vous trouvez dans le lecteur (chemin actuel).

Numérotons maintenant quelques lignes, en partant d'un fichier vide pour que nous puissions voir le résultat facilement:

:.!python -c "for i in range(1,101): print i"

(vim numérote les lignes de 1 à 0) Nous avons maintenant le numéro de chaque ligne dans chaque ligne jusqu’à la ligne 100.

Mettons maintenant un petit script dans votre chemin actuel (comme indiqué ci-dessus) et exécutons-le pour voir comment il fonctionne. Copions-collons ce stupide. En réalité, vous trouverez le plus utile de faire un script produisant une ligne par ligne, mais vous n’avez pas à le faire car ce script indique:

print "hi"

try:
    while True:
        i=raw_input()
        print "this was:",i
except EOFError:
    print "bye"

Ainsi, vous pouvez appeler, par exemple (imaginons que vous l’appeliez "what.py"):

: 10,20! Python quoi.py

(Notez que la complétion par onglet des noms de fichiers fonctionne, vous pouvez donc vérifier que c'est bien dans le chemin)

Comme vous pouvez le constater, chaque ligne est transmise au script en tant qu’entrée standard. D'abord, il affiche "hi", à la fin "bye" et, entre les deux, vous indiquez "this:" plus la ligne. De cette façon, vous pouvez traiter ligne par ligne. Remarquez que vous pouvez effectuer des tâches plus complexes que le traitement ligne par ligne, vous pouvez en fait considérer les lignes précédentes. Pour ce genre de choses, je préférerais importer sys et le faire comme ceci:

import sys

print "hello"

for i in sys.stdin.readlines():
    i = i.rstrip("\n") # you can also prevent print from doing \n instead
    print "here lyeth",i

print "see you"

J'espère que cela pourra aider.

0
nachik

Je pense que ce que tu veux vraiment est expliqué ici

0
André

Sous Windows, si vous modifiez le script python, procédez comme suit:

!start python my...

et appuyez sur tab pour parcourir les noms de fichiers disponibles, jusqu'à ce que vous trouviez votre correspondance:

!start python myscript.py

Il s'exécutera dans une nouvelle fenêtre cmd. Personnellement, je préfère faire !start cmd et à partir de là lancer Python, car il est plus facile de déboguer à partir des messages d'erreur éventuels.

0