Как вы можете использовать Python в Vim?


Я трачу много времени между Vim и Python. Я нахожу это слишком медленным, чтобы вручную скопировать-вставить из Python в Vim и наоборот. Хороший сломанный пример:

%!python для i в xrange(25); print 6*i n

Как вы можете делать такие настройки прямо в Vim? [решена]

[пояснение] мне нужны вещи для Vim, такие как последовательности печати, арифметика... - чего я не могу сделать в Напор.

[?] может кто-нибудь уточнить этот момент: "ваш скрипт может читать из stdin, чтобы работать непосредственно на строках, заданных (.,%, ...)."

[Уточнения]

Если я хочу напечатать "привет" в строках 4,5, 6 и 7, что не так:

: 4-7!питон -с "напечатать " привет""

точка . изменяет текущую строку. Могу ли я печатать на нескольких строках 7, 32 и 99:

: 7,32,99!питон -с "напечатать " привет""

явно не работает. Как?

12 51

12 ответов:

в любом из ваших окон vim введите что-то вроде этого:

for x in range(1,10):
    print '-> %d' % x

визуально выберите обе эти строки (V для запуска визуального режима) и введите следующее:

:!python

потому что вы нажали": "в визуальном режиме, что в конечном итоге будет выглядеть так:

:'<,'>!python

нажмите enter и выбор будет заменен на выход print заявления. Вы можете легко превратить его в отображение:

:vnoremap <f5> :!python<CR>

может ли кто-нибудь развить этот момент: "ваш скрипт может читать из stdin, чтобы работать непосредственно на заданных строках (.,%, ...)."

обычно используется для сортировки строк текста с помощью команды "сортировать", доступной в вашей оболочке. Например, вы можете отсортировать весь файл с помощью следующей команды:

:%!sort

или вы можете отсортировать всего несколько строк, выбрав их в визуальном режиме, а затем набрав:

:!sort

вы можете сортировать строки 5-10, используя это команда:

:5,10!sort

вы можете написать свой собственный скрипт командной строки (предполагая, что вы знаете, как это сделать), который меняет строки текста. Это работает следующим образом:

bash$ myreverse 'hello world!'
!dlrow olleh

вы можете применить его к одному из ваших открытых файлов в vim точно так же, как вы использовали sort:

:%!myreverse      <- all lines in your file are reversed

из вашего примера кажется, что вы хотите выполнить скрипт Python и вывести вывод скрипта в текущем буфере Vim. Если это правильно, то вы можете сделать следующее в командной строке в Vim:

%!python -c "for i in xrange(25): print 6*i"

The до python дает ему скрипт для запуска. Однако вы можете найти этот метод полезным только в очень коротких случаях, потому что в отличие от некоторых других языков, Python не очень хорошо подходит для написания полных программ на одном языке линия.

Я думаю, что вы просто не хватает -c флаг. Например:

:.!python -c "print 'hello'"

вы не должны, что сценарий, который вы предоставляете действует как фильтр на выбор строки. То есть, ваш скрипт может читать из stdin для работы непосредственно на заданных линиях (.,%, ...). Однако что-то большее, чем самые простые задачи, и вам было бы лучше поместить команды python в собственный файл скрипта.

Вы можете выполнить код, читать вывод на курсор и закончить с u, предположим, вы выполняете код python. Просто и быстро.

:r !python %

u

мне нравится это над отображением и выбором-в-визуальном-режиме, как с too-much-php, потому что он держит базы просто!

Я только что написал следующий модуль, который позволяет редактировать временный буфер в vim непосредственно в интерпретаторе Python.

http://philipbjorge.github.com/EditREPL/

Если вы написали свой скрипт python в новом буфере [без имени], то вы можете использовать следующее:

:0,$!python

когда у вас нет буфера имен, вы не можете использовать"%", следовательно, нужно 0,$ что означает все строки в буфере, начиная с нулевой строки до последней строки

вывод будет записан в буфер и, к сожалению, не в конце

если я хочу напечатать "привет" в строках 4,5, 6 и 7, что не так:

если вы хотите сделать что-то в случайно выбранных местах по всему файлу, вам лучше записывать нажатия клавиш и воспроизводить их. Перейдите к первой строке, которую вы хотите изменить, и нажмите qz для начала записи в регистр z. Делайте все изменения, которые вы хотите для этой строки и нажмите q снова, когда вы закончите. Перейдите к следующей строке, которую вы хотите изменить, и нажмите @z to повторите макрос.

если вы хотите сделать некоторые вызовы python без компиляции vim с интерпретатором python (что позволит вам писать плагины в Python, и это также необходимо для Omnicomplete в любом случае), вы можете попробовать так:

:.!python -c "import os; print os.getcwd()"

это скажет вам, где вы находитесь в диске (текущий путь).

теперь давайте пронумеруем несколько строк, начиная с пустого файла, чтобы мы могли легко увидеть результат:

:.!python -c "for i in range(1,101): print i"

(vim номера строк от 1 не 0) Теперь у нас есть только номер каждой строки в каждой строке до строки 100.

теперь давайте поместим небольшой скрипт в ваш текущий путь (как показано выше) и запустим его, посмотрим, как он работает. Давайте скопируем вставить этот глупый. На самом деле вы найдете наиболее полезным сделать скрипт, который выводит одну строку на строку, но вам не нужно этого делать, как показывает этот скрипт:

print "hi"

try:
    while True:
        i=raw_input()
        print "this was:",i
except EOFError:
    print "bye"

так что вы можете позвонить, например (представьте, что вы назвали его "what.py"):

: 10,20!python what.py

(обратите внимание, что вкладка завершение имен файлов работает, так что вы можете проверить это на самом деле в пути)

как вы можете видеть, каждая строка подается в скрипт в качестве стандартного ввода. Сначала он выводит "привет", в конце" пока "и между ними, для каждой строки вы выводите" это было: "плюс строка. Таким образом, вы можете обрабатывать построчно. Обратите внимание, что вы можете делать более сложные вещи, чем обработка строки за строкой, вы можете рассмотреть предыдущие строки. Для таких вещей я бы скорее импортировал sys и делал это так это:

import sys

print "hello"

for i in sys.stdin.readlines():
    i = i.rstrip("\n") # you can also prevent print from doing \n instead
    print "here lyeth",i

print "see you"

надеюсь, что это поможет.

Я думаю, что вы действительно хотите это объяснить здесь.

в Windows, Если вы редактируете скрипт python, просто сделайте:

!start python my...

и нажать tab для циклического перемещения по доступным именам файлов, пока не будет найдено совпадение:

!start python myscript.py

Он будет работать в новом cmd окно. Лично я предпочитаю делать !start cmd и оттуда запустить Python, так как это легче отлаживать от возможных сообщений об ошибках.