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
で数値や文字列を直接渡すことができます。
が、スペース区切りの数値列を与えることはできなかったのでその場合は大人しくファイルを読み込ませるしかないようです。
これだけの設定でも大分便利になりますね。それではハッピー競技プログラミング!
参考にしたサイト
ちなみに私はフルタイムVimmerからハーフタイムVimmerハーフタイムAtommerを経て今はフルタイムVisual Studio CoderパートタイムVimmerです。 ↩︎