しばたテックブログ

気分で書いている技術ブログです。

Visual Studio Code PowerShell拡張で設定可能なコードフォーマットまとめ

Visual Studio Code PowerShell拡張のVersion 0.9からコードフォーマッターの機能が追加されコードの自動フォーマットができる様になりました。

marketplace.visualstudio.com

本エントリでは設定可能なフォーマットスタイルをまとめます。
以降で説明する設定はすべてsettings.jsonで設定する項目になります。

1. Visual Studio Code全体の設定と共有される設定

はじめにVisual Studio Code全体とPowerShell拡張で共有される設定について記載します。

editor.tabSize

1タブ当たりのスペース数です。
デフォルト4タブです。

editor.formatOnSave (Ver.0.9より使用可)

ファイルの保存時に自動フォーマットするか否かの設定です。
デフォルトfalseです。

editor.formatOnType (Ver.0.10より使用可)

エディター入力時に自動フォーマットするか否かの設定です。
デフォルトfalseです。
Ver.0.10で利用可能になりました。

editor.formatOnPaste (Ver.0.9より使用可)

エディターにペーストした際に自動フォーマットするか否かの設定です。
デフォルトfalseです。

この設定に関してはリリースノートに明記されていなかったのですがVer.0.9から利用可能だった様です。
ただバグがあった様で実質Ver.0.10から使える様になった感じです。

2. 【2017/07/13追加】スタイルのプリセット

ここからはPowerShell拡張の設定になります。

powershell.codeFormatting.preset (Ver.1.4.0より使用可)

Ver.1.4.0よりコードフォーマットに関する設定が大きく変わり、基本的なスタイルをあらかじめ定義済みのものから選び、細かい部分を個別に設定する様に変更されました。
このpowershell.codeFormatting.presetでは以下のスタイルを選択することができます。

1. OTBS(One True Brace Style)
# } の後に改行を入れない cuddled else ができるスタイル
if ($var -eq $true) {
    # Do the thing
} else {
    # Do something else
}
2. Stroustrup
# } の後に改行が必ず入るスタイル
if ($var -eq $true) {
    # Do the thing
}
else {
    # Do something else
}
3. Allman
# { と } を改行して入れるスタイル
if ($var -eq $true)
{
    # Do the thing
}
else
{
    # Do something else
}
4. Custom

すべての設定を自分でカスタマイズするスタイル。
デフォルトはこのスタイルです。

3. ブレーススタイルに関する設定

powershell.codeFormatting.openBraceOnSameLine (Ver.0.9より使用可)

オープンブレース({)を関連する文と同じ行に記載するか否かの設定です。
デフォルトtrueです。

コード例)

# trueの場合
if ($true) {
    
}

# falseの場合
if ($true)
{
    
}

powershell.codeFormatting.newLineAfterOpenBrace (Ver.0.9より使用可)

オープンブレース({)の後は改行するかどうかを設定します。
デフォルトtrueです。

コード例)

# trueの場合
#   { の後は強制的に改行される
if ($true) {
    Write-Output "Hello"
}

# falseの場合
#   以下の様な書き方が許容される
if ($true) { Write-Output "Hello"
}

powershell.codeFormatting.newLineAfterCloseBrace (Ver.0.10より使用可)

クローズブレース(})の後は改行するかどうかを設定します。 デフォルトtrueです。

コード例)

# trueの場合
#   } の後は強制的に改行される
if ($true) {
    
}
else {
    
}

# falseの場合
#   } の後改行されないので、cuddled elseが許容される
if ($true) {
    
} else {
    
}

4. スペースに関する設定

powershell.codeFormatting.whitespaceBeforeOpenBrace (Ver.0.10より使用可)

各種キーワードとオープンブレース({)の間にスペースを強制するか否かを設定します。
デフォルトtrueです。

コード例)

# trueの場合
#   { の前に1スペースが強制される
if ($true) {
}

# falseの場合
#   以下の様な書き方が許容される
if ($true){
}
if ($true)     {
}

powershell.codeFormatting.whitespaceBeforeOpenParen (Ver.0.10より使用可)

ifelseifwhileswitchなどのキーワードとその条件式(()の部分)の間にスペースを強制するか否かを設定します。
デフォルトtrueです。

コード例)

