Как загрузить скрипт vim python после загрузки всех буферов? - PullRequest
1 голос
/ 08 марта 2020

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

let s:plugin_root_dir = fnamemodify(resolve(expand('<sfile>:p')), ':h')

python3 << EOF
import sys
from os.path import normpath, join
import vim
plugin_root_dir = vim.eval('s:plugin_root_dir')
python_root_dir = normpath(join(plugin_root_dir, '..', 'python'))
sys.path.insert(0, python_root_dir)
import sample
EOF

и в своем файле python я написал:

import vim

vim.command("sign define gdlinterror text=✕")
vim.command("sign define gdlintwarning text=")
print(vim.current.buffer[0])

Однако я получаю следующую ошибку:

Error detected while processing function provider#python3#Call:
line   18:
Error invoking 'python_execute' on channel 4 (python3-script-host):
Traceback (most recent call last):
  File "<string>", line 7, in <module>
  File "/home/chrismg/Projects/Python/sampleplugin/python/sample.py", line 5, in <module>
    print(vim.current.buffer[0])
  File "/home/chrismg/.local/lib/python3.6/site-packages/pynvim/api/buffer.py", line 45, in __ge
titem__
    return self.request('nvim_buf_get_lines', i, i + 1, True)[0]
IndexError: list index out of range

Поэтому, когда я попробовал те же команды в vim, используя :python3, меня удивило, что это работает очень хорошо, но не в сценарии python. Поэтому, когда я проверил len из vim.current.buffer, я получил 0. Я думаю, что это количество строк в файле, что в моем случае неверно, поэтому я задался вопросом, выполняется ли этот сценарий python перед буфер загружается? Это объясняет, почему существует ошибка индекса вне границ. Однако я не знаю, как запустить плагин vim после завершения загрузки буфера. Любая помощь в выяснении, что делать, очень ценится Спасибо!

1 Ответ

1 голос
/ 08 марта 2020

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

Вы должны использовать свой основной модуль Python (sample.py) для определения функций, а не выполнить код на верхнем уровне. Затем вы можете использовать сопоставления или авто-команды для запуска этих функций при определенных c событиях.

Например, для запуска компиляции при нажатии F5:

nnoremap <silent> <F5> :python3 sample.compile()<CR>

Или для добавления авто лицензионный комментарий к началу с <Leader>L

nnoremap <silent> <Leader>L :0put =py3eval('sample.license_text()')<CR>

Или для проверки синтаксиса файлов Ruby при их загрузке:

autocmd FileType ruby python3 sample.check_syntax('ruby')

Как видите, пока здесь вы можете использовать код Python, вы в основном делаете это, вызывая команду :python3 или используя функцию py3eval(), но при этом все еще задействует немало Vimscript. Таким образом, в конечном итоге вам действительно нужно хорошо понимать, как работает Vimscript, чтобы иметь возможность эффективно писать плагины Vim.

То же самое верно и для использования модуля vim из Python. Так как вы в основном используете его для доступа к переменным Vimscript и то, как у вас есть доступ к объектам Vim, близко соответствует тому, что вам предлагают функции Vim, знание Vimscript поможет вам в этом.

Возможность написания плагинов Vim в Python может быть очень удобным, когда вы используете его для выполнения sh того, что было бы невозможно или очень трудно сделать в чистом Vimscript, например, для доступа к веб-ресурсам (например, онлайн-словарь поиск), анализирует сложные форматы файлов, такие как XML или CSV, с полной точностью, обращается к базам данных или сетевым серверам или оценивает синтаксис кода Python (поскольку вы можете легко использовать Python для анализа и запуска Python фрагментов. )

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

Если вы хотите больше узнать о Vimscript и о том, как писать с ним плагины, я настоятельно рекомендую Le Арн Вимскрипт Сложный путь от Стива Ло sh. Это отличный ресурс, если вы заинтересованы в создании плагинов Vim.

...