Last Updated: 2/6/2024, 5:44:57 AM

# Mac で Neovim を
Python の開発環境にする

# 目標

作業が完了すると Neovim は、次の 3 つの動作をするようになります。



1. 構文チェック Syntastic, pyflakes




2. 補完 deoplete.nvim(変数名を補完)




3. 補完 deoplete-jedi(ドット . を押下した時に補完)

Neovim よりも Visual Studio Code の方がおしゃれで使いやすそうなので、オススメです。 サーバを触るときによく Vim を立ちげていたので、その流れで Vim, Neovim を触るようになりました。

以下 Vim, Neovim を触りたいという方の役に立てれば、幸いでございます。

# インストールするもの

# ◯ 概要

インストールするものは Homebrew, pip, dein.vim の3つに大別されます。

表. パッケージマネージャ一覧
項番 名前 概要
1 Homebrew macOS
2 pip Python
3 dein.vim Vim

Homebrew は macOS のパッケージマネージャ。ターミナルからコマンドとして使うもの。 pip は Python のパッケージマネージャ。import して使うもの(ターミナルからコマンドとして使えるものもある)。 dein.vim は Vim のプラグインマネージャ。

全部 Homebrew で一括でやってよと思われるかもしれませんが、 こうやって役割分担をしておいた方が、管理はしやすいかなと思います。

# ◯ 詳細

以下のものです。結構たくさんあります。 これをインストールして、さらに設定を加えます。 最低限のものしかいれないのですが、作業ボリュームが、かなりあります。

表. インストールするもの一覧
項番 種類 名前 説明
1 Homebrew Homebrew macOS のパッケージマネージャ
2 Homebrew Python 3 Python 3
3 Homebrew Neovim Vim の後継機
4 pip pyflakes 文法チェッカ
5 pip pycodestyle コーディング規約チェッカ
6 pip pydocstyle ドキュメント規約チェッカ
7 pip pynvim Neovim クライアント
8 dein.vim dein.vim Neovim プラグインマネージャ
9 dein.vim syntastic 文法チェッカ
10 dein.vim deoplete.nvim 自動補完
11 dein.vim deoplete-jedi 自動補完

Homebrew で「本体」をインストールして、pip で「ツール」をインストールします。 dein.vim で「本体」と「ツール」を繋ぐようなイメージです。

# ◯ 補足

# 採用している vim のプラグインは古いです。

本当は、補完には lsp を、構文チェックには ale をいれたいのですが、まだ未対応です。 試しに入れようとしたのですが、うまく動作させることができませんでした。

# 仮想環境

仮想環境は大きく2つに分けられるかなと思います。 1つは site-packages をわけるもの、 もう1つは Python のバージョンをのものをわけるものです。 仮想環境を含めた環境構築については、ここでは紹介いたしません。

# site-packages をわけるもの

venv を使った仮想環境は、あとから追加できます。 Vim のときは最初から設定しないといけなかったのですが、 Neovim では不要になりました。

venv については、以下の記事でご紹介させていただきました。

# Python のバージョンをわけるもの

pyenv, pipenv Poerty など色々ツールがあるのですが、 正直、どう言うものかあまりわかっていません。

Python 本体のバージョンを切り替えるツールもあるそうですが、ここではインストールしません。 pyenv, poetry, pipenv とツールはあるのですが、 そこまでのものは必要ないのではないかという意見を見たためです。 これをすれば良くなるよりも、これは要らないという情報の方が本当に助かります。 ありがとうございます。

Homebrew

# 1. Homebrew

macOS のパッケージ管理システムです。

# Step1. インストール

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# Step2. 動作確認

python を検索して brew がインストールされたか確認して見てください。

$ brew search python

# ◯ 解説

Homebrew は、パッケージ管理システム (opens new window) です。 パッケージ管理システムは、ソフトウェアのインストールするときに使います。 実は Mac には他にも MacPorts というパッケージ管理システムもあります。 MacPorts は最近あまり見なくなってので Homebrew を採用しています。

