LoginSignup
74
59

VSCodeのターミナル/プロファイルの設定の詳細

Last updated at Posted at 2021-05-14

Abstract

VSCodeの利便性を支える要素の一つは間違えなくターミナルではないかと思います。
本記事では最新のターミナルの設定方法を紹介し、その設定の詳細に触れていこうと思います。

Version

VScode: 1.64.2
April 2021 (version 1.56)の更新以降についての話です。
またWindowsで基本的に記述しています。適宜読み替えてください。

従来の設定方法 ## 従来の設定方法

Version 1.56以前の話です。読み飛ばしても大丈夫です。
VSCodeのアップデート(since 1.56)に伴い、これまでのターミナルの一部設定項目がdeprecatedとなりました。
→ 1.80.0で削除されました!
これまでshellの指定及びその起動オプションは以下のような設定でした。

settings.json
{
    "terminal.integrated.shell.windows": "C:\\WINDOWS\\system32\\cmd.exe",
    "terminal.integrated.shellArgs.windows": [
        "/k",
        "chcp",
        "65001"
    ]
}

※文字コードをutf-8でコマンドプロンプトを起動するという設定です。
アップデートされたVSCodeで見てみると、警告が出ていますね。

This is deprecated, use #terminal.integrated.defaultProfile.windows# instead(2)

ということで、新しい設定に移行していきましょう。

プロファイル設定方法

結論

terminal.integrated.defaultProfile.*, terminal.integrated.profiles.*を使って設定します。*にはwindows, linux, macのように、お使いのOSが入ります。以下windowsで説明を行いますので、適宜読み替えてください。

ターミナルをprofileという単位で管理するシステムになったようです。profileは

  • どのターミナルを使うか
  • その起動オプション
  • 環境変数の設定

などをまとめたものです。
profileはterminal.integrated.profiles.windowsに追記していきます。

settings.json
"terminal.integrated.profiles.windows": {
    "名前": {
        "path": "ターミナルやシェルのパス(エイリアス可)",
        // "sourse": "PowerShell" または "Git Bash",  // windows限定。
        "args": [
            // 起動オプション。これまでterminal.integrated.shellArgs.windowsなどで設定したいたもの。
        ],
        "overrideName": true,  // タブに表示される名前に関する設定。trueに設定を推奨。詳しくは後述。
        "env": {
            "環境変数名": "値"
            // "JAVA_HOME": "C:\\Program Files\\Java\\jdk-13.0.1" など
        },
        "icon": "terminal-cmd",  // アイコンID。色々ある。後述。
		"color": "terminal.ansiRed"  // アイコンの色を設定する。後述。
    }
}

path, sourceについて

公式によると

A source is available only on Windows and can be used to let VS Code detect the install of either PowerShell or Git Bash. Alternatively, a path pointing directly to the shell executable can be used.

要約すると

  • sourceはwindows限定で、インストールされているpowershell, git bashのどちらかを指定できるもの
  • pathはシェルのパスを指定するもの。どのOSでも使える
    • 恐らく既定のターミナルでパスが通っていれば、zsh, bashとかでオッケー

windowsでコマンドプロンプトを使いたい場合はpathで指定します。
sourceにコマンドプロンプトを選択肢に入れてない辺り、コマンドプロンプトよりもpowershell推しなのでしょう。

settings.json
{
   ...
        "path": [
    		"${env:windir}\\Sysnative\\cmd.exe",
    		"${env:windir}\\System32\\cmd.exe"
    	],
    ...
}

え?配列?って思うかもしれませんが、設定の説明には(setting.json上でpathの上にポインターを置くとホバーするアレ)

A single path to a shell executable or an array of paths that will be used as fallbacks when one fails.

と書いてあります。つまりpathは通常文字列ですが、上記のように配列で指定も可能で、その場合上から順番に試して起動に成功したものでターミナルを起動するようです。

Git Bash の設定について

(2023/12/01追記)

プロファイルが"Git Bash"という名前の場合、sourceしか参照しないという挙動があるそうです。 どうやら既定のプロファイルと見做され、pathプロパティを無視するようです。
"sourse": "Git Bash"で正常に動作するGit Bashのインストール位置は、12/01現在は下記のようです:

// https://github.com/microsoft/vscode/blob/e55863c5c1fc4515bd99e9cd4fb415788000a8b1/src/vs/platform/terminal/node/terminalProfiles.ts#L210C4-L216C94
[
    `${process.env['ProgramW6432']}\\Git\\bin\\bash.exe`,
	`${process.env['ProgramW6432']}\\Git\\usr\\bin\\bash.exe`,
	`${process.env['ProgramFiles']}\\Git\\bin\\bash.exe`,
	`${process.env['ProgramFiles']}\\Git\\usr\\bin\\bash.exe`,
	`${process.env['LocalAppData']}\\Programs\\Git\\bin\\bash.exe`,
	`${process.env['UserProfile']}\\scoop\\apps\\git-with-openssh\\current\\bin\\bash.exe`,
	`${process.env['AllUsersProfile']}\\scoop\\apps\\git-with-openssh\\current\\bin\\bash.exe`
 ]

