quickrun.vimで左右に画面分割してスクリプトの実行結果を右画面で見るまでの話

はじめに〜動機・目的〜

前回やったことの流れで、その時の目的(Vimで書いたMarkdownのプレビューをすぐブラウザで確認する)はある程度達成されたのだけど(最終的にはprevimを使っているけどquickrun経由でもブラウザで結果を見れるようになった)、その後ふと思った「そもそもquickrunって何ができるんだ?」という興味。

もちろんMarkdownのプレビューをできるようにするためだけのものではないだろうし、ということで想像を進め、まあ常識的に考えて第一にできることとしては、今開いているバッファでコーディングしている内容を、すぐに画面分割して、そっちで実行結果を見れる、みたいなことなのかなと。

Markdownの方では、open-browser.vimを使うことでブラウザに実行結果が飛んだけど、通常のコーディングではいちいちブラウザに飛んで実行結果を確認するのは面倒なわけで、そういうことだろう、と。

ただ、いろいろ説明を読むと、「水平分割にする方法」とか「実行結果を下に出す方法(上ではなく)」などの設定はあるけど、「左右に分割する設定」というのを見かけない。
なら、普通に考えたら単にデフォルトが左右分割なんじゃないの? という気もするが、デフォルトでやると、上下に分割されて、なおかつ結果は上に出る。(だから下に出すための設定、というのもあったのだろうが)

ということで、これを解決したいなと。

試行

最初に参照したのは公式ドキュメント、

の、とくに現時点での514行目あたりを見ていたのですが、

outputter/buffer/split

デフォルト: '{winwidth(0) * 2 < winheight(0) * 5 ? "" : "vertical"}'
出力専用バッファを開く際の補助コマンドを指定します。バッファを開く際に
|:split| コマンドの前に挿入されます。

これをどう生かしたらいいのか・・というのはその場ではわからず。

次に、以下でも同設定について詳しく解説されていたので参考にしていたのですが、

たとえば後者の方ではこんな解説が。

デフォルトだと vsplit されるが、split にしたい場合には、 以下の設定をします。

let g:quickrun_config={'*': {'split': ''}}

quickrun のバッファを下に表示したい場合は、以下の設定にします。

let g:quickrun_config={'*': {'split': ''}}
set splitbelow

new したときも、同様に新しいバッファが下にできます。

quickrun の buffer を開く場所を指定することが可能です。

set splitbelow 新しいウィンドウを下に開く
set splitright 新しいウィンドウを右に開く

ふむ・・やっぱりデフォルトだとvs(左右分割)になるのか・・ならないけど・・と思いつつ、その下に書かれている「常に実行時間を表示する」という設定を試しにやったらそれは表示されるので、なにか根本的に間違っているということでもなさげ・・
という感じで、しばらくハマるものの解決せず一旦タイムアップ。(基本的に仕事の合間にやっているから)

再開後、ひき続きハマりの時間を楽しみつつ(そういえば思うようにできない、というのはなかなか楽しい。永遠に続くことは求めていないが)、ついに以下の記事を検索で発見。

マジ神! まさに知りたいことだけが書いてあった。

" 垂直分割にする
let g:quickrun_config={'*': {'split': 'vertical'}}

を追加すればOKです。

そっか・・一つ前のリンクでかなり接近していたんだな・・! と思ったりしつつ、ここで一段落。というかこれに、実行結果を右に出す設定を加えて一段落。

ただ、その後にあらためて以下の記事を拝見すると、

また、キーには type ではなくて "_" を使用することで全ての type に対するデフォルト値を設定することができます。

* ではなくて _ です。

*は古い設定方法なので _ を使用しましょう。

とあったので、そこは言われる通りにちょっと修正しましたが。

結果

ということで、これにより、たとえばぼくは今、Perl入学式でとにかくPerlスクリプトを書いては、それがどう実行されるのか、というのをすぐ見れたい感じになっているので、それをやってみるとこんな。

Perl with quickrun.vim

右に実行結果が出ています。いい感じ!

今回参考にした、上記以外のサイトはこちらです。皆さんありがとうございました。

補足

ショートカット設定

ところで、quickrunを実行するにはコマンドラインモードで「:Quickrun」とすればいいんだけど、ショートカットとして「\ r」というのが用意されていて、これはコマンドラインモードに打ち込むよりは、プラスもしかすると英語キーボードだと打ちやすいのかもしれないのですが、僕の使っている日本語キーボードだとなかなかショートカットになってない部分もあって(option押しながら右上の円記号を押す・・という)、なので一旦バックスラッシュをvimrcの設定で他のキーと置換してみたのですが、それだと動かず・・なので、vimrcにnnoremapで「:Quickrun」のショートカットを設定して<C-q>キー一発操作で実行するようにしました。
(元々の<C-q>は<C-v>が効かない場合の代替のようだけど、僕の環境では<C-v>がっつり使えるのでこれに割り当てた)

nnoremap <silent> <C-q> :QuickRun<CR>

便利!

(※追記。ターミナル(iTerm2)からだと、\ rは効くけどこの<C-q>は効かなかった・・なんでだろう。まあ普段はアプリの方を使ってターミナルから書くことはあまりないので良いといえばいいのだが・・。追記ここまで)
(※再追記。いろいろ試したら<C-q>以外のたとえば<C-l>ならターミナルからでも効いた。なんでや・・でも割り当てキー的にはそれでも悪くはないのでとりあえずそれにしつつ様子見てみるつもり。再追記ここまで)

vimrcの記載順

もうひとつ。僕の場合、一旦上記のスクリプト左右分割が上手く行った後、あらためてMarkdown + quickrunを試してみたら、今度はそれがブラウザに飛ばなくなっちゃって。それでまたあれ〜・・となったんだけど、それは

let g:quickrun_config={'_': {'split': 'vertical'}}  

が、

let g:quickrun_config['markdown'] = {
      \   'outputter': 'browser'
      \ }

よりも下に来ていたからのようで、後者のMarkdown設定の方を下に持ってきたら、Markdownはブラウザ、それ以外のPerlRubyスクリプトは分割画面で実行結果が見られるようになりました。
vimrcって、下に行くほど優先的に動作する、ということなんでしょうかね。だったら良い気づきでしたが。

以上です!