Homebrew と MacPorts の違いが表になっていてわかりやすいです。

# 2. Python3

# Step1. インストール

$ brew install python

# Step2. 動作確認

python3 と打ち込んで python3 が起動するか、確認してください。

$ python3

# ◯ 補足

Homebrew は /usr/local/bin/ 配下にパッケージをインストールします。 /usr/local/bin/ にはユーザが保存したコマンドが保存されます。

$ which python3
/usr/local/bin/python3
$

/usr/bin/ にはデフォルトではいっているコマンドが格納されます。 なので OS をアップデートすると一緒にアップデートされたりします。

$ which python
/usr/bin/python
$

echo "${PATH//:/$'\n'}" でパスの一覧が見れます。

$ echo "${PATH//:/$'\n'}"
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/opt/X11/bin
/opt/local/bin
/opt/local/sbin
$

# ◯ どうしてこうなった?

なんで brew install python で Python 3 がインストールされたのでしょうか? いろいろと、ごたごたがあったみたいです。 適当に読み流していただければと存じます。

先日 Homebrew のパッケージの改変が行われ、python という Formula は Python3 をインストールするようになり、 /usr/local/bin/python もpython3へのリンクになっていました。
これがまた変更され、 /usr/local/bin/python は python2 へのリンクに戻されました。
Homebrewでインストールされる/usr/local/bin/pythonが再びPython2に変更 (opens new window)

Homebrew のチームが、ちょっと先走ってしまったかららしいのですが、 それを止める根拠になったのがこの PEP だったので紹介しました。

当面の間は、全てのディストリビューションは python は、同じターゲットとして python2 を参照しなければいけない。
for the time being, all distributions should ensure that python refers to the same target as python2.

この勧告(PEP 394)が python のシンボリックリンクが python2 よりも python3 を指すことを提案する様に更新されるほど、 この Python 3 を囲むサードパーティ製のエコシステムが、成熟する時がいずれは来ることを、期待しています。
It is anticipated that there will eventually come a time where the third party ecosystem surrounding Python 3 is sufficiently mature for this recommendation to be updated to suggest that the python symlink refer to python3 rather than python2.

この提案は次の 2, 3 年にわたって定期的に見直され、コアの開発チームが適切だとみなしたときに更新します。 評価基準として、Python 2.7 に対する通常の保守リリース(regular maintenance releases)は、少なくとも 2020 年まで継続されます。
This recommendation will be periodically reviewed over the next few years, and updated when the core development team judges it appropriate. As a point of reference, regular maintenance releases for the Python 2.7 series will continue until at least 2020.
PEP 394 -- The "python" Command on Unix-Like Systems (opens new window)

# 3. Neovim

Vim の後継みたいなもの。歴史的には Vi > Vim > Neovim みたいな流れですかね。他にも editor だと atom とかもありますけどね.. Neovim なのか、 どうなのか.. あとデザインもなんだかなって感じです。

もともと自分はインラフ系のエンジニアだったので、そういった環境だと最初からはいってる vim を使うことが多かったのと、 あと atom はまだまだ重いと言う話を聞いたので atom ではなく Neovim に移行しました。

# Step1. インストール

$ brew install neovim

# Step2. 設定ファイル作成

Neovim の設定ファイルを作りましょう。vim では ~/.vimrc ですが Neovim では ~/.config/neovim/init.vim になります。

$ mkdir ~/.config/nvim
$ nvim  ~/.config/nvim/init.vim

ここからは init.vim を設定していきます。 最終形はこちらに用意いたしました。 ユーザ名 は個々の環境に合わせて書き換えてください。

# Step3. マウスによるクリックを有効に

Neovim はマウスのクリックでカーソルを移動することができません。 マウスのクリックでカーソルを移動できるようにするため、init.vim に次の1行を加えます。