Gitを上記の場所にインストールしていない場合は下記の手順が必要になります。

  1. プロファイルの名前を Git Bash 以外にする。例: GitBashなど
  2. "path"プロパティにbashのパスを書く

@Akihiro_Nakayama さん、情報提供ありがとうございました。

args

argsでは起動オプションを設定することができます。envについてでも使える特殊変数として、Variables Referenceで紹介されています。#Tips参照。

とはいえこの設定、コマンドプロンプトとかならともかく、.bashrcとかを設定できるbashやprofile.ps1を設定できるpowershellなどではあまり使わない気もしますよね。でも私が個人的に愛用しているPipenvの仮想環境を自動的にactivateするとかに使えて便利です。powershellでは-Commandというオプション引数で、起動するときに実行するコマンドを渡すことができます。なので仮想環境に入るpipenv shellを渡すと仮想環境に入った状態でシェルを起動してくれます。

settings.json
    ...
		"pipenv": {
			"source": "PowerShell",
			"args": [
				"-Command",
				"pipenv",
				"shell"
			],
			"overrideName": true
		},
    ...

↓ 仮想環境に入って起動してくれる。

1646273542243.png

overrideNameについて

公式によると

overrideName: A boolean indicating whether or not to replace the dynamic terminal title that detects what program is running with the static profile name.

つまり: trueじゃないと、ターミナルの一覧(tabs)にプロファイル名が反映されない。
falseの場合表示がcmdとかpowershellとか、使っているシェルの名前になるので、何か特別な設定をしているプロファイルなどは特に trueにしておく方が良いでしょう。恐らくデフォルト値はfalseなので。

iconについて

選択できるiconはterminalっぽいものに限れば以下のようです。
terminal-icons.jpg
その他、コマンドパレットからterminal: change icon...を選択することで、多数のアイコンから選択できるようです。addとかはあくまでアイコンです。画像追加ではないです。
icons.jpg
ちなみにcodiconに一覧表があります。使いたいアイコンをクリックするとIDがコピーされますので、それを"icon": "vm"みたいに設定すればよいです。
独自のアイコンは使えたりするのか・・・調査を進めていきたいです。

colorについて

アイコンの色を設定できるようです。文字の色とかではないっぽいです。
公式では

color: A theme color ID to style the icon

と書いてあるのですが、具体的な一覧のリンクとかは見当たらず。
実際にsetting.jsonを開いて設定してみると、2022/03/03現在では"terminal.ansiBlack", "terminal.ansiRed", "terminal.ansiGreen", "terminal.ansiYellow", "terminal.ansiBlue", "terminal.ansiMagenta", "terminal.ansiCyan", "terminal.ansiWhite"のいずれかが選べるようです。

ということで選択可能なcolorをすべて表示させてみました。colorだけ変えたprofileを用意して...

settings.json
{
    "terminal.integrated.profiles.windows": {
        "default-PowerShell": {
            "source": "PowerShell",
            "icon": "terminal-powershell",
            "overrideName": true
        },
        "ansiBlack": {
            "source": "PowerShell",
            "icon": "terminal-powershell",
            "color": "terminal.ansiBlack",
            "overrideName": true
        },
        ...
    },
    ...
}

テーマによっても色の見え方が変わりそうなので、lightテーマとdarkテーマ, 個人的に愛用しているdraculaテーマ(Dracula Official)で確認してみました。
(左から)順にLight+ (default light), Dark+ (default dark), Dracula soft です。なおいずれも一番上のターミナルがcolorを設定していないprofileです。

image.pngimage.pngimage.png

color未設定の場合は"color": "terminal.ansiWhite"の場合と一緒ではないっぽいですね。
後、Blackはダークテーマだとほぼ見えないので、その辺を考慮して設定したいですね。

未指定の動作は、"color": nullという設定っぽいですが、明示的に"color": nullとすると「その値は選べんよ?」と怒られます。でも動作します。草。
(ソースコード見てないですけど)拡張機能ではsetting.jsonから設定値を取得する時、デフォルトの値を設定していないor存在しない設定値を取得するとnullを返す仕様なので、「colorの設定値がnullということは、設定がされていない→内部的にデフォルトの動作をする」といったロジックが組まれているのでしょう。

envについて

そのターミナル上に限り、環境変数を書き換えたり、消去・追加するようです。
例えば

settings.json
"env": {
    "JAVA_HOME": "C:\\Program Files\\Java\\jdk-13.0.1"
    "PATH": null
}

のように記述した場合、そのターミナルを開いてみると

C:\root>set JAVA_HOME
JAVA_HOME=C:\Program Files\Java\jdk-13.0.1

C:\root>set PATH
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

となり、JAVA_HOMEが上書き/PATHが全く通っていない環境ができます。
※nullはその環境変数の値を削除に相当します。

また全プロファイルに対して適用したい場合はterminal.integrated.env.windowsを用います。(Linuxはterminal.integrated.env.linux)
全く同じ記法で設定することができます。使用タイミングはVSCode使ってる時だけ反映させたい環境変数とか、様々なOSで何か共通の環境変数を持ちたい時でしょうか。

