Pertanyaan Jalankan perintah python dalam vim dan dapatkan hasilnya


Ketika Vim dikompilasi dengan dukungan Python, Anda bisa skrip Vim dengan Python menggunakan :python perintah. Bagaimana saya akan menggunakan ini untuk menjalankan perintah dan memasukkan hasilnya di bawah kursor? Misalnya, jika saya mengeksekusi :python import os; os.listdir('aDirectory')[0]Saya ingin nama file pertama dikembalikan untuk dimasukkan di bawah kursor.

EDIT: Untuk memperjelas, saya ingin efek yang sama seperti pergi ke terminal, mengeksekusi perintah, menyalin hasil dan mengeksekusi "+p.


5
2017-08-31 11:58


asal


Jawaban:


Berikut ini berfungsi dengan baik untuk saya: tulis kode python yang ingin Anda jalankan dalam garis yang Anda inginkan.

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

setelah itu secara visual pilih baris yang ingin Anda jalankan dengan python

:'<,'>!python

dan setelah itu kode python akan digantikan oleh output python.


2
2017-09-01 12:00



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

5
2017-08-31 12:06



Anda perlu menetapkannya ke baris saat ini, Anda dapat menggunakan modul vim:

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

2
2017-08-31 12:05



Pada akhirnya, saya memecahkannya dengan menulis skrip yang disebut pyexec.vim dan memasukkannya ke dalam direktori plugin saya. Skrip direproduksi di bawah ini:

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

Ini bekerja seperti yang diharapkan untuk oneliners, tetapi tidak cukup berfungsi untuk beberapa pernyataan setelah blok. Begitu python pycurpos('a=2;if a==3:b=4;c=6') akan menghasilkan c  selalu makhluk 6, sejak if blok berakhir dengan baris pertama yang mengikutinya.

Tapi untuk eksekusi python yang cepat dan kotor, yang saya inginkan, skripnya memadai.


0
2017-08-31 20:11