Schreiben Sie ein Vim-Plugin in Python
Ich mache ein Plugin für Vim (Neovim), indem ich auf den oben verlinkten Artikel verweise. Als die Python-Datei größer wurde und ich versuchte, sie zu teilen, stolperte ich ein wenig, damit ich die Lösung teilen kann.
In diesem Artikel erstellen wir als Beispiel ein Plug-In, das den Titel einer Webseite mithilfe des Anforderungsmoduls anzeigt.
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
Ich verwalte Plugins mit dein, also wenn ich das obige Plugin zur Toml-Datei hinzufüge und neovim starte
ModuleNotFoundError: No module named 'requests_caller'
Es wurde gesagt, dass.
Ich möchte das Problem lösen, dass dieses Modul nicht gefunden werden kann.
In "Processing'runtimepath'in Python"
In Python wird vim.VIM_SPECIAL_PATH anstelle der Pfadliste für 'Laufzeitpfad' verwendet Ein spezielles Verzeichnis namens wird verwendet. Dieses Verzeichnis wird in sys.path verwendet Wann und wann vim.path_hooks in sys.path_hooks verwendet wird, 'runtimepath' {Rtp} / python2 (oder python3) und {rtp} / pythonx (beide Balken) für jeden Pfad {rtp} in Das Modul (geladen von John) wird geladen.
Es gibt.
Daher gibt es zwei mögliche Methoden.
Wenn sich die Verzeichnisse python2, python3 und pythonx direkt unter dem Laufzeitpfad befinden, werden sie geladen. Benennen Sie das Verzeichnis src daher in python3 um. Natürlich muss das zu lesende Teil geändert werden, also ändern Sie es wie folgt
plugin/sample_vim_plugin.vim
- py3file <sfile>:h:h/src/sample_vim_plugin.py
+ py3file <sfile>:h:h/python3/sample_vim_plugin.py
Wenn Sie das Verzeichnis nicht umbenennen möchten, fügen Sie es direkt zu sys.path hinzu.
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
Das Plug-In funktioniert auf zwei Arten.
Bekanntlich scheint davidhalter / jedi-vim Lösung 1 (Pythonx) zu verwenden. Ich habe nur einen Blick auf den Quellcode geworfen, aber Shougo / denite.nvim und Shougo / deoplete.nvim scheint Lösung 2 zu verwenden.
Recommended Posts