" set オプション = 値
" set mouse      = a
set mouse=a

この作業で cmd+c, cmd+p によるコピペが使えなくなります。 fn キーを押しながら範囲を選択することで使えます。

ただ fn キーを押下しても、範囲を選択するときに 矩形になってしまいます。 これは set mouse=a をしていない時、 すなわち set mouse= と同じ動作です。

vim でマウスを使うってのは、どうなのかという話なのですが、 マウスを使う機会が多かったので、この設定をいれました。

# ヘルプ

ノーマルモードで :help を打つことでヘルプを参照できます。 ただ正直まだ自分も help の使い方をわかっていません。

# set

set コマンドを使ったので検索してみます。 set は Neovim 本体に設定するときに使います。 このあと let とかでてきますが、それはプラグインへの設定で使います。

:help set
:se[t] {option}={value}         or
:se[t] {option}:{value}
    
    string 型または number 型のオプションを
    {value} に設定します。
    Set string or number option to {value}.

    number 型のオプションについては value は
    小数,
    16進数(0x から始まる),
    8進数('0' から始まる)
    になることがあります。
    For numeric options the value can be given in
    decimal,
    hex (preceded with 0x)
    or octal (preceded with '0').

    コマンドラインモードを使用している時であれば、
    現在 option に設定されている value は
    'wildchar' を押下することで挿入されまさす
    The old value can be inserted by typing 'wildchar'

    ('wildchar' の規定値は Tab キーです)。
    (by default this is a <Tab>). 
    
    cmdline-completion も参考にしてください。
    See cmdline-completion.
    
    {option} と '=' の間に半角スペースを
    いれても問題なく動作しますが
    White space between {option} and '='
    is allowed and will be ignored. 
    
    '=' と {value} の間に半角スペースを
    いれると動作しません。
    White space between '=' and {value}
    is not allowed.

    {value} で空白とバックスラッシュを使うには
    option-backslash を参考にしてください。 
    See option-backslash for using
    white space and backslashes in {value}.

# mouse

マウスの機能を有効にできるそうです。 それ以上の説明は無さそう。

:help mouse
'mouse'			string	(default "")
			    global

    マウスを使えるようにします。
	Enables mouse support.

    例えば
    ノーマルモードとビジュアルモードで
    マウスを使えるようにするには
    以下のようにコマンドを打ちます。
    For example, 
    to enable the mouse
    in Normal mode and Visual mode:
        
		:set mouse=nv

    一時的にマウスを使えないようにするには
    shift キーを押しながらマウスを使ってください。
	To temporarily disable mouse support,
    hold the shift key while using the mouse.

    (訳者注釈
    shift キーではダメした。
    fn キーを押下してください。)

    各モードごとにマウスの有効、無効を
    切り替えることができます。
	Mouse support can be enabled for different modes:
		n	Normal mode
		v	Visual mode
		i	Insert mode
		c	Command-line mode
		h	all previous modes when editing a help file
		a	all previous modes
		r	for |hit-enter| and |more-prompt| prompt

マニュアルで |hit-enter| のように縦線で区切られた単語が出現します。 これは :help で検索すると該当する項目が出てきます。 ただ |hit-enter| は読んでもわかりませんでした。

# Step4. コピペができるようにする。

vim で Ctrl+v を押下するとビジュアルモードに切り替わります。 y でコピー, d で切り取りを行います。 p で貼り付けです。

キー動作
y コピー
p ペースト
d 切り取り

しかし、このコピペができるのは vim の中だけです。 どういうことかといえば、例えば vim でコピーしたテキストを Chrome に貼り付けて検索することはできません。 その逆の Chrome でコピーしたテキストを vim に貼り付けることもできません。

他のアプリケーションとコピペを行ったりきたり出来るようにするには、 次の一行を打ち込みます。 マウスで選択したタイミングでビジュアルモードに切り替わってくれます。

