Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5657

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

$
0
0

記事の対象者

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

より具体的には

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文を書いたりしています。


Viewing all articles
Browse latest Browse all 5657

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>