2011-10-20 2 views
0

Je tente d'écrire un script python qui peut automatiser vim, mais l'interface python vim ne me donne pas assez de puissance pour faire tout ce dont j'ai besoin. Je veux communiquer avec vim comme si mon script était un tty (capable d'émettre des instructions en "mode visuel", etc.). En ce qui concerne vim, mon script est un humain exécutant xterm (ou peu importe). Cela peut-il être fait sans construire mon propre émulateur de terminal en python?"scripting" vim en utilisant python avec plus de granularité

+1

ne peut pas vous faire des choses comme ': exec « V2jx normale »' partir de cette interface Python? – ninjalj

Répondre

1

Toutes les interfaces non-vimscript sont maudites: la seule façon de communiquer avec vim (sauf si vous souhaitez modifier/obtenir le contenu d'un tampon qui est disponible en utilisant l'objet tampon) sont execute (vim.command(string) en python) et eval (vim.eval(string) en python), les deux nécessitant des arguments de sérialisation. Si vous voulez simplement commencer à utiliser en mode visuel

vim.command("normal! V") 

ou

vim.eval("feedkeys('V')") 

. Mais si vous voulez, par exemple, de retourner une valeur à une fonction de l'appelant, vous devrez utiliser

import json 
# Some code that puts result into variable r 
# This won't work if r contains non-unicode strings, 
# you will have to write your own serializer in this case. 
# As far as I know, it will also fail if some characters in the string 
# can be represented only using surrogate pairs. 
vim.command("let reply=".json.dumps(r)) 
# Now in the caller function variable l:reply is defined