set clipboard+=unnamedplus

# なぜコピペができないのか

vim でコピーしたり y, カットしたとき d、 vim のレジスタに保存されるからです。 上記の設定を入れることで OS のクリップボードと vim のレジスタを連携させています。

vim にはたくさんのレジスタがあります。 コピーした内容を保存できる場所がたくさんあるということです。 上記の設定では、そのうちの「無名レジスタ」を使い OS のレジスタと共存させています。

レジスタの種類は以下に記述があります。

# set

set option+=value の場合、設定を追加できる。

:se[t] {option}+={value}				 *:set+=*
    {value} を number 型の option に加算するか、
    {value} を string 型の option に追加してくれます。
    Add the {value} to a number option,
    or append the {value} to a string option.
    
    option がコンマで分離されたリストだった場合、
    コンマが追加されます、
    ただし、value がからでない場合のみです。
    When the option is a comma separated list,
    a comma is added, unless the value was empty.

    もし option がフラグのリストだった場合、
    重複したフラグは削除されます。
    If the option is a list of flags,
    superfluous flags are removed. 
    
    既に存在しているフラグが追加されたときは、
    value は変化しません。
    When adding a flag that was already present
    the option value doesn't change.
    
    上記 |:set-args| も参照してください。
    Also see |:set-args| above.

# clipboard

:help clipboard
Clipboard integration
*provider-clipboard* *clipboard*

Nvim はシステムクリップボードと直接繋がってはいません。
Nvim has no direct connection to the system clipboard.

その代わり |provider| を使っています、
|provider| は、システムクリップボードや
その他のクリップボードバックエンドが
通信するシェルコマンドを使います。
Instead it depends on a |provider|
which transparently uses shell commands to communicate
with the system clipboard or any other clipboard "backend".

全てのモードで常にクリップボードを使うには
以下のようにしてください
To ALWAYS use the clipboard for ALL operations

(+ レジスタ、及び/又は * レジスタを
 明示的に指定するのではなく) 
(instead of interacting
 with the '+' and/or '*' registers explicitly):


   set clipboard+=unnamedplus


詳細とオプションは 'clipboard' を参照してください。
See 'clipboard' for details and options.

クオテーション付きで ' ヘルプ見てなと言われたので、ヘルプを見ます。

:help 'clipboard'
'clipboard' 'cb'	string	(default "")
			global
	This option is a list of comma separated names.
	These names are recognized:

						*clipboard-unnamedplus*
	unnamedplus
        A variant of the "unnamed" flag which uses the
        clipboard register '+' (|quoteplus|) instead of
        register '*' for all yank, delete, change and put
        operations which would normally go to the unnamed
        register.  When "unnamed" is also included to the
        option, yank and delete operations (but not put)
        will additionally copy the text into register
        '*'. See |clipboard|.

このクオテーション付きが何かと言うと、 オプションを検索するときはクオテーションをつけるらしいです。

vim のヘルプにはインサートモード、コマンドラインモードなど各モードごとに、 検索の仕方があるようです。 詳細は以下を参照してください。

全文検索しているわけではなさそうです。 項目名を検索するようです。 * で囲まれた箇所が検索対象になっているようです。

# やってみたこと

cmd+dy を割り当てられないか、 試して見たけどダメでした。

" これはダメだった... orz
vnoremap <D-c> y
pip

ここでは pyflakes, pycodestyle, pydocstyle, pynvim をインストールします。

pyflakes は文法を, pycodestyle は PEP 8 コーディング規約を, pydocstyle は PEP 257 ドキュメント規約を, それぞれチェックしてくれます。

pyflakes, pycodestyle, pydocstyle は、 この後さらに Noevim とつなぐ作業が必要になります。

pynvim は Python と Neovim の橋渡しをしてくれます。 自分もあまり詳しい動作はわからないのですが、 これがないとうまく動作してくれません。

