Выполните команду python в vim и получите вывод - PullRequest
5 голосов
/ 31 августа 2010

Когда Vim скомпилирован с поддержкой Python, вы можете создавать сценарии для Vim с помощью Python, используя команду :python. Как бы я использовал это для выполнения команды и вставки результата под курсором? Например, если бы я должен был выполнить :python import os; os.listdir('aDirectory')[0], я бы хотел, чтобы первое возвращенное имя файла было вставлено под курсором.

РЕДАКТИРОВАТЬ: Чтобы уточнить, я хочу тот же эффект, что и переход к терминалу, выполнение команды, копирование результата и выполнение "+p.

Ответы [ 4 ]

5 голосов
/ 31 августа 2010
:,!python -c "import os; print os.listdir('aDirectory')[0]"
2 голосов
/ 01 сентября 2010

Для меня хорошо работает следующее: напишите код Python, который вы хотите выполнить, в нужной строке.

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

после этого визуально выберите строки, которые вы хотите выполнить в Python

:'<,'>!python

и после этого код Python будет заменен на вывод Python.

2 голосов
/ 31 августа 2010

Вам необходимо присвоить его текущей строке, вы можете использовать модуль vim:

:python import os; import vim; vim.current.line=os.listdir('.')[0]
0 голосов
/ 01 сентября 2010

В конце концов, я решил это, написав скрипт с именем pyexec.vim и поместил его в каталог плагинов.Сценарий воспроизводится ниже:

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

Это работает, как и ожидалось для oneliners, но не совсем работает для нескольких операторов после блока.Таким образом, python pycurpos('a=2;if a==3:b=4;c=6') приведет к тому, что c всегда будет 6, поскольку блок if заканчивается первой строкой, следующей за ним.

Но для быстрого и грязного выполнения Python, чего я и хотел, сценарий является адекватным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...