2010-08-31 9 views
5

Wenn Vim mit Python-Unterstützung kompiliert wird, können Sie Vim mit Python mithilfe des Befehls :python scripten. Wie würde ich diesen Befehl ausführen, um den Befehl auszuführen und das Ergebnis unter den Cursor einzufügen? Wenn ich beispielsweise :python import os; os.listdir('aDirectory')[0] ausführen soll, möchte ich, dass der erste zurückgegebene Dateiname unter dem Cursor eingefügt wird.Führen Sie einen Python-Befehl innerhalb von vim aus und rufen Sie die Ausgabe ab.

EDIT: Um zu klären, möchte ich den gleichen Effekt wie zum Terminal gehen, die Ausführung des Befehls, das Kopieren des Ergebnisses und "+p ausführt.

Antwort

2

Folgendes funktioniert für mich: schreiben Sie den Python-Code, den Sie in der gewünschten Zeile ausführen möchten.

import os 
print(os.listdir('.')) 

danach visuell die Linien wählen Sie in Python

:'<,'>!python 

und danach der Python-Code durch die Python Ausgabe ersetzt wird ausgeführt werden sollen.

+0

Aber das verwendet nicht die interne Python-Unterstützung von Vim Vims Shell-Unterstützung. –

+0

ja, du hast recht, das habe ich übersehen. – skeept

+1

Dies erreicht am direktesten den erklärten Wunsch, * den gleichen Effekt wie beim Terminal zu erreichen, den Befehl auszuführen, das Ergebnis zu kopieren und "+ p *", ausgedrückt durch das OP, auszuführen. –

2

Sie müssen es auf die aktuelle Zeile zuweisen, können Sie das vim-Modul verwenden:

:python import os; import vim; vim.current.line=os.listdir('.')[0] 
+0

Das funktioniert zwar, aber Sie erhalten einen Befehl wie ': python import os; Import vim; vim.current.line = vim.current.line [: vim.current.window.cursor [1]] + os.listdir ('blah') [0] + vim.current.line [vim.current.window.cursor [1]:] 'das ist ein bisschen nervig: -S –

+0

Sie könnten einen Befehl erstellen, der das Verzeichnis als Parameter übernimmt und in Ihren .vimrc: ' command -bargs = 1 FirstFile: python import os; Import vim; vim.current.line = vim.current.line [: vim.current.window.cursor [1]] + os.listdir ('') [0] + vim.current.line [vim.current.window.cursor [1]:] ' Und Sie können auch einige Tastenkombinationen für ein bestimmtes Verzeichnis zuordnen: ' nmap ff: FirstFile. ' –

5
:,!python -c "import os; print os.listdir('aDirectory')[0]" 
+0

@Chinmay Kanchi: lesen Sie den Code erneut –

+0

Whoops! Sieht so aus, als könnte ich heute nicht lesen ... –

+0

Es wird mir nicht erlauben, die Antwort noch einmal aufzuschreiben, es sei denn, es wurde bearbeitet, stört es dich, einen zusätzlichen Platz oder etwas hinzuzufügen und es zu speichern, damit ich upvoten kann? –

0

Am Ende löste ich es durch ein Skript namens pyexec.vim Schreiben und steckte es in mein Plugin-Verzeichnis.

python << endpython 
import vim 
def pycurpos(pythonstatement): 
    #split the python statement at ; 
    pythonstatement = pythonstatement.split(';') 
    stringToInsert = '' 
    for aStatement in pythonstatement: 
     #try to eval() the statement. This will work if the statement is a valid expression 
     try: 
      s = str(eval(aStatement)) 
     except SyntaxError: 
      #statement is not a valid expression, so try exec. This will work if the statement is a valid python statement (such as if a==b: or print 'a') 
      #if this doesn't work either, fail 
      s = None 
      exec aStatement 


     stringToInsert += s if s is not None else '' 

    currentPos = vim.current.window.cursor[1] 
    currentLine = vim.current.line 
    vim.current.line = currentLine[:currentPos]+stringToInsert+currentLine[currentPos:] 

endpython 

Dies funktioniert wie für oneliners erwartet, aber funktioniert nicht ganz für mehrere Anweisungen nach einem Block: Das Skript wird im Folgenden wiedergegeben. So python pycurpos('a=2;if a==3:b=4;c=6') wird cimmer werden 6, da der if Block endet mit der ersten Zeile nach ihm.

Aber für schnelle und schmutzige Python-Ausführung, die ich wollte, ist das Skript ausreichend.

Verwandte Themen