Diviser les fichiers lors de l'écriture du plugin vim en python

Contexte

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.

Structure du répertoire et contenu des fichiers

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.

Solution 1: renommer le répertoire

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

Solution 2: ajouter à sys.path

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

Résumé

--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

Diviser les fichiers lors de l'écriture du plugin vim en python
Ecrire le plugin vim en Python
Lors de l'écriture d'un programme en Python
Ecrire un plugin Vim simple en Python 3
[Astuces] Écriture facile à lire lors de la connexion de fonctions en Python
Lire et écrire des fichiers CSV et JSON avec Python
Encodage de caractères lors du traitement de fichiers en Python 3
Un mémorandum lors de l'écriture de code expérimental ~ Se connecter en python
Créer un plugin pour exécuter Python Doctest sur Vim (2)
Créez un plug-in pour exécuter Python Doctest avec Vim (1)
Attention lorsque os.mkdir en Python
Méthode d'écriture pratique lors de l'ajout continu à la liste en Python
Translocation de fichiers CSV avec Python Partie 1
Précautions lors de l'utilisation de Pit avec Python
Comportement lors de la liste dans Python heapq
Formater automatiquement le code Python avec Vim
Manipuler des fichiers et des dossiers en Python
Gestion des fichiers JSON en Python
Téléchargez des fichiers Google Drive en Python
Trier les gros fichiers texte en Python
Lire des fichiers en parallèle avec Python
Exporter et exporter des fichiers en Python
Lire et écrire du texte en Python
Élément de zone rectangulaire divisé en Python
Lors de l'utilisation d'expressions régulières en Python
Extraire des chaînes de fichiers avec Python
Ligne de mode lorsque vous ouvrez le code Python approprié dans Vim
Paramètres lors de l'écriture d'applications Google App Engine / Python avec Intellij Idea
[Python ORM] Notation lors de l'écriture de SQL à l'aide de sous-requêtes dans la clause IN dans SQL Alchemy
N'oubliez pas shebang lors de l'écriture de l'inventaire dynamique d'Ansible en python!
Lors de la spécification de plusieurs clés dans le tri python
Créer ScriptableObject en Python lors de la construction d'ADX2
Précautions lors du décapage d'une fonction en python
Trouver des fichiers comme Linux Find en Python
Arborescence de sortie des fichiers en Python
Référence du fichier INI en Python ou Ruby
Ce que les utilisateurs d'Emacs doivent savoir lors de l'écriture de code Python dans Sublime Text
Modèle pour l'écriture de scripts batch en python
Lors de l'examen de l'utilisation de la mémoire dans Python 3
Automatisez les tâches en manipulant des fichiers en Python
Lire et écrire des fichiers JSON avec Python
Exemple de gestion des fichiers eml en Python
Téléchargez des fichiers dans n'importe quel format en utilisant Python
Lorsque le codec ne peut pas décoder l'octet apparaît en python
Créez un environnement de test Vim + Python en 1 minute
Convertir le fichier FBX en ASCII <-> BINARY en Python
Résumé de la façon d'importer des fichiers dans Python 3
Étude à partir de Python Lecture et écriture de fichiers Hour9
Quand j'essaye matplotlib en Python, il dit 'cairo.Context'
Un mémo que j'ai écrit un tri de fusion en Python
Précautions lors du traitement des structures de contrôle dans Python 2.6
Remarque sur l'encodage lorsque LANG = C en Python
Gérer les fichiers zip avec des noms de fichiers japonais dans Python 3
Le 18ème problème d'écriture en temps réel hors ligne en Python
Comment obtenir les fichiers dans le dossier [Python]
Plug-in Vim qui formate automatiquement les styles Python
Obtenez le fichier, la fonction, le numéro de ligne en cours d'exécution en python
La lecture et l'écriture s'adaptent aux fichiers avec Python (mémo)
[Question] Que se passe-t-il si vous utilisez% en python?
Erreur lors de la tentative d'installation de psycopg2 en Python