# trueの場合
#   if の後に1スペースが強制される
if ($true) {
}

# falseの場合
#   以下の様な書き方が許容される
if($true) {
}
if      ($true) {
}

powershell.codeFormatting.whitespaceAroundOperator (Ver.0.10より使用可)

二項演算子および代入演算子の両側に1スペースを強制するか否かを設定します。
デフォルトtrueです。

コード例)

# trueの場合
#   = や * の間に1スペースが強制される
$y = $x * 2

# falseの場合
#   以下の様な書き方が許容される
$y=$x*2
$y   =   $x   *   2

powershell.codeFormatting.whitespaceAfterSeparator (Ver.0.10より使用可)

セパレーター(,;)の後に1スペースを強制するか否かを設定します。
デフォルトtrueです。

コード例)

# trueの場合
#   ;の後に1スペースが強制される
Write-Output "Hello"; Write-Output "World"

# falseの場合
#   以下の様な書き方が許容される。
Write-Output "Hello";Write-Output "World"
Write-Output "Hello";      Write-Output "World"

powershell.codeFormatting.ignoreOneLineBlock (Ver.0.10より使用可)

1行で収まるif文やスクリプトブロックはフォーマットの対象外にするか否かを設定します。
デフォルトtrueです。

コード例)

# trueの場合
#   以下の様に1行で収まるif文はコードフォーマットされない
$result = if ($cond) { Write-Output "True" } else { Write-Output "False" }

# falseの場合
#   1行で収まろうともコードフォーマットが強制される
$result = if ($cond) {
    Write-Output "True" 
}
else {
    Write-Output "False" 
}

powershell.codeFormatting.alignPropertyValuePairs (Ver.1.0より使用可)

  • 2017/05/11追加

ハッシュテーブル内でキーと値を縦並びに記述した場合に、=の位置を縦に揃えるか否かを設定します。
デフォルトtrueです。

この設定は主にDSC Cofigurationを記述する際のハッシュテーブルのフォーマットを想定しているそうです。

コード例)

# trueの場合
#   ハッシュテーブル内の = の位置が縦に揃う様にフォーマットされる
#   ネストしたハッシュテーブルにも対応している
$formatTest = @{
    Apple     = 4
    Banana    = 3
    Tangerine = @{
        Orange         = 2
        CornflowerBlue = 6
    }
}

# falseの場合
#   ハッシュテーブル内の = の位置はフォーマットされない
#   powershell.codeFormatting.whitespaceAroundOperator の設定に従う
$formatTest = @{
    Apple = 4
    Banana = 3
    Tangerine = @{
        Orange = 2
        CornflowerBlue = 6
    }
}

最後に

普段からコードフォーマットはIDEに任せっきりにな自分にとってこの機能追加はほんとうに助かります。

GitHubのIssueなどを見る限りまだまだフォーマットに関する設定は増えそうですのでこのエントリの内容は随時更新していきたいと思います。

PowerShellの起動時に表示されるプロファイルに関するメッセージについて

小ネタです。

Windows 10などでPowerShellの起動時に以下の様なメッセージが表示され、プロファイルの読み込みにかかった時間が表示される場合があります。

パーソナル プロファイルとシステム プロファイルの読み込みにかかった時間は xxx ミリ秒です。
(英文だと Loading personal and system profiles took xxx ms.)

表示例)

f:id:stknohg:20170313184238p:plain

本エントリではこのメッセージがどういった場合に表示されるのかについて説明します。

このメッセージの実体について

残念ながらこのメッセージについてのドキュメントはない様です。

仕方ないのでソースファイルを検索して情報を探します。

細かい手順は省いて結果だけ説明すると、このメッセージはConsoleHostクラス(ConsoleHost.cs)のDoRunspaceInitializationメソッドで呼ばれて表示されています。

ソース中で該当する箇所はこちらとなり、その内容を以下に転記します。

// ConsoleHost.DoRunspaceInitialization() メソッドより転記

// Run the profiles.
// Profiles are run in the following order:
// 1. host independent profile meant for all users
// 2. host specific profile meant for all users
// 3. host independent profile of the current user
// 4. host specific profile  of the current user