既定のターミナルを設定する

"terminal.integrated.defaultProfile.windows": "名前",
をsetting.jsonに追記します。ここで名前"terminal.integrated.profiles.windows"で作成・設定したprofileの名前のことです。
或いはctrl+shift+pでコマンドパレット→ terminal: select default profile
からご自身が最も使うであろうターミナルを選択してください。

これにて設定終了です。お疲れ様でした。

以下は私の設定例です。参考になれば幸いです。

settings.json
{
	"terminal.integrated.defaultProfile.windows": "PowerShell",
	"terminal.integrated.profiles.windows": {
		"PowerShell": {
			"path": "pwsh",
			"icon": "terminal-powershell",
			"color": "terminal.ansiCyan"
		},
        // Pipenvの仮想環境に入ってターミナルを起動
		"pipenv": {
			"path": "pwsh",
			"args": [
				"-Command",
				"pipenv",
				"shell"
			],
			"icon": "vm",
			"overrideName": true,
			"color": "terminal.ansiGreen"
		},
		"pipenv in project": {
			// .venvをプロジェクト内に作成する
			"path": "pwsh",
			"args": [
				"-Command",
				"pipenv",
				"shell"
			],
			"icon": "vm",
			"overrideName": true,
			"color": "terminal.ansiGreen",
			"env": {
				"PIPENV_VENV_IN_PROJECT": "true"
			}
		},
		// Git Bash無効
		"Git Bash": null
	},
	"terminal.integrated.defaultProfile.linux": "bash",
	"terminal.integrated.profiles.linux": {
		"bash": {
			"path": "bash",
			"icon": "terminal-bash"
		},
		"Pipenv": {
			"path": "bash",
			"icon": "terminal-bash",
			"args": [
				"-c",
				"pipenv shell"
			]
		},
		"Pipenv in project": {
			"path": "bash",
			"args": [
				"-c",
				"pipenv shell"
			],
			"icon": "vm",
			"overrideName": true,
			"color": "terminal.ansiGreen",
			"env": {
				"PIPENV_VENV_IN_PROJECT": "true"
			}
		}
	},
}

Tips

既定のプロファイルを非表示にする

"Git Bash"などの、初めから定義されているプロファイルを非表示にするには、nullを設定すれば良いみたいです。

settings.json
{
  "terminal.integrated.profiles.windows": {
    "Git Bash": null
  }
}

resolving variables

公式では

Tip: Path, args, and env all support resolving variables

という記述があります。適当に解釈すると「Path, args, envといったパス関係の設定の中では、resolving variablesを使えるよ。」という記述です。ここでresolving variablesとは何ぞやというと、${hoge}といった形で表される、特殊変数たちのことです。詳細はVariables Referenceで説明されています。最も基本的な特殊変数は以下の表(公式にも載っている)で、現在のディレクトリが/home/your-username/your-projectの時の例です。

変数
${workspaceFolder} /home/your-username/your-project
${workspaceFolderBasename} your-project
${file} /home/your-username/your-project/folder/file.ext
${fileWorkspaceFolder} /home/your-username/your-project
${relativeFile} folder/file.ext
${relativeFileDirname} folder
${fileBasename} file.ext
${fileBasenameNoExtension} file
${fileDirname} /home/your-username/your-project/folder
${fileExtname} .ext
${lineNumber} line number of the cursor
${selectedText} text selected in your code editor
${execPath} location of Code.exe
${pathSeparator} / on macOS or linux, \ on Windows

他には、${env:APPDATA}などで環境変数も使用することができます。また${config:editor.fontSize}などの設定の変数も使えるようです。もっと詳しく知りたい人はVariables Referenceを読んでください。ユーザーの入力とかも扱えるっぽいことが書いてます。

デバッグの際のターミナルを設定する

By default, the task/debug features will use the default profile. To override that, use the terminal.integrated.automationShell. setting

デバッグする際には、デフォルトで設定したプロファイルを使用します。
しかし何らかの理由で特定のプロファイルに差し替えたい時はterminal.integrated.automationShell.windowsを使用します。
設定例が以下のように公式では紹介されていました。

settings.json
{
    "terminal.integrated.defaultProfile.osx": "fish",
    // Use a fully POSIX-compatible shell and avoid running a complex ~/.config/fish/config.fish
    // for tasks and debug
    "terminal.integrated.automationShell.osx": "/bin/sh"
}

sticky scroll

2023/11月アップデートで、sticky scrollがターミナルにも実装されました。

image of the sticky scroll function
(公式ドキュメントより)

「前打ったコマンドなんだっけ」ということがなくなります。嬉しいですね。
設定は簡単で、setting.jsonに追記するだけです:

settings.json
{
	"terminal.integrated.stickyScroll.enabled": true,
 }

将来的には既定でtrueになるようですが、現在は Experimental で提供されているため、falseが既定です。

参考文献等

公式ドキュメント

Git Bash関係

74
59
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
74
59