Windows 10にGVimベースのPython開発環境を構築する（２）基本設定編


# はじめに

Windows 10, 64 bitビットPCにGVimベースのPython開発環境を構築します．[第１回](http://qiita.com/daizutabi/items/72fa1c2f05d721e5cd48)では，GVimを動作させるために必要な環境をインストールしました．第２回ではGVimの基本的な設定を行っていきます．

# GVim設定ファイル用のGitHubレポジトリの作成

前回の記事では，GVimの設定ファイルをローカルに作成したGitレポジトリ内に作成しました．しかし，この方法は，他のPCでも同じ設定を利用しようとするときに，あまり良い方法ではありませんでした．今回は，GitHub上に設定ファイルレポジトリを作り，それをクローンすることにします．まずは，前回作成したレポジトリ`C:\Users\daizu\AppData\Local\vim74-daizu\vimfiles`を削除します．次に，GitHubの自アカウントのページを開き，新規にvimfilesレポジトリを作成します．このレポジトリをPCにクローンします．今回は，ホームディレクトリ直下に設定ファイルを置くことにします．コマンドプロンプトを開き，`C:\Users\daizu`に移動した後に，

```bat
$ git clone https://github.com/daizutabi/vimfiles
```

とします．ホームディレクトリ`C:\Users\daizu` の下に，`vimfiles`ディレクトリが作成されました．このディレクトリ下に`dotfiles`ディレクトリを作成し，その中に`_vimrc`，`_gvimrc`という名前でファイルを作成します．そして，これらをホームディレクトリにリンクします． 管理者権限でコマンドプロンプトを開き，

```bat
$ mklink c:\Users\daizu\_vimrc c:\Users\daizu\vimfiles\dotfiles\_vimrc
$ mklink c:\Users\daizu\_gvimrc c:\Users\daizu\vimfiles\dotfiles\_gvimrc
```

とします．

# _gvimrc

`_gvimrc`の設定を以下に記載します．

[フォント] `guifontwide`に等幅の日本語フォントを設定すると，表示がきれいになります．

```vim:
set guifont=Consolas:h10
set guifontwide=IPAGothic:h10
```

[カーソルの色] IMEがONのときにカーソルの色を変更すると，現在の入力モードが判別しやすくなります．同時に，個人的な好みですが，カーソルの点滅をOFFにします．

```vim:
highlight CursorIM guifg=NONE guibg=#00DD00
set guicursor=a:blinkon0
```

[ツールバー・メニューバー]　邪魔なので表示しません．

```vim:
set guioptions-=T
set guioptions-=m
```

# _vimrc

試行錯誤中です．基本的なVimの設定やNeobundleを使ったプラグインの使用方法など，ネットの情報をかき集めて[現状はこのようになっています．](https://github.com/daizutabi/vimfiles/blob/master/dotfiles/_vimrc)

以下，つまづいた点を紹介したいと思います．

[Quickrun] 
Pythonで日本語を含む文字列を出力すると文字化けするので，次のように設定しました．（他に，環境変数`PYTHONIOENCODING`を`utf-8`に設定する方法もあります．が，いろいろ副作用もあるので，下記のような対応をとっています．）

```vim:_vimrc
let g:quickrun_config = {
\   '_' : {
 <<< 中略 >>>
\       'hook/output_encode/enable' : 1,
\       'hook/output_encode/encoding' : 'cp932',
\   },
\}
```

[Python実行環境]
Pythonファイルの実行は，Quickrunで行います．ただし，普通にスクリプトとして実行したい場合もあれば，テストやDoctestを実行したい場合もあります．そこで，次のように，`g:quickrun_config`を設定しました．

```vim:
let g:quickrun_config['python'] = {
\   'command' : 'python',
\   'outputter/buffer/filetype' : 'python_result'
\}
let g:quickrun_config['python.pytest.doctest'] = {
\   'command' : 'py.test',
\   'cmdopt' : '--doctest-modules',
\   'tempfile': '$HOME/.vim/temp/__tmp__.py',
\   'outputter/buffer/filetype' : 'doctest_result'
\}
let g:quickrun_config['python.nose.doctest'] = {
\   'command' : 'nosetests',
\   'cmdopt' : '--with-doctest',
\   'tempfile': '$HOME/.vim/temp/__tmp__.py',
\   'outputter/buffer/filetype' : 'doctest_result'
\}
let g:quickrun_config['python.pytest'] = {
\   'command' : 'py.test',
\   'cmdopt' : '-s -v',
\   'tempfile' : '$HOME/.vim/temp/__tmp__.py',
\   'outputter/buffer/filetype' : 'pytest_result'
\}
```

保存していない編集中のファイルをQuickrunにかけると，デフォルトでは拡張子が`.tmp`であるテンポラリファイルが作成されて実行コマンドに渡されます．通常のPythonの実行では問題ないのですが，nose, pytestでは拡張子が`.py`であることが必要なようなので，`` `tempfile` ``を明示的に指定しています．`` 'outputter/buffer/filetype' ``を指定しているのは，あとからシンタックスカラーを使うためです．

# Pythonファイル用の設定

vimfilesディレクトリ以下に，after/ftplugin/python.vimを作成してPythonファイルを編集するときの設定を記載します．現状では以下のようになっています．

```vim
setlocal completeopt-=preview
setlocal omnifunc=jedi#completions

nnoremap <silent> <buffer> <Leader>w :<C-u>WatchdogsRun<CR>
nnoremap <silent> <buffer> <Leader>tt :<C-u>Pytest file<CR>
nnoremap <silent> <buffer> <Leader>tf :<C-u>Pytest function<CR>
nnoremap <silent> <buffer> <Leader>tc :<C-u>Pytest class<CR>
nnoremap <silent> <buffer> <Leader>tm :<C-u>Pytest method<CR>
nnoremap <silent> <buffer> <Leader>tn :<C-u>QuickRun -type python.nose.doctest<CR>
nnoremap <silent> <buffer> <Leader>td :<C-u>QuickRun -type python.pytest.doctest<CR>
nnoremap <silent> <buffer> <Leader>tp :<C-u>QuickRun -type python.pytest<CR>
nmap <buffer> ,p <Plug>(operator-autopep8)
nmap <buffer> ,pp <Plug>Autopep8Line
nmap <buffer> <F8> <Plug>Autopep8Entire
```

盲点だったのが，

```vim:
setlocal omnifunc=jedi#completions
```

です．これを`_vimrc`の中で

```vim:
set omnifunc=jedi#completions
```

としてしまうと，`_vimrc`が読み込まれた時点では，正しく設定されているものの，Pythonファイルを開いた瞬間に，ファイルタイプごとに読み込まれるデフォルト設定で上書きされてしまいます．デフォルト設定を上書きするために，after/ftplugin/python.vim内で`omnifunc`を指定する必要があります．