var sw = new Stopwatch();
sw.Start();
RunProfile(allUsersProfile, exec);
RunProfile(allUsersHostSpecificProfile, exec);
RunProfile(currentUserProfile, exec);
RunProfile(currentUserHostSpecificProfile, exec);
sw.Stop();

var profileLoadTimeInMs = sw.ElapsedMilliseconds;
if (profileLoadTimeInMs > 500 && s_cpp.ShowBanner)
{
    Console.Error.WriteLine(ConsoleHostStrings.SlowProfileLoadingMessage, profileLoadTimeInMs);
}

見ての通り、PowerShellの起動時に呼ばれる4つのプロファイル(AllUsersAllHostsAllUsersCurrentHostCurrentUserAllHostsCurrentUserCurrentHost)が実行されるのにかかる時間を計測し、その時間が500msを超える場合にメッセージが表示されることがわかります。

このメッセージを表示させない様にするにはPowerShellを起動する際に-NoLogoを指定するしかない様です。
ユーザーがこの設定に介入する余地はありませんが、このメッセージが出るのはプロファイルの呼び出しに時間がかかっているのが根本的な問題ですので、プロファイルで呼ばれる処理を見直すことで対処するのが筋だと思います。

また、このメッセージはPowerShell 5.1から導入されており、以前のバージョンで表示されることはありません。

まとめ

とりあえずこんな感じです。

このメッセージが導入された経緯は正確にはわかりませんが、おそらく、起動が遅いと散々言われているPowerShellの起動時間を改善していくなかで、PowerShellそのものに起因する部分とユーザーの設定(プロファイルの設定)に起因する部分を切り分けたいという意図があるのではないかと思われます。

もしこのメッセージが出てPowerShellの起動が遅いと感じる様でしたら各プロファイルで呼ばれている処理を見直すことで改善できますのでぜひ試してみてください。

VisualStudioUninstallerを使ってVisual Studio 2015をアンインストールしてみた

つい先日Visual Studio 2017がリリースされました。

本エントリは、Visual Studio 2017をインストールするために手元の開発機にインストールされていたVisual Studio 2015をアンインストールした際の作業記録になります。

VisualStudioUninstaller

Visual Studioを一発で完全?アンインストールしてくれるすごいやつ。
Visual Studio 2013以降に対応しているそうです。

github.com

作業記録

0.はじめの状態

はじめの状態はこんな感じ。
Visual Studio 2015本体に加え、.NET FrameworkのMulti-Targeting PackやらSQL Sever Express LocalDBやらの関連するツール類が大量にいる状態です。

f:id:stknohg:20170312040519p:plain

1. VisualStudioUninstallerのダウンロードと展開

VisualStudioUninstallerの使い方は、RelesesあるZipをダウンロード+展開して、アンインストーラーであるSetup.ForcedUninstall.exeを管理者権限で実行するだけです。

今回は全て手作業でやりましたが、PowerShellで以下の様にしても良いかと思います。

$Uri="https://github.com/Microsoft/VisualStudioUninstaller/releases/download/v1.4/TotalUninstaller.zip"
Invoke-WebRequest -Uri $Uri -OutFile .\TotalUninstaller.zip
Expand-Archive -Path .\TotalUninstaller.zip

展開した結果はこんな感じ。

f:id:stknohg:20170312041347p:plain

2. Setup.ForcedUninstall.exeの実行

Setup.ForcedUninstall.exeを実行すると本当にアンインストールするか確認されるので「y」を入力するとアンインストールが開始されます。

f:id:stknohg:20170312041552p:plain

アンインストールにかかる時間は環境によって異なるでしょうが、私の環境では10分くらいかかりました。

f:id:stknohg:20170312041640p:plain

Visual Studio本体のアンインストール後に周辺ツールのアンインストール、レジストキーの削除が行われているのがわかります。

アンインストール結果

アンインストールした結果はこんな感じになりました。

f:id:stknohg:20170312041751p:plain

VCランタイムはこのツールでは削除できない様です(多分他で使われているか否かを判別する方法が無いのでしょう)。

他にも若干アンインストールしてくれて構わないツールが残ってしまいましたが、これくらいであれば手作業で構わなかったのでそのまま手作業でアンインストールしました。

Visual Studio以外で使われている可能性のあるツールについて削除しても構わないかの判定が厳しめなのかな?という印象です。