# 5. pyflakes

コードが SyntaxError を起こさないか調べてくれます。

# Step1. インストール

$ pip3 install pyflakes

ここでは pip ではなく pip3 であることに注意してください。

# Step2. 動作確認

文法を間違えた適当なスクリプトを読ませて、 エラーを返してくれるか、確認して見てください。

$ pyflakes sample.py

# 6. pycodestyle

コードが PEP 8 に沿っているか調べてくれます。 PEP 8 はコーディング規約を定めています。

# Step1. インストール

$ pip3 install pycodesytle

# Step2. 設定

無視したいワーニングを設定します。

$ nvim ~/.config/pycodestyle 

以下は自分が使っている設定です。

[pycodestyle]
ignore = 
    # W503 line break before binary operator
    W503

# Step3. 動作確認

こちらも PEP 8 に反したスクリプトを読ませて、 ちゃんとエラーを返してくれるか確認してみてください。

$ pycodestyle sample.py

# ◯ なぜ W503 を無視したか。

PEP 8 の内容と異なるからです。いちおう pycodestyle は公式に近いような扱いを受けている気配があるツールなので、 なぜこのように PEP 8 と反する規約をチェックするのか謎です。 誰も直さないだけなのでしょうか。以下は、PEP 8 からの抜粋です。

二項演算子の前で改行するべきか? - PEP 8 (opens new window)
Should a line break before or after a binary operator? - PEP 8

十数年にわたり推奨されたコーディングスタイルは、二項演算子の後に改行を入れることでした。
For decades the recommended style was to break after binary operators.

しかし、これは次の2つから可読性を損ないます。演算子がスクリーン上の異なる列に散らばります、 またここの演算子はオペランド(訳注: 簡単に言えば "変数" のこと)から引き離され1つ上の行に来ます。
But this can hurt readability in two ways: the operators tend to get scattered across different columns on the screen, and each operator is moved away from its operand and onto the previous line.

すると目は、どの要素が加算され、そして減算されているかを教えるという余計な仕事を行わなければなりません。
Here, the eye has to do extra work to tell which items are added and which are subtracted:

