kick the base

好きな映画、音楽、マンガ、プログラム、デザイン、3DCG、ゲームのこと。

Vim: Python開発環境を作る

プログラム、書いてますか!?というわけで久しぶりにテキストエディタの環境についてのお話です。

思い返せば約一年前の記事、本ブログでのVimに関する記事について - kick the base。外部プラグインを使わないという思想でVimを使っていたんですけど。

ええ、入れちゃいました。プラグイン。ごめんなさい。

今回はプラグインを入れるに至った経緯と導入したプラグインについてのご紹介をしたいと思います。Qiitaなどのサービスを検索すれば溢れかえっている情報ですが、プラグイン毎ではなくまとまった情報というのも悪くはないのかなと思います。

最も大きな動機

単純明快。メインで使っていたPython開発用IDE、PyCharmのサブスクリプションが切れたためです。

ぼくの思うIDEとエディタの役割って下記イメージなんですよね。

f:id:kickbase:20170728082245j:plain

IDEはライブラリや既存のコードを脳内にインプットしながら書く時に大活躍。対してエディタは自分の中から湧き上がってくるコードをよりシームレスに出力するときに効果を発揮するように思います。

逆に言うとそれらのシーンで阻害する要素があるなら、そのソフトウェアはIDEとしてもエディタとしても選択肢としては外れていくといった感じで考えています。

拡張なしのVimは自分の中のコードをバシバシ書いていくには最適ですが、大きめのプロジェクトにはちょっとしんどいかなぁと思い、プラグイン導入という重い腰を持ち上げました。

しかし、カスタム設定はあまりせず、ポータビリティ重視という考え方は今も昔も変わっていません。最小限の構成なんじゃないかなと思います。

過去を振り返る

温故知新というこで、Vimの前に常用していたエディタ、Emacsの初期設定を見てみましょう。

[ Emacs ] 2015年init.el振り返り - Qiita

1400行くらいのinit.elなのでそこまでファットではないと思いますが、もっさりした操作感は否めない感じでした。

ここからVimに乗り換えるなら軽量化を至上に!という思想が生まれたわけです。*1

初期設定ファイル

まずは下記ファイルを貼っておきましょう。デフォルトの機能でまかなえるものは極力入れない。重くなるものは極力入れない。Pythonがメイン。の設定です。

  • .vimrc
  • python.vim
  • javascript.vim
  • ruby.vim

.vimrc

python.vim

" autopep 
" original http://stackoverflow.com/questions/12374200/using-uncrustify-with-vim/15513829#15513829
function! Preserve(command)
    " Save the last search.
    let search = @/
    " Save the current cursor position.
    let cursor_position = getpos('.')
    " Save the current window position.
    normal! H
    let window_position = getpos('.')
    call setpos('.', cursor_position)
    " Execute the command.
    execute a:command
    " Restore the last search.
    let @/ = search
    " Restore the previous window position.
    call setpos('.', window_position)
    normal! zt
    " Restore the previous cursor position.
    call setpos('.', cursor_position)
endfunction

function! Autopep8()
    "--ignote=E501: 一行の長さの補正を無視"
    call Preserve(':silent %!autopep8 --ignore=E501 -')
endfunction

" 保存時自動実行
autocmd BufWrite *.{py} :call Autopep8()

" 外部コマンドで現在のファイルを実行する
autocmd BufNewFile,BufRead,BufEnter *.py nnoremap <C-e> :!python %

ファイル保存時にAutopep8が走るようにしてるのがポイントです。

myvim/python.vim at master · AtsushiSakai/myvim

上記のほぼコピペです。この場を借りてお礼を申し上げます。

javascript.vim

" 外部コマンドで現在のファイルを実行する
autocmd BufNewFile,BufRead,BufEnter *.js nnoremap <C-e> :!node %

ruby.vim

"外部コマンドで現在のファイルを実行する
autocmd BufNewFile,BufRead,BufEnter *.rb nnoremap <C-e> :!ruby %

初期設定ファイルの管理方法

一般的な方法だと思いますが、~/projects/dotfiles以下に初期設定ファイルをまとめておき、それらをBitbucketでバージョン管理してます。エディタだけでなく3D系のソフトの初期設定ファイルもここで一元管理してます。

恥ずかしいのでパブリックなとこには晒してません。いやん。

下記ディレクトリに各言語ごとの設定を入れてます。

.vim/after/ftplugin

ruby.vim、javascript.vimは今後足していけばいいかなくらいのノリです。

ちなみにカラーテーマは悩みのあとが見られて味わい深いですね。

プラグインの説明

vim-plug

プラグインマネージャはvim-plugを採用。シンプルで分かりやすいのが一番です。

jedi-vim

ジェダイ!!!!これだけのためにプラグイン導入を踏み切ったと行っても過言ではないです。 Python用の賢く高速な保管機能です。

デフォルトではdocstringのポップアップが出るたびバタバタしてウザいのでそこだけ設定をいじって無効化してます。

" docstringポップアップを無効化
autocmd FileType python setlocal completeopt-=preview

ただし、日本語(マルチバイト文字?)が入ってる行では補完が効かなくなるぽいのでここは要検証。

f:id:kickbase:20170728072152g:plain

上記画像で言うと"パワーマン {}"のあとの.formatが保管されていません。

s = "パワーマン {}"のように変数に入れれば、s.のあとで補完が効くようになります。

また変数リネームでも問題が発生することを確認しました。

f:id:kickbase:20170729045353g:plain

<Leader>rでカーソル下の変数をリネームできます*2が、マルチバイト文字が入っている行では正しくリネームできませんでした。

設定で直ると良いなあ。

ctrlp

絞り込みインターフェースのアレ。そこまで便利な気がしないので後々外すかも。

Emacs時代はHelm大好きっ子だった僕ですが、uniteはちょっと肌に合わないのでctlpを入れてみました。他にもいくつかあるので試してみようかしら。

indentLine

Python書くなら入れておいて損はないと思います。さりげないけどちゃんとインデントの深さがわかります。

ただし、Markdown書いてるときに表示がおかしくなったので調べた所、このプラグインが内部で勝手にset conceallevel=2してるのが原因ということが判明。

Markdownは下記設定を入れて対象外としました。

let g:indentLine_fileTypeExclude = ['help', 'markdown']

いやぁ焦った。

まとめ

ジェダイ最高。

プラグインもそれほど入れてませんし、快適な編集速度を保ちつつ、いい感じの開発環境ができたのではないかなと思います。まだまだ初期設定ファイルに手を入れていくと思いますが、また落ち着いた頃に記事を書ければと思います。

*1:Emacsはエディタというより環境なのでちょっと立ち位置が違いますが

*2:マップリーダーはSPACEキーに割り当てています