LoginSignup
5
2

More than 3 years have passed since last update.

NeovimでPythonのコード補完時に必要なImport文を挿入する

Last updated at Posted at 2020-08-09

記事の対象者

  • NeovimでPythonのIDE的な書き味を実現したい人
  • coc.nvim を使用している人

はじめに

IntelliJを始めとした統合開発環境(IDE)においては以下のように
補完決定時に必要なImport文も同時に挿入してくれるというのはよくある話だと思います。

java_completion.gif

これをvimでPythonを書く時にも比較的ライトに実現したい というのが本記事の主旨です。

実現できること

拙作ですが https://github.com/relastle/vim-nayvy このプラグインを使用すると
以下のようなことが実現できます。

nayvy_coc.gif

導入方法

以下で導入できます。

Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'relastle/vim-nayvy'

coc.nvimのcustom sourceの機能を使っているだけなので、
別途cocのプラグインを導入する必要はありません。

補完決定時にimport文を挿入するので
なにも設定していなければ明示的に (Ctrl-y) キーで決定する必要はあります。

(詳しくはREADME参照)

with-python3 なvimでも動作してくれると思います。

補足

Pythonのimport文は以下の点で他のいくらかの言語よりやや特殊だと思います。

  • 別名でimport するというのが非常に一般的 (import xxxx as yy)
  • パッケージ(サブパッケージ)をimportして、その名前空間で内部の関数を指定することもあれば、importする関数をダイレクトに指定することもある(import xxxx | from xxxx import zzz)

より具体的には

import os.path

os.path.dirname('hoge/fuga')
from os.path import dirname

dirname('hoge/fuga')

のどちらで書くかは基本的には書き手の自由だと思います。

極論ですが

import numpy as np

と書くことが通例望ましいでしょうが、個人で開発する分には(或いはチーム内で合意が得られていれば)

import numpy

として開発していてもいいことになります。

こういった特性から、Pythonで補完時に自動でimport文を挿入するという問題を
全ての人に使用される前提で解決するのは困難だと思っています。

本プラグインでは利用者側で事前に大量にimport文を用意してもらうことで解決しています。

$HOME/.config/nayvy/import_config.nayvy ($XDG_CONFIG_PATH/nayvy/import_config.nayvy) に自分が普段使うimport文を大量に書いておくことで、それをcustom sourceとして使用しています。
(ファイルを置かない場合は標準ライブラリのパッケージ/モジュールだけが補完されます。)

私個人の話をするとmypyで型検査を行って開発することがほとんどなので

from typing import Any, Callable, ClassVar, Generic, Optional, Tuple, Type, TypeVar, Union, AbstractSet, ByteString, Container, ContextManager, Hashable, ItemsView, Iterable, Iterator, KeysView, Mapping, MappingView, MutableMapping, MutableSequence, MutableSet, Sequence, Sized, ValuesView, Awaitable, AsyncIterator, AsyncIterable, Coroutine, Collection, AsyncGenerator, AsyncContextManager, Reversible, SupportsAbs, SupportsBytes, SupportsComplex, SupportsFloat, SupportsInt, SupportsRound, ChainMap, Counter, Deque, Dict, DefaultDict, List, OrderedDict, Set, FrozenSet, NamedTuple, Generator, AnyStr, cast, get_type_hints, NewType, no_type_check, no_type_check_decorator, NoReturn, overload, Text, TYPE_CHECKING, Protocol

このような行があったり

import numpy as np
import pandas as pd
import tensorflow as tf
import seaborn as sns
import requests
import aiohttp
from logzero import logger
import yaml
import click
from click_help_colors import HelpColorsGroup, HelpColorsCommand
import pytest
import yaml

このように頻繁につかう 3rd-party製のプラグインのためのimport文を書いたりしています。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2