C++と色々

主にC++やプログラムに関する記事を投稿します。

Visual Studio CodeのRunnerを試してみた

mattn.kaoriya.net

こちらの記事で紹介されているRunnerを試しに使ってみました。

Visual Studio Marketplace

Runnerのインストールが完了したら、Visual Studio CodeのUser Settingsから、setting.jsonを編集します。
runner.languageMapというキーのオブジェクトの子に、キーをプログラミング言語名、値を実行したいコマンドの文字列を記述します。Windowsの場合はビルド用のbatファイルを作成して、それを値に設定するのが良いでしょう。
また、Visual Studio Codeの標準に入っていないプログラミング言語は、runner.extensionMapというオブジェクトの子に、キーをプログラミング言語*1、値に対応する拡張子を指定すると、その拡張子のファイルに対して、runner.languageMapの同じキーを持つコマンドを実行できるようになります。 例として私のsetting.jsonです:

// Place your settings in this file to overwrite the default settings
{
    "editor.renderWhitespace": true,
    "editor.insertSpaces": "space",
    "editor.fontSize": 15,
    "editor.wrappingColumn": 0,
    "runner.languageMap": {
        "c": "C:/VisualCodeRunner/crun.bat",
        "cpp": "C:/VisualCodeRunner/cpprun.bat",
        "java": "C:/VisualCodeRunner/javarun.bat",
        "csharp": "C:/VisualCodeRunner/csrun.bat",
        "scala": "C:/VisualCodeRunner/scalarun.bat",
        "ruby": "C:/VisualCodeRunner/rubyrun.bat"
    },
    "runner.extensionMap": {
        "scala": "scala"
    }
}

ScalaVisual Studio Code標準では含まれていませんが、このようにすることで.scalaファイルに対してC:/VisualCodeRunner/scalarun.batを実行できるようになります。
余談ですが、Visual Studio CodeはScalaのコードをシンタックスハイライトしてくれないので、こちらの拡張を入れると良いです。

Visual Studio Marketplace

さて、ソースコードファイル上でCTRL+SHIFT+Rを押すと、runner.languageMapに設定したコマンドを実行することができます。各言語ごとに用意されているわけではなく、自分で作成するしかありません。私はCドライブ直下にVisualStudioCodeRunnerというディレクトリを作成し、各言語ごとのbatファイルを置いています。 mattnさんのブログにいくつかサンプルでbatファイルがありますが、そのままでは動かなかったものを修正したり、自分用に簡素化して利用しています。 C言語用のbatファイルのサンプルは:

@echo off

if "%1" equ "" goto :eof

setlocal
set tempfile=%date:~4%%time::=%
set tempfile=%tempfile:/=%
set tempfile=%tempfile:.=%
 gcc -o %tempfile%.exe "%1"
%tempfile%.exe
del %tempfile%.exe

となっていますが、tempfileにスペースが含まれてしまうため、正しく実行ファイル名にならず動きませんでした。 set tempfile=%tempfile:.=%の次の行に set tempfile=%tempfile: =%を追加すると動きます。ブログに乗っていたC言語用のサンプルを元に私はイカのようにして使用しています:

C言語

@echo off

if "%~dpnx1" equ "" goto :eof

setlocal
set tempfile=%date:~4%%time::=%
set tempfile=%tempfile:/=%
set tempfile=%tempfile:.=%
set tempfile=%tempfile: =%
clang -o %tempfile%.exe "%~dpnx1"
%tempfile%.exe
del %tempfile%.exe
endlocal

私はC++でclang++を指定しているついででclangにしていますが、gccで構いません。C++もg++で構いません。サンプルでは他にC#Javaがありました。C#はほとんど同じ設定で利用しています。Javaは簡素化させました。複数ファイル使う予定がないためクラスファイル検索を省略し、本当はencodingをutf-8にしたかったのですが、Windowsのcmdの都合でデフォルトのencoding(chcp 932)で利用しています。

Java

@echo off

setlocal
if "%~dpnx1" equ "" goto :eof
javac %~dpnx1
if %ERRORLEVEL% neq 0 goto :eof
java -cp %~dp1; %~n1
endlocal
del "%~dpn1.class"
:eof
exit /b %ERRORLEVEL%

C++はCと同様です。clang++という点と-std=c++1zが指定されている点が異なります。

C++

@echo off

if "%~dpnx1" equ "" goto :eof

setlocal
set tempfile=%date:~4%%time::=%
set tempfile=%tempfile:/=%
set tempfile=%tempfile:.=%
set tempfile=%tempfile: =%
clang++ -o %tempfile%.exe "%~dpnx1" -std=c++1z
%tempfile%.exe
del %tempfile%.exe
endlocal

Scala

@echo off

if "%~dpnx1" equ "" goto :eof

scala "%~dpnx1"

Ruby

@echo off

if "%~dpnx1" equ "" goto :eof

ruby "%~dpnx1"

気が向いたら対応するプログラミング言語のbatファイルを増やしていきたいなあと思います。最後になりますが、各プログラミング言語のコマンド(clang, gcc, ruby, scala, javac, javaなど)はcmdにパスが通っている前提で書かれています。

*1:本当は任意ですが、プログラミング言語名にしておくのがわかりやすいと思います