MayaとPyCharmと、時々、VIM（後編）

この記事はMaya-Pythonアドベントカレンダー12月4日の記事です。

[前編](http://qiita.com/sporty/items/c012905ccd51cae75dfe)からの続きです。

MayaとPyCharmの連携についてですが、今日は思うところあってのエディット機能についての再確認をしていきます。

今日触れる機能については無料のCommunity版でもすべて使用できると思います。

PyCharm 2016.3 Professional
Maya 2016 Extension2

# VIM愛

昨今自分が使うプログラム言語は

* Python
* HTML
* CSS(lessで書いてるけども)
* JavaScript(近々TypeScriptに移行予定)
* DosBatch
* C++

といったところです。軽く調べてみるとPyCharmはこれらほとんどをサポートしてるんですよね。TypeScriptなんて特に気合入ってる。


私は[VIM](http://www.vim.org/)を長年使ってます。主に使用しているプラグインの中で無いと悲しいのは、

* Unite
* Jedi
* Syntastic

くらいで、基本的にはhjklでの移動など基本機能が便利で使ってます。単純にタイプ数、視線の移動、などが少なくて楽なのです。
つまり自分でvimscriptを書くほどのユーザーではありません。

詳しい方は、ちょっと古いプラグイン使ってない？とお気づきかもしれません。
そう、ちょっと設定ファイルを書くことに疲れてます・・・NEOVIMも挫折。

使用中のプラグインの中でもJediっていうプラグインが強力なPythonサポートになります。
かなり賢くて、メソッドの候補などをプルダウンメニューで表示してくれます。
![2016-12-04_11h36_27.png](https://qiita-image-store.s3.amazonaws.com/0/13183/9288cbf2-51c7-3c97-548c-70fd447d3e1b.png)

こういった機能の代替えになるのかを検証していこうと思います。


# Mayaのスクリプトエディターの自動補完

まずは改めてMayaのスクリプトエディターの機能確認。

スクリプトエディターには[Command Completion](http://help.autodesk.com/view/MAYAUL/2016/JPN/?guid=GUID-B66020CC-1BBE-4EA1-B1DE-A288B044DD80)というオプションがあります。

MELコマンドを入力する際に、自動補完やオプションの説明が表示されます。非常に便利。
![2016-12-03_19h28_17.png](https://qiita-image-store.s3.amazonaws.com/0/13183/d447adaa-22f8-7990-10ae-728e96b58cb8.png)

Pythonでも同様にMELコマンドやPython標準モジュールに関しては自動補完が効きます。
![2016-12-03_19h26_39.png](https://qiita-image-store.s3.amazonaws.com/0/13183/24306daf-e02d-63d9-e9e5-74f32fd93427.png)

でもaliasには反応しません。pymel.coreのMELコマンドにも対応していないようです。ちょっと厳しい。
![2016-12-03_19h29_05.png](https://qiita-image-store.s3.amazonaws.com/0/13183/4a2e761d-2ddc-8ad7-088b-09bdb50effe5.png)


# PyCharmはどうなんだ

さて、PyCharmです。

pm(pymel.coreのalias)を入力すると、MELコマンドは表示されませんでした。listHistoryだけが候補に挙がっているのはこのソースコード中で使用しているためです。
![2016-12-04_11h44_04.png](https://qiita-image-store.s3.amazonaws.com/0/13183/0dc9c8d6-90a9-d26f-9ad7-4f6f7736cc17.png)

Maya組み込みPythonでしか有効にならないモジュールは通常のPythonでは読み込めないのが原因だと思います。

しかしMayaに関してはmayapyというインタープリターが用意されています。オートデスクさんは非常に分かってる。
Settingsからデフォルトインタープリターを変更してみましょう。

![2016-12-04_11h42_53.png](https://qiita-image-store.s3.amazonaws.com/0/13183/591f6d40-46b6-cf4a-3070-e92fcce9fc00.png)

なんということでしょう。候補が表示されました。

![2016-12-04_11h43_38.png](https://qiita-image-store.s3.amazonaws.com/0/13183/6c4ca4c8-af62-9d91-5679-fbfc66bd9d1e.png)

ただ、オプションについては動的に解釈してるから（？）何も表示されません。
![2016-12-04_11h51_02.png](https://qiita-image-store.s3.amazonaws.com/0/13183/33bb5927-cc85-5ed4-1004-9d6ab642d6d1.png)

ちなみにこのような設定だと、PyCharm内のPython Consoleもmayapyになります。
![2016-12-04_11h55_08.png](https://qiita-image-store.s3.amazonaws.com/0/13183/7f51ce29-554e-5e3e-4e24-58e99adf832a.png)

さて編集中に良く行う動作としては、関数の定義部分にジャンプしたり。

![2016-12-04_12h02_38.png](https://qiita-image-store.s3.amazonaws.com/0/13183/9b4ae162-6931-57c9-5f6f-3d35092915d9.png)

逆に関数が使用されているところを検索したり。
![2016-12-04_12h04_19.png](https://qiita-image-store.s3.amazonaws.com/0/13183/05f520a6-4fe9-7d24-96e4-18773814563b.png)

もちろん強力なリファクタリングツールも作業効率アップ間違いなしです。

# VIM愛ふたたび

ここまでくると非の打ちどころがありません。すでに最強と言えるでしょう。

しかし私の心をむしばむ愛という名の悪魔がささやきます。

「十字キーなんてタッチタイプできるのかい？・・・」

JetBrainsなめんな。そのくらいのプラグインあるわ。

![2016-12-04_12h09_07.png](https://qiita-image-store.s3.amazonaws.com/0/13183/4b931677-d152-365b-2cc8-c61e86aed1e4.png)

うぐぐ・・・VIM操作ほとんどできた・・・

Uniteに代わるスニペット管理、syntasticに代わるコードチェックがあれば愛を捨てることができそうです。

# スニペット管理

syntasticが行ってくれてたコードチェックはPyCharmだとある程度リアルタイムに行ってくれるのでよしとして、スニペットだけはしっかり確認が必要です。

[Live Templates](https://www.jetbrains.com/help/pycharm/2016.3/live-templates.html)という機能だそうです。

お決まりのロガー初期化とロガー取得をスニペット登録してみましょう。

```py:ロガー初期化
    import logging
    if $ISDEBUG$:
        LOG_FORMAT = r"%(asctime)s %(name)s [%(levelname)s] %(filename)s:%(lineno)d %(message)s"
        LOG_LEVEL = logging.DEBUG
    else:
        LOG_FORMAT = r"[%(levelname)s] %(message)s"
        LOG_LEVEL = logging.INFO

    _logger = logging.getLogger(u'$NAME$')
    _logger.handlers = []
    _stream_handler = logging.StreamHandler()
    _formatter = logging.Formatter(LOG_FORMAT)
    _stream_handler.setFormatter(_formatter)
    _logger.addHandler(_stream_handler)
    _logger.setLevel(LOG_LEVEL)
```

```py:ロガー取得
from logging import getLogger
logger = getLogger(u'$NAME$')
```

Settings/Editor/Live Templateから追加します。あらかじめ内包表記とか登録されてますね。話がそれますが、条件付き内包表記、永遠に覚えれれませんよね（あ、私だけ？・・・）
![2016-12-04_12h38_03.png](https://qiita-image-store.s3.amazonaws.com/0/13183/2aec6ecc-7419-e5a9-019f-2b5db9a00ef0.png)

「+」ボタンを押して新規グループにスニペットを作ってみました。毎回入力したい可変の部分は`$NAME$`のように`$`で括るルールのようです。
![2016-12-04_13h07_09.png](https://qiita-image-store.s3.amazonaws.com/0/13183/e3944ad7-c01a-bf46-0289-0c4946619ac1.png)

settingsのダイアログではペーストできないようですので、`%USERPROFILE%\.PyCharm2016.3\config\templates\Python.xml`を直接編集してもいいようですが、私はうまくいきませんでした。特殊文字のエスケープとかに失敗してるんでしょうけども、調べる気にもなりません。XMLって。

大きめのスニペットを登録するのはちょっと辛いですね。小分けにしましょう。


登録はちょっとめんどくささを感じましたが、ともあれ、Ctrl+Jでスニペットを呼び出せます。候補から選択するために十字キーを使わなくてはいけないってのが嗚呼VIM・・・と思わせる瞬間だったりします。
![2016-12-04_13h04_21.png](https://qiita-image-store.s3.amazonaws.com/0/13183/7f72f410-7d8f-2b0a-71da-54ad8e4cea94.png)

以上、スニペット登録から呼び出しをやってみましたが、おおむねLive Template機能も問題ないような気がします。よくできてます。

無料でここまでの環境が手に入るって本当にすごい時代です。

# まとめ

PyCharmすさまじい。

さてどうしたものか。