Comment exécuter l'instruction python pour chaque ligne?

10

J'ai l'exemple de code suivant qui modifie la ligne actuelle à l'aide de l'instruction Python:

:py import vim; vim.current.line="["+vim.current.line+"]"

Comment puis-je exécuter cette instruction pour chaque ligne du fichier actuel?

Connexes: Comment pouvez-vous utiliser Python dans Vim? à stackoverflow

Kenorb
la source

Réponses:

10

Vous pouvez utiliser la pydocommande disponible depuis Vim 7.4, le manuel décrit comment cela fonctionne mieux que moi:

: [plage] pydo {corps}

Exécutez la fonction Python "def _vim_pydo (ligne, linge): {corps}" pour chaque ligne de la [plage], avec les arguments de fonction étant définis sur le texte de chaque ligne tour à tour, sans <EOL> final, et le courant numéro de ligne. La fonction doit renvoyer une chaîne ou None. Si une chaîne est renvoyée, elle devient le texte de la ligne du tour en cours. La valeur par défaut pour [plage] est le fichier entier: "1, $".

Pour votre exemple, vous pouvez utiliser une commande comme:

:python import vim
:pydo vim.current.buffer[linenr - 1] = '[%s]' % line

Le linenr - 1bit est là parce que les lignes vim.current.buffersont indexées 0 mais Vim commence à compter les lignes à partir de 1.

La bonne chose est que vous pouvez facilement définir une commande personnalisée pour exécuter votre code Python sur une gamme de lignes:

command! -range=% BracketLines 
    \ <line1>,<line2>pydo vim.current.buffer[linenr - 1] = '[%s]' % line
toro2k
la source
1
Il est disponible depuis vim 7.4.
kenorb
7

Vous pouvez obtenir le tampon actuel avec vim.current.buffer, qui est un itérable; vous pouvez utiliser une forboucle pour obtenir chaque ligne.

Vous pouvez modifier les lignes en leur affectant; donc en mettant cela ensemble, nous obtenons:

:py from vim import *
:py for i, line in enumerate(current.buffer): current.buffer[i] = '[%s]' % line

Voir aussi :help python-buffer.

Martin Tournoij
la source