Выполнить выбор из сценария в Vim

Я пытаюсь включить vim в свой основной рабочий процесс. Главным моментом для меня было интерактивное редактирование и запуск программ/скриптов.

Например, учитывая, что я в настоящее время vimmed в test.py

print('hello')
x = 5
y = x+2
print(y)

Не выходя из vim, как бы я:
a) запустить весь скрипт, не покидая vim
б) запустить только "print (" hello ")"

Ответ 1

Комментарий и другой ответ указывают, как запустить файл с vim. Но они затушевывали некоторые действительно мощные возможности. Я хотел бы объяснить, как некоторые из них работают более подробно.

Самый простой способ запуска скрипта python в vim - просто вызвать интерпретатор python в файле, например

:!python %

или, как я предпочитаю делать, чтобы убедиться, что нет несохраненных изменений,

:w | !python %

Но даже нет необходимости иметь файл для запуска скрипта python в vim. Причина в том, что :w ! = Save! :w означает запись, и если аргумент не указан, происходит запись в файл, который вы редактируете. Однако вы можете писать в STDOUT, в другой файл или даже в другую программу. Поэтому, если вы хотите запустить свой буфер в виде кода на Python, не имея файла для сохранения и запуска, вы можете просто сделать:

:w !python

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

Теперь, когда это становится действительно круто. В vim :w - это команда "ex", например, команда, которую вы запускаете из командной строки vim, которая первоначально была из ex, очень старого текстового редактора unix. Замечательная вещь о командах ex заключается в том, что, поскольку все они основаны на линиях, вы можете прямо указать, к каким строкам вы хотите применить команду. Например:

:2w myfile.txt

будет записывать только строку 2 в файл "myfile.txt". Вы даже можете указать диапазон, например

:2,7w myfile.txt

будет писать строки 2-7 на "myfile.txt". Это означает, что, используя ваш пример, мы можем запускать

:1w !python

просто запустить

print('hello')

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

:'<,'>w !python

Чтобы сделать это более удобным, я бы рекомендовал добавить что-то вроде

xnoremap <leader>p :w !python<cr>

к вашему .vimrc. Затем вы можете визуально выбирать все, что хотите, и запускать его в виде кода на Python, набрав

\p

(замените \ на то, что вы создали в качестве своего лидера). Вы также можете сделать

nnoremap <leader>p :w !python<cr>

или же

nnoremap <leader>p :w | !python %<cr>

в зависимости от того, хотите ли вы сохранить файл или нет.

Ответ 2

Вы можете запустить программу из vim, используя :! , то есть :!python3 % для запуска вашего текущего скрипта.

Если вы хотите связать ключ с ним, другим простым способом было бы установить makeprg в исполняемый файл python :set makeprg=python3 а затем связать ключ :make<cr>. В этом случае я бы установил autocmds, которые переключают makeprg зависимости от типа файла.

Если вы хотите запустить простой оператор, вы можете использовать Python -c:

:!python3 -c 'print("Hello world")', или вы можете просто запустить :!python3 без аргументов, которые нужно сбросить в REPL, не покидая Vim.

Ответ 3

Создайте функцию для диапазона, как обсуждалось в этом вопросе:

fu PyRun() range
  echo system('python -c ' . shellescape(join(getline(a:firstline, a:lastline), "\n")))
endf

Создайте сопоставление для визуального режима:

vmap <C-F6> :call PyRun()<CR>

Затем вы можете выбрать диапазон и нажать Control - F6. Диапазон строк будет выполняться с помощью python. Результат будет отображаться в области команд.