kenban nikki    archives   tags   

Vimで始める競技プログラミング

2019-08-01

Visual Studio Codeを使った競技プログラミングの環境構築記事をよく見かけますが、Vimも便利なので方法を書いておきます1。macOS 12.14.5を使っています。

コンパイラのインストール

XcodeをインストールしてClangを使うか、Homebrew経由でGCCをインストールすることができます。GCCにはC++の標準ライブラリの集合体が入っていて便利なようなので、後者をとります。

インストールが終わったらバージョンを確かめてシンボリックリンクを張りましょう。

# Install gcc
brew install gcc
# Make symbolic links
ln -s /usr/local/Cellar/gcc/9.1.0/bin/gcc-9 /usr/local/bin/gcc
ln -s /usr/local/Cellar/gcc/9.1.0/bin/g++-9 /usr/local/bin/g++

Vimの設定

シンタックスハイライト

C++のシンタックスファイルはデフォルトで入っているので特に何かをする必要はないのですが、いろいろな言語のシンタックスとインデントの設定がパックされているプラグインvim-polyglotを使うのも良いかと思います。

プラグイン管理にはvim-plugがおすすめです。

.vimrc

Plug 'sheerun/vim-polyglot'

入力補完

私は入力補完を特に使っていないのですが、いろいろなプラグインがあります。新しいものも続々と出ているようです。

今後必要があったら試してみようと思います(2020-04-18追記deoplete.nvimを使うことにしました。設定はこちらの記事をどうぞ)。

すぐに実行

ここが本当に書きたかった部分です。

vim-quickrunを使うと書いたプログラムをすぐに実行できます。

これまでは標準入力を与える方法を知らなかったり、コンパイル後の実行時に標準入力を読み取ってくれなかったりしたのですが、よくよくヘルプを読んだり調べたりしたら全て解決しました。

標準入力は-inputオプションをを付けることで、コンパイル後の標準入力付きの実行は非同期実行を行わない(runnerとしてvimprocではなくsystemを使う)ことで実現できます。

具体的な方法は以下の通りです。

まず、vim-quickrunとコマンドの非同期実行に使うvimprocをインストールします。

.vimrc

Plug 'thinca/vim-quickrun', {'on': 'QuickRun'}
Plug 'Shougo/vimproc.vim', {'do': 'make'}

:PlugInstallでインストールが完了したら、次のように設定します。

.vimrc

nnoremap <silent><leader>r :QuickRun<CR>  " キーマップの設定
let g:quickrun_config = {}

let g:quickrun_config._ = {
    \ 'outputter/error/success': 'buffer',
    \ 'outputter/error/error': 'quickfix',
    \ 'outputter/quickfix/open_cmd': 'copen',
    \ 'runner': 'vimproc',  " 非同期実行を行う
    \ 'runner/vimproc/updatetime': 60,
    \ 'hook/time/enable': 1  " 実行にかかった時間を表示する
    \ }

" おまけの設定 for Python
let g:quickrun_config.python = {
    \ 'command': '~/.pyenv/shims/python',  " pyenvでインストールしたPythonを使う
    \ 'cmdopt': '-u'  " 標準出力を都度表示する
    \ }

let g:quickrun_config.cpp = {
    \ 'command': 'g++',
    \ 'input': 'input',  " inputというファイルを標準入力として与える
    \ 'runner': 'system'  " 非同期実行を行わない
    \ }

この状態で:QuickRun<leader>+ rすればソースファイルがコンパイルされ、inputというファイルを標準入力として与えられた状態でプログラムが実行されます。

コマンドを打ち込む場合は、:QuickRun -input inputまたは:QuickRun <inputとすれば同じことができます。

また、:QuickRun -input =5または:QuickRun <=5で数値や文字列を直接渡すことができます。

が、スペース区切りの数値列を与えることはできなかったのでその場合は大人しくファイルを読み込ませるしかないようです。

これだけの設定でも大分便利になりますね。それではハッピー競技プログラミング!

参考にしたサイト


  1. ちなみに私はフルタイムVimmerからハーフタイムVimmerハーフタイムAtommerを経て今はフルタイムVisual Studio CoderパートタイムVimmerです。 ↩︎