Ecrire un plugin vim en Python
Je crée un plugin pour Vim (Neovim) en me référant à l'article lié ci-dessus. Lorsque le fichier Python s'est agrandi et que j'ai essayé de le diviser, j'ai un peu trébuché pour que je partage la solution.
Dans cet article, à titre d'exemple, créons un plug-in qui affiche le titre d'une page Web à l'aide du module de requêtes.
sample-vim-plugin
plugin/
sample_vim_plugin.vim
src/
sample_vim_plugin.py
requests_caller.py
plugin/sample_vim_plugin.vim
scriptencoding utf-8
if exists('g:loaded_sample_vim_plugin')
finish
endif
let g:loaded_sample_vim_plugin = 1
let s:save_cpo = &cpo
set cpo&vim
py3file <sfile>:h:h/src/sample_vim_plugin.py
function! sample_vim_plugin#print_title(url)
py3 sample_vim_plugin_print_title(vim.eval('a:url'))
endfunction
let &cpo = s:save_cpo
unlet s:save_cpo
src/sample_vim_plugin.py
import vim
import requests_caller
def sample_vim_plugin_print_title(url):
print(requests_caller.get_title(url))
requests_caller.py
import requests
from bs4 import BeautifulSoup
def get_title(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
return soup.title.text
Je gère les plugins avec dein, donc quand j'ajoute le plugin ci-dessus au fichier toml et que je lance neovim
ModuleNotFoundError: No module named 'requests_caller'
Il est dit que.
Je voudrais résoudre le problème que ce module ne peut pas être trouvé.
Dans "Traitement du'runtimepath'in Python"
En Python, au lieu d'utiliser la liste des chemins pour 'runtimepath', vim.VIM_SPECIAL_PATH Un répertoire spécial appelé est utilisé. Ce répertoire est utilisé dans sys.path Quand et quand vim.path_hooks est utilisé dans sys.path_hooks, 'runtimepath' {Rtp} / python2 (ou python3) et {rtp} / pythonx (les deux barres) pour chaque chemin {rtp} dans Le module (chargé par John) est chargé.
Il y a.
Par conséquent, il existe deux méthodes possibles.
S'il y a des répertoires python2, python3, pythonx directement sous le chemin d'exécution, ils seront chargés, alors renommez le répertoire src en python3. Bien sûr, il est nécessaire de changer la pièce à lire, alors changez-la comme suit
plugin/sample_vim_plugin.vim
- py3file <sfile>:h:h/src/sample_vim_plugin.py
+ py3file <sfile>:h:h/python3/sample_vim_plugin.py
Si vous ne souhaitez pas renommer le répertoire, ajoutez-le directement à sys.path.
plugin/sample_vim_plugin.vim
+ let s:sample_vim_plugin_root_dir = expand('<sfile>:p:h:h')
py3file <sfile>:h:h/src/sample_vim_plugin.py
src/sample_vim_plugin.py
import vim
+ import sys
+ import os
+ plugin_python_dir = os.path.join(vim.eval('s:sample_vim_plugin_root_dir'), 'src')
+ sys.path.append(plugin_python_dir)
import requests_caller
--Placez les fichiers Python dans les répertoires python2, python3, pythonx --Ajoutez le répertoire contenant le fichier Python à sys.path
Le plug-in fonctionnera de deux manières.
Bien connu, davidhalter / jedi-vim semble utiliser la solution 1 (pythonx). Je viens de jeter un œil au code source, mais Shougo / denite.nvim et Shougo / deoplete.nvim semble utiliser la solution 2.
Recommended Posts