##前提
###環境
- macOS Catalina(10.15.3)
- Neovim(0.4.3)
- deinでvim-quickrunをインストール済
やりたかったこと
quickrunで走らせるプログラムに標準入力としてクリップボードの中身を渡すこと.
動機
競プロのテストケースを手軽なキーバインドで実行したかった.しかし,vim力と時間が足りなかった.
そこで,ひとまずinit.vimでcppファイルを読んだときにautocmdでベタ打ちのQuickRunのコマンドにキーバインド(runとか)を付ければいいだろうという結論に達した.
コピーしてきたテストケースを実行するにあたって,inputオプションにそのまま入力文字列を入れるのは不都合があったし,新しくファイルを作るのも少々手間かつキーバインドの定義に要求される技術力が上がってしまう.したがって,clipboardから直接入れるという方法が最善だと思った.ここで詰まった.
##解決
:help QuickRun
してドキュメントを読むと,
input (*)
標準入力に流し込むファイルを指定します。先頭が = で始まっていた場合、それ以降の文字列を入力として扱います。
また,
オプション値の構文
いくつかの設定は、実行時に中身の一部が置換されます。(*) がついている設定は、@,&,$で始まる単語をそれぞれレジスタ、オプション、環境変数として展開します。曖昧さを避ける為、単語を{}で囲っても良いです。
とあるので,init.vimでset clipboard=unnamed
としている人は無名レジスタとクリップボードとの紐つけがあるので,無名レジスタの中身(=クリップボードの中身)を文字列としてinputに流し込むためには-input =@
とオプションを付ければよい.
###コード
最終的に,init.vimにこう記述することにした.
autocmd BufNewFile,BufRead *.cpp nnoremap <silent>run :QuickRun -command g++ -outputter quickfix -cmdopt -Wall -input =@<CR>
##終わりに
QuickRunはとても便利だが,Atcoderをやるぶんにはもっと良いツールを公開してくださっている方がいらっしゃるし,自前でももう少し高機能なモノを書けると思うので,テストの実行はどんどん改善していきたい.
(ここに書くべきではない余談ですが,deinのtomlファイルでhook_addで辞書型の変数をletしようとすると[dein] Vim(let):E15: 無効な式です: {
と出て困っているので,もし原因に見当のつく方がいらっしゃれば教えてくださると泣いて喜びます.)