しばたテックブログ

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

Visual Studio Code PowerShell拡張の設定まとめ

前回のエントリでコードフォーマットに関する設定をまとめましたが、折角なのでほかの設定もまとめてみました。

stknohg.hatenablog.jp

今回説明する設定はすべてsettings.jsonの項目になります。

1. 拡張機能に関する設定

最初に拡張機能そのものに関する設定について記載します。

powershell.startAutomatically (Ver.0.11より)

PowerShellのスクリプトファイルを開いた際にPowerShell拡張を自動的に開始するか否かを設定します。
デフォルトtrueです。

この設定をfalseにした場合、

> PowerShell: Restart Current Session

コマンドを明示的に実行しないと拡張が有効になりません。

このオプションはマシンスペックの低い環境や、拡張の起動よりもファイルの内容を参照することを優先させたい場合に使う事を想定しているそうです。

powershell.useX86Host (Ver.0.5より)

64bit OSの環境で32bit版の拡張機能を利用するか否かを設定します。
デフォルトfalseです。

32bit OSの環境でこのパラメーターを設定しても何も起きません。

powershell.enableProfileLoading (Ver.0.6より)

Powershell拡張の起動時にプロファイル(profile.ps1Microsoft.VSCode_profile.ps1)をロードするか否かを設定します。
Ver.0.6.1からデフォルト値がtrueになっています。(Issue #180)

プロファイルについての詳細は、

stknohg.hatenablog.jp

のエントリを参考にしてください。

なお、デバッガはこの設定の影響を受けません。

powershell.developer.powerShellExePath (Ver.0.7.1より)

デフォルトでないPowerShellを使う場合にその実行ファイルのパスを指定します。
デフォルト値は""(デフォルトのPowerShellを使う)です。

このパラメーターはVer.1.4.0よりpowershell.powerShellExePathに移行され、非推奨となりました。

powershell.powerShellExePath (Ver.1.4.0より)

デフォルトでないPowerShellを使う場合にその実行ファイルのパスを指定します。
デフォルト値は""(デフォルトのPowerShellを使う)です。

powershell.developer.editorServicesLogLevel (Ver.0.4より)

PowerShell Editor Servicesのログレベルを設定します。
設定可能な値はVerboseNormalWarningErrorで、デフォルト値はNormalです。

この設定はPowerShell拡張でエラーが出た場合の調査用ですので、通常この内容を変える必要はありません。

ちなみにログフォルダは、

> PowerShell: Open PowerShell Extension Logs Folder

コマンドで開くことができます。

2. Integrated Terminal(Integrated Console)に関する設定

PowerShell拡張Ver.0.10より統合ターミナル(Integrated Terminal)にPowershell拡張独自のコンソール(Integrated Console)が使える様になりました。
ここではIntegrated Consoleに関わる設定について記載します。

powershell.integratedConsole.showOnStartup (Ver.0.11より)

PowerShell拡張の起動時にIntegrated Consoleを起動するか否かを設定します。
デフォルトtrueです。

powershell.integratedConsole.focusConsoleOnExecute (Ver.0.11より)

スクリプト実行時にIntegrated Consoleにフォーカスを移すか否かを設定します。
デフォルトtrueです。

3. コード支援に関する設定

PowerShell Script Analyzer等のコード支援機能にかかわる設定について記載します。

powershell.scriptAnalysis.enable (Ver.0.2より)

PowerShell Script Analyzerによるリアルタイムコード分析を有効にするか否かを設定します。
デフォルトtrueです。

powershell.scriptAnalysis.settingsPath (Ver.0.6より)

ユーザー独自のPowerShell Script Analyzer設定ファイルを指定します。
デフォルト""です。

この設定により既定の動作を上書きできる様になります。
設定例についてはこちらをご覧ください。

4. その他の設定

最後にその他の、おもに中の人向けの設定について記載します。

ここで説明する内容ついては自信の無い部分もありますので、もし間違いがあればご指摘いただけると助かります。

powershell.developer.editorServicesWaitForDebugger (Ver.0.2より)

この設定をtrueにするとPowerShell Editor Serviceを/waitForDebuggerパラメーター付きで起動します。
細かいところはよくわからないのですが、ざっとソースを調べた限りではこのパラメーターが指定されるとPowerShell Editor Serviceの起動時にデバッガからアタッチされるのを待ち続ける様です。

おそらく中の人向けの機能だと思われます。

powershell.developer.bundledModulesPath (Ver.0.7.1より)

リリースノートに明記されていないのですが、コミットログを追う限りVer.0.7.1から導入されている様です。

もともとはPowerShell拡張で使われるモジュール(PowerShell Editor ServicesPowerShell Script AnalyzerPlasterなど)のパスを設定するものだったのですが、Ver.0.10から中の人向けの機能になった様です。

デフォルト値は"../modules/"から""に変更されています。

powershell.developer.featureFlags (Ver.0.11より)

PowerShell拡張で実験的な機能を有効にするためのフラグを設定するそうです。
デフォルト値は空の配列です。

ただ、現時点でここに設定可能なフラグはない様で今後のリリースで増えていくものと思われます。
この設定はStart-EditorServices.ps1-FeatureFlagsパラメーターとしてPowerShell Editor Serviceに渡されるのですが、ソースを見ればわかりますが、現時点ではスクリプト内で全く使われていません。

powershell.developer.powerShellExeIsWindowsDevBuild (Ver.0.9より)

実行しているPowerShellが開発者向けビルドであることを明示するための設定です。
デフォルトfalseです。

完全に中の人向けの設定で、この設定により何が起こるのかは全くわかりません。

最後に

ざっとですがPowerShell拡張の設定をまとめてみました。
フォーマットに関する設定同様このエントリの内容は随時更新していきたいと思います。

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の起動が遅いと感じる様でしたら各プロファイルで呼ばれている処理を見直すことで改善できますのでぜひ試してみてください。