# No: operators sit far away from their operands
income = (gross_wages +
          taxable_interest +
         (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

この可読性の問題を解くために、数学者と彼らの出版社は反対の慣習に従います。
To solve this readability problem, mathematicians and their publishers follow the opposite convention.

Donald Knuth は、コピュータと植字のシリーズで伝統的なルールを説明しています。 「段落内の式は、いつも二項演算とそれに関連するものの後に改行します。 一方で、展示された式は、いつも二項演算の前に改行します。」 (訳注: 正直、よくわかりません。間違ってるかもしれませんが、 意訳するなら「文章中に現れた式を改行する際は、いつも行末に二項演算子を書いてから改行し、オペランドを行頭に書きます。 一方で、中央揃えにして図と同じような扱いで表示された式 (displayed formulas) を改行する際は、 オペランドを書いてから改行し、行頭に二項演算子を書きます。」)」
Donald Knuth explains the traditional rule in his Computers and Typesetting series: "Although formulas within a paragraph always break after binary operations and relations, displayed formulas always break before binary operations" (Donald Knuth's The TeXBook, pages 195 and 196)

数学者の慣習に従うと、通常はより読みやすいコードになります。
Following the tradition from mathematics usually results in more readable code:

# Yes: easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

Python のコードでは、既に書かれたコードについては、コーディングスタイルの一貫性が保たれる範囲の中で、 二項演算子の前または後ろでどちらで改行しても構いません。新しいコードを書くときは Kunuth のスタイルが望ましいです。
In Python code, it is permissible to break before or after a binary operator, as long as the convention is consistent locally. For new code Knuth's style is suggested.

# 7. pydocstyle

docstring が PEP257 に沿っているか調べてくれます。PEP257 はドキュメントの書き方を定めています、

# Step1. インストール

$ pip3 install pydocsytle

# Step2. 設定

無視したいワーニングを設定します。pycodestyle とは違いホームディレクトリ直下に記述します。

$ nvim ~/.pydocstyle 
[pydocstyle]
ignore =
    # D100: Missing docstring in public module 
    D100,
    # D101: Missing docstring in public class
    D101,
    # D102: Missing docstring in public method.
    D102,
    # D103: Missing docstring in public function
    D103,
    # D104: Missing docstring in public package
    D104,
    # D105: Missing docstring in magic method 
    D105,
    # D107: Missing docstring in __init__ 
    D107,
    # D203: 1 blank line required before class docstring (found 0)
    D203,

# Step3. 動作確認

Python スクリプトを読ませて動作するか、確認して見てください。

$ pydocstyle sample.py

# ◯ なぜ D100 ~ D103, D105, D107 を無視したか。

すべてのクラスや関数、メソッドに docstring を書くのはさすがに煩雑すぎるから。書くときは従うけど、書かなくてもいいように。

# ◯ なぜ D203 を無視したか。

D203 と D211 の規約は矛盾しているから(そんなの作らないでよ..)

# ◯ 解説 pip ってなに?

pip は パッケージ管理システム です。 Python で書かれたパッケージソフトウェアをインストール・管理するためのパッケージ管理システムです。 Homebrew は、Mac で使うためのソフトウェアを扱うパッケージ管理システムです。区別しましょう。 多くの pip でインストールできるパッケージは、Python Package Index (PyPI) 上にあります。

# ◯ 解説 PEP ってなに?

PEP(Python Enhancement Proposal) は、文字通り Python の機能拡充のための提案です。 PEP 8, PEP 257 のような規約であったり、PEP 484 TypeHints などの様々な議論, 提案がなされます。以下、一部抜粋したものを示します。

PEP 0: PEP の一覧

PEP 1: PEP ってなに?

PEP は Python Enhancement Proposal (Python 拡充提案)を意味しています。
PEP stands for Python Enhancement Proposal.

PEP は設計書です。この設計書は Python コミュニティに情報を提供したり、Python の新しい機能、手続き、または環境を説明したりするものです。
A PEP is a design document providing information to the Python community, or describing a new feature for Python or its processes or environment.

PEP は、機能に関する簡潔な技術仕様と、その機能の動作原理を伝えなければなりません。
The PEP should provide a concise technical specification of the feature and a rationale for the feature.

PEP が主要な仕組みとなることを意図しています。どのような仕組みかと言えば、大きな新しい機能の提案をするため、 議案に対してコミュニティに提供された情報を取り纏めるため、Python に取り入れられた設計に関する決定を文書にするための物です。
We intend PEPs to be the primary mechanisms for proposing major new features, for collecting community input on an issue, and for documenting the design decisions that have gone into Python.

PEP の起草者は、コミュニティ内でコンセンサスを確立することと、反対意見を文書化することに責任を持ちます。
The PEP author is responsible for building consensus within the community and documenting dissenting opinions.

PEP はバージョン管理されたリポジトリでテキストファイルとして保存されるため、 これらの改訂履歴は過去になされた機能提案 PEP の変更履歴のレコードとなります。[1]。
Because the PEPs are maintained as text files in a versioned repository, their revision history is the historical record of the feature proposal [1].

変更履歴のレコードは、古いバージョンを取得するための通常の git コマンドを使えば閲覧できます。 また https://github.com/python/peps からHTTP 経由でも、閲覧することができます。
[1] This historical record is available by the normal git commands for retrieving older revisions, and can also be browsed via HTTP here: https://github.com/python/peps

# 8. pynvim

neovim の Python3 クライアントです。 なにかは良くわかりません。でも無いと補完が効かない。

neovim/pynvim (opens new window)
Pynvim implements support for python plugins in Nvim. It also works as a library for connecting to and scripting Nvim processes through its msgpack-rpc API.

msgpack-rpc/msgpack-rpc (opens new window)
Extremely efficient object serialization library. It's like JSON, but very fast and small.

# Step1. インストール

$ # インスール
$ pip3 install neovim

# ◯ これをインストールしないと、どうなるか。

これをしないと、このあと deoplete-jedi をインストールしても、ちゃんと読み込んでくれません。 あるいはエラーがでなかったとしても、補完が効かない可能性があります。 気になる方は、すべての作業が完了した後に1度 uninstall して、どのようなエラーが出力されるか確認して見てください。

dein.vim

# 9. dein.vim

vim プラグインマネージャ。

init.vim に GitHub の URL を書くだけで vim プラグインがインストールできるようになる。 例えば..

  " https://github.com/jmcantrell/vim-virtualenv から
  " ダウンロード&インストール
  call dein#add('jmcantrell/vim-virtualenv')

# Step1. インストール

$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
$ sh ./installer.sh ~/.cache/dein

# Step2. 設定

$ nvim ~/.config/nvim/init.vim

「ユーザ名」はご自身の macOS のユーザ名を入力してください。

set runtimepath+=/Users/ユーザ名/.cache/dein/repos/github.com/Shougo/dein.vim

if dein#load_state('/Users/ユーザ名/.cache/dein')
  call dein#begin('/Users/ユーザ名/.cache/dein')
  call dein#add('/Users/ユーザ名/.cache/dein/repos/github.com/Shougo/dein.vim')
  call dein#end()
  call dein#save_state()
endif

# runtimepath

大量によくわからないものを書き込むとよくわからない。 runtimepath は nvim の実行時のパスらしい。

:help runtimepath
調査中

ちなみにインストールする vim プラグインは、 runtimepath に追加したパスに近い箇所に、 保存されている。

$ tree -L 2 ~/.cache/dein/repos/github.com/
/Users/ユーザ名/.cache/dein/repos/github.com/
├── Shougo
│   ├── dein.vim
│   └── deoplete.nvim
├── scrooloose
│   └── syntastic
└── zchee
    └── deoplete-jedi
$ 

# autoload

# は autoload と呼ばれるものらしいです。

:help autoload
							*autoload* *E746*
これはユーザマニュアルの |41.15| 章で
紹介されたものです。
This is introduced in the user manual, section |41.15|.

"autoload" ディレクトリ配下の
スクリプトを使うことは簡単ですが
Using a script in the "autoload" directory is simpler,

完全に正しいファイル名を
指定しなければいけません。
but requires using exactly the right file name.

自動的に読み込まれる関数の名前は
以下のように記述されます。
A function that can be autoloaded has a name like this:


	:call filename#funcname()


# Step3. 動作確認

nvim のコマンドモードで次の1行を入力してください。

:call dein#install()

インストールするべきものが見つからないよ。って帰ってきたら成功です。

[dein] Target plugins are not found.
[dein] You may have used the wrong plugin name, or all of the plugins are already installed.

:call dein#install() を実行すると、 プラグインをインストールしてくれるみたいです。

:help dein#install
							*dein#install()*
dein#install([{plugins}])
    Install the plugins asynchronously.
    {plugins} is the plugins name list.
    If you omit it, dein will install all plugins.

# ◯ 参考

dein.vim の開発者の Shougo さんの記事です。 runtimepath の意味、help の使い方、 dein.vim を使わずにプラグインをインストールする方法が記されています。

本当に本当に、困っていました。ありがとうございます!

今回、初心者向けの記事を執筆することに決めたのは、 勉強会などで「Vimをどのように学べばよいか?」について質問されることが多く、 皆が同じ問題で困っているのだと気付いたからです。
上達したい Vim 初心者のための設定・プラグインの見つけ方、学び方 (opens new window)

# 10. Syntastic

Syntastic は Vim の構文チェックプラグインです。 構文チェック自体は pyflakes, pycodestyle, pydocstyle が行います。 Syntastic は nvim と pyflakes, pycodestyle, pydocstyle の橋渡しを行います。

# Step1. 設定

  call dein#add('scrooloose/syntastic')
let g:syntastic_python_checkers = ['pydocstyle', 'pycodestyle', 'pyflakes']

場所はこの辺に..

" syntastic のインストール
if dein#load_state('/Users/ユーザ名/.cache/dein')
  call dein#begin('/Users/ユーザ名/.cache/dein')
  ...  
  call dein#add('scrooloose/syntastic')
  ...
  call dein#end()
  call dein#save_state()
endif

" syntastic に pyflakes を指定
" g => Global, l => Local
" 代入 スコープ  : 変数名                     = 値
" let g        : syntastic_python_checkers = ['pydocstyle', 'pycodestyle', 'pyflakes']
let g:syntastic_python_checkers = ['pydocstyle', 'pycodestyle', 'pyflakes']

set で代入するときは Neovim への設定、 let のときはプラグインへの設定になっています。

WARNING

ここで注意していただきたいことは、原因はわからないのですが ['pydocstyle', 'pycodestyle', 'pyflakes'] の 順番を守らないとちゃんと動作しません。

# Step2. インストール

追記が終わったら以下のコマンドを vim のノーマルモードで入力する。

:call dein#install()

# Step3. 動作確認

Neovim を開き文法を間違ったコードを書き、 保存 :w して見てください。 上の図のように syntax error を指摘してくれていれば、成功です。

# 11. deoplete.nvim

Neovim は特になにもしなくても変数名を入れると ctrl+p でも補完候補表示してくれます。 deoplete.nvim をいれると ctrl+p をいれなくても自動的に補完してくるようにします。

# Step1. 設定

次の2行を追記して

  call dein#add('Shougo/deoplete.nvim')

" Use deoplete.
let g:deoplete#enable_at_startup = 1

# Step2. インストール

インストール

:call dein#install()

# Step3. 動作確認

実際に補完が走るか確認して見てください。 こういうのを英語で omni completion, 日本語でオムニ補完と表現されています。

# 12. deoplete-jedi

12 の続きになります。 . を押したときに検索して候補となる属性を表示してくれます。

deoplete-jedi, deoplete.nvim source for jedi.
deoplete-plugins/deoplete-jedi - GitHub (opens new window)

# Step1. 設定

追記して

  call dein#add('zchee/deoplete-jedi')

# Step2. インストール

インストール

:call dein#install()

# Step3. 動作確認

. を押下したときに補完が走るか確認してください。

import flask
flask.

# 13. 補足

~/.config~/.chache と言った ディレクトリが多用されました。 これは以下のあたりから来ている気配があります。 あまりよくわかっていません。

XDG Base Directory Specification (opens new window)

XDG_CONFIG_HOME

  • ユーザー個別の設定が書き込まれるディレクトリ (/etc と類似)。
  • デフォルトは $HOME/.config です。

XDG_CACHE_HOME

  • ユーザー個別の重要でない (キャッシュ) データが書き込まれるディレクトリ (/var/cache と類似)。
  • デフォルトは $HOME/.cache です。
おわりに

# おわりに

以下に参考になるページを列挙いたします。

Vim の操作 - 基本編

Vim の操作 - 応用編
本当に助かりました、ありがとうございます。

Vim の操作 - 精神編
もはや宗教でワロタwww

Vim にはタブ機能があります。-p オプションで同時に開ます。

この開いたタブを、以下のスクリプタでショートカットで移動できるようにするとかなり便利です。

タブ周りその他、最近やっと知りました。

Vim にはファイルエクスプローラもついています。

Vim スクリプト - 基礎編

Vim スクリプト - 実践編
いつか読みたい...