記事の対象者
- NeovimでPythonのIDE的な書き味を実現したい人
- coc.nvimを使用している人
はじめに
IntelliJを始めとした統合開発環境(IDE)においては以下のように
補完決定時に必要なImport文も同時に挿入してくれるというのはよくある話だと思います。
これをvimでPythonを書く時にも比較的ライトに実現したい というのが本記事の主旨です。
実現できること
拙作ですが https://github.com/relastle/vim-nayvyこのプラグインを使用すると
以下のようなことが実現できます。
導入方法
以下で導入できます。
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)
より具体的には
importos.pathos.path.dirname('hoge/fuga')
fromos.pathimportdirnamedirname('hoge/fuga')
のどちらで書くかは基本的には書き手の自由だと思います。
極論ですが
importnumpyasnp
と書くことが通例望ましいでしょうが、個人で開発する分には(或いはチーム内で合意が得られていれば)
importnumpy
として開発していてもいいことになります。
こういった特性から、Pythonで補完時に自動でimport文を挿入するという問題を
全ての人に使用される前提で解決するのは困難だと思っています。
本プラグインでは利用者側で事前に大量にimport文を用意してもらうことで解決しています。
$HOME/.config/nayvy/import_config.nayvy
($XDG_CONFIG_PATH/nayvy/import_config.nayvy) に自分が普段使うimport文を大量に書いておくことで、それをcustom sourceとして使用しています。
(ファイルを置かない場合は標準ライブラリのパッケージ/モジュールだけが補完されます。)
私個人の話をするとmypyで型検査を行って開発することがほとんどなので
fromtypingimportAny,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
このような行があったり
importnumpyasnpimportpandasaspdimporttensorflowastfimportseabornassnsimportrequestsimportaiohttpfromlogzeroimportloggerimportyamlimportclickfromclick_help_colorsimportHelpColorsGroup,HelpColorsCommandimportpytestimportyaml
このように頻繁につかう 3rd-party製のプラグインのためのimport文を書いたりしています。