rcmdnk's blog

20200531_profiles_200_200

Windowsの純正のターミナルアプリが正式リリースされたので試してみました。

Windows Terminal

Windows TerminalはMicrosoft Storeから入手出来ます。

Windows Terminal を入手 - Microsoft Store ja-JP

これまでもコマンドプロンプトやPowerShell専用のもの、 WSLのターミナルなどはありましたが、 Windows Terminalを使うとそれらを一つのターミナルから使える様になります。

また、タブ機能や画面を分割して使う機能などがあり 細かな設定も出来るようになっていてかなり充実したターミナルアプリになっていると感じました。

ドキュメントも結構頑張って作っている感じ。

Windows ターミナルの概要 Microsoft Docs

OSSなのでソースコードはGitHubにあり開発に参加することも出来ます。

今回使っているのは バージョン1.0.1401.0です。

設定項目

Windows Terminalの設定は設定項目が書かれたJSONファイルを直接編集する形で 設定変更を行います。

ターミナル上のタブの右側にあるボタンを押すか、ターミナル上でCtrl-, を押すと設定用JSONファイルを開けます。

ただ、最初は.jsonをどのアプリで編集するか紐付けられてません。 推奨するアプリも設定されてないみたいで、 Microsoft Storeでアプリを探すが出てきますが、その他のアプリから メモ帳なりVimを選んで、常にそのアプリで開く様にチェックを入れて開きます。

開くとJSONファイルですが、 以下の様な感じになっています。

settings.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
    "$schema": "https://aka.ms/terminal-profiles-schema",

    "defaultProfile": "{XXXXXXXX-XXXXXXXXX-XXXX-XXXXXXXXXXXX}",

    "profiles":
    [
        {
            // Make changes here to the powershell.exe profile
            "guid": "{XXXXXXXX-XXXXXXXXX-XXXX-XXXXXXXXXXXX}",
            "name": "Windows PowerShell",
            "commandline": "powershell.exe",
            "hidden": false
        },
        {
            // Make changes here to the cmd.exe profile
            "guid": "{XXXXXXXX-XXXXXXXXX-XXXX-XXXXXXXXXXXX}",
            "name": "cmd",
            "commandline": "cmd.exe",
            "hidden": false
        },
        {
            "guid": "{XXXXXXXX-XXXXXXXXX-XXXX-XXXXXXXXXXXX}",
            "hidden": false,
            "name": "Ubuntu",
            "source": "Windows.Terminal.Wsl"
        },
        {
            "guid": "{XXXXXXXX-XXXXXXXXX-XXXX-XXXXXXXXXXXX}",
            "hidden": false,
            "name": "Azure Cloud Shell",
            "source": "Windows.Terminal.Azure"
        }
    ],

    // Add custom color schemes to this array
    "schemes": [],

    // Add any keybinding overrides to this array.
    // To unbind a default keybinding, set the command to "unbound"
    "keybindings": []
}

defaultProfileに起動時に開くプロファイルのGUID、 profilesにPowerShellやWSLの情報が入っています。

WSLはインストールすると自動的に追加されるようです。

ここに追加の設定を書いたり、プロファイルを加えたり変更したりすればOK。

有効な設定値などは以下を参照。

Windows ターミナルのグローバル設定 Microsoft Docs

terminal/SettingsSchema.md at master · microsoft/terminal

色も変更可能:

Windows ターミナルの配色 Microsoft Docs

直接設定ファイルをいじれる様になってるのでかなり自由度が高く変更が可能です。

ただ、GUIな設定画面がないのでどの様な設定が出来るか、フォントとかは何が選べるのか、 とかは上を見ながら、とかしないといけないのでちょっと面倒ではあります。

普段からLinuxとか使ってるとこういった設定は慣れてる人もいるかも知れませんが、 ちょっとハードルが高いと感じる人もいるかも知れません。

ファイルは

**C:\Users\<user>\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json**

といったところにあり、WindowsTerminal_8wekyb3d8bbweという部分にランダムな?ものがついたフォルダを作っています。

この辺よく理解してませんが、WSLとかが加わってダイナミックにプロファイルを作成する際に新たに作る必要があるためにこの様なフォルダを作っているのでしょうか?

このファイルを別途直接管理しようと思うとこの様なランダムな文字列が入ってくるのでちょっと面倒そうです。(wtコマンドとかで調べることが出来るのかもしれませんが。)

JSONファイルへの設定変更ですが、ファイルを保存した瞬間に ターミナル上へも反映されます。

文法が間違ってたりするとエラー表示が出て、変更を読み込まないまま続行するといった注意が出たりします。

ただ、タブに関する部分とか、再度ターミナルを立ち上げ直さないと有効にならないものも一部あります。

追加した設定

defaultprofileをWSLに

defaultPrifleのGUIDを"name": "Ubuntu"のプロファイルのGUIDにして 起動時にWSLを立ち上げる様にしました。

その他のGlobal設定

ターミナル全体で有効になる設定として、 defaultProfileの下に以下を加えました。

"initialCols": 90,
"initialRows": 20,
"alwaysShowTabs": false,
"showTabsInTitlebar": false,
"copyOnSelect": true,
"copyFormatting": false,
"confirmCloseAllTabs": false,

initialCols, initialRows

ターミナルの横、縦の長さ(文字数)。デフォルトはそれぞれ120、30。 これは好み。

launtModemaximizedを設定すると起動時に最大化された状態で始める事もできます。

alwaysShowTabs, showTabasInTitlebar

タブが一つの場合でもタブを表示するかどうか、と タブをタイトルバーの中に表示するか、タイトルバーと分けるか、という設定。

デフォルトはそれぞれtruetrue

デフォルト状態だとこんな感じ。

20200531_notitle.png

showTabsInTitlebarをFalseにすると

20200531_titletab.png

こんな感じでタイトルバーが別に現れます。

タイトルバーは右クリックすると最大化、などのメニューが出てきますが、 タイトルに書かれるものはタブのものと一緒だし、 タイトルバーをダブルクリックして最大化、みたいなことは タブをタイトルバーに入れてもタブ以外の部分をダブルクリックすれば出来ます。

なので、もしタブを常に表示させている場合、タイトルバーを表示させてるメリットはあまりないので showTabsInTitlebarfalseの方が良いかと。

一方で、alwaysShowTabsfalseにしてshowTabsInTitlebarfalseにすると、 タブが一つだけの場合、タブがなくなりタイトルバーだけになります。

20200531_notab.png

この場合、わずかにタイトルバー無しでタブだけの表示の場合よりも上側の 部分が短くなります。

ただし、タブが2つ以上になるとタイトルバーに加えてタブのバーが別に現れます。

現状、タブを使うつもりはないので、falsefalseにしてあります。

この状態にすると設定を開くボタンが消えてしまうので、Ctrl-, で開ける、ということを忘れずに。

ただ、タイトルバーが白いので、なんとなく黒に統一したいと思ったらtruetrue のデフォルト表示のが良いかも、とは迷い中。

copyOnSelect

Linuxとかのターミナルの様に、ターミナル上でマウスで文字列を選択した段階で コピーをするかどうか。

falseの場合には選択してから右クリックするか Ctrl-Shift-Cでコピーします。

通常の右クリックからコピーというメニューを選ぶ、というものでもないため、 falseの場合でも選択してから右クリックでコピー、でも十分かもしれません。 (PowerShellとかと同じ仕様)

CLCLなどクリップボード履歴を使っていると、ターミナル上でちょっと文字を選択しただけで どんどん履歴に入っていってしまうのは邪魔くさいので要検討。 (ただ、Macとかでは選択してそのままコピー、という感覚で使うので同じにしたい。)

とりあえずデフォルトがfalseなので有効にするためにtrueにしておきます。

copyFormatting

コピー時に色やフォーマットも記憶するか、プレーンテキストとして記憶するか、の設定。

デフォルトはtrueになってます。

たとえばEvernoteとかにコピーしようとするとコードとか、 色つけのママ出来て嬉しい、とかあるかもしれませんが、 ただ、そういった場合でも大概はプレーンテキストのままのが便利なことが多いです。

というか、フォーマットをコピーして嬉しいことってのが殆どないのに、 MacでもWindowsでもそのへんコピーするのがデフォルトになってるのが面倒。

Ctrl-Shift-Vとかで貼り付け時にフォーマットを削除して 貼り付け、ということが出来るので、大概これを押す羽目に。

ということで、falseにしています。

加えて、日本語を使ってる人は絶対にfalseにしたほうが良いです。

trueのままだと日本語をコピーすると化けます。 Ctrl-Shift-Vでフォーマットを削除しても 化けたものは化けたまま。

なのでフォーマットどうこう関係なしにもfalseにするしかない状況です。

confirmCloseAllTabs

タブを複数開いているとき、閉じるボタンでターミナルを閉じようとした時に 閉じてよいかどうか尋ねるかどうか。

ブラウザとかでもあるやつですが、ターミナルだと閉じるときはCtrl-D とかでそれを閉じるし、 全部消したい時に閉じるボタンを押す、という感じなので余計なお世話。

デフォルトtrueなのでfalseにします。

WSL(Ubuntu)の設定変更

profilesの中のUbuntuの項目に

{
    "guid": "{XXXXXXXX-XXXXXXXXX-XXXX-XXXXXXXXXXXX}",
    "hidden": false,
    "name": "Ubuntu",
    "source": "Windows.Terminal.Wsl",
    "startingDirectory": "//wsl$/Ubuntu/home/<ubuntu_user>",
    "scrollbarState": "hidden"
},

な感じにstartingDirectoryscrollbarStateを加えました。

startingDirectory

Windows TerminalではstartingDirectoryという項目がprofilesの設定項目として他にあり、 これがデフォルトで%USERPROFILE%になっていて、これはWindowsのユーザーディレクトリです。 (\C:\Users<user>、WSL的には**/mnt/c/Users/**)

これをUbuntuのHOMEになるようにするには上記の様な//wsl$/<name>/home/<user> という値を与えます。

もしくは

    "commandline": "wsl.exe ~ -d Ubuntu",

という設定をstartingDirectoryの代わりに設定しても同じことが出来ます。 この項目は実際にWSLを起動するコマンド自体を変更するもので、 最初に~を渡してUbuntuのHOMEディレクトリからスタートする、という形にしています。

以前はstartingDirectorywsl$の様なWSLのパスを設定する方法がなかったので こちらが使われてましたが、 現在はwsl$を使ってstartingDirectoryでの設定が可能になっています。

Windows ターミナルのトラブルシューティング Microsoft Docs

ただ、commandlineの方がユーザー名を含まないで済むので使い回しはしやすいという点はあります。

ここではとりあえずDocumentに沿ってstartingDirectoryを設定しています。

scrollbarState

スクロールバーを見せるか見せないか。デフォルトでは見せる様になっていますが、 ターミナル上ではGNU screenを使って作業したりするのでスクロールとかは必要ないので 隠す設定。

ただ、Windows Terminalのスクロールバーは通常のスクロールバーと違ってものすごく細いので、 あってもウィンドウ幅とかにはあまり影響がないので無理に隠す必要はないかもしれません。

プロファイルの追加

Windows Terminalの面白い機能として、プロファイルにsshなものを加えられます。

どういうものかというと

{
    "guid": "{0151badc-f0d2-41ab-b017-56d14afd71dc}",
    "hidden": false,
    "name": "ssh_example.com",
    "commandline": "ssh -i ~/.ssh/id_rsa [email protected]"
}

というものを加えると、example.comsshした状態で開始出来る様になります。

こういった自作のプロファイルを作る場合、メニューから選択するだけならguidは要りませんが、 デフォルトに設定したい場合には必要です。

GUIDは桁数とかさえあってれば何でも良いのですが、 Generate GUIDs online とかで適当なものを作ってくれるので作って設定しておきます。

commandlinesshコマンドを指定しますが、このsshC:\Users<user>.sshがsshの設定ディレクトリになります。 configC:\Users<user>.ssh\config

また、このコマンドの中で~を使ったディレクトリ指定は(HOMEは)*C:\Users<user>*になります。

なので C:\Users<user>.ssh\id_rsaみたいな鍵を使いたければ上記の様な指定をすればOK。

Cywginとかを加えることも出来ます。

terminal/ThirdPartyToolProfiles.md at master · microsoft/terminal

これで新しいプロファイルが加わります。

20200531_profiles.png

ショートカットを作って特定のプロファイルを直接起動

defaultProfileは一つしか指定できないので、それ以外のプロファイルは 一度Widnows Terminalを立ち上げてから選択して立ち上げる必要があります。

ただ、上記の様なsshの設定でいくつかのサーバーに直接入りたいとき、 そのターミナルを直接立ち上げたい、という場合もあると思います。

そういった場合にはショートカットを作ってリンク先をいじってそこから直接起動する、 という方法が出来ます。

Windows Terminalの実行ファイルは

C:\Users\<user>\AppData\Local\Microsoft\WindowsApps\wt.exe

にあります。(この手のMicrosoft Storeからインストールしたものはスタートメニューアイコンを右クリックしてもその他ファイルの場所を開くがないので最初どこにあるかわからなかった。。。)

このショートカットを作って プロファイルを開き、リンク先…wt.exeとなっている部分に、 -p <profile name>を追加します。

これでOKを押して、このショートカットをダブルクリックとかして立ち上げると 指定したプロファイルが立ち上がるはずです。

このショートカットをデスクトップに置いたり、スタートにピン留めとかしておけば 簡単に好きなプロファイルを直接開ける様になります。

気になる事

タブを別ウィンドウに分けられない

ブラウザとかでタブ機能があるものだと、タブをドラッグして外に持っていくと新しいウィンドウが出来ます。

また、別のウィンドウの方に持っていくとタブを移動することが出来ます。

ただ、Windows Terminalでは現状タブはウィンドウのなかだけでしか移動できず、 新しいウィンドウを作ることも出来ません。

ショートカットとかでも新しいタブを作るものはありますが、新しいウィンドウを作る、というものはありません。

別ウィンドウを作りたい場合、無理やり、

$ cmd.exe /c wt.exe &

とかして新しいWindows Terminalを立ち上げる、という事は出来ます。

これだと新しいウィンドウは古いウィンドウのターミナルの子プロセスになるので 古いウィンドウを消すと新しいほうも落ちてしまいそうな感じがしますが、 やってみたところ古い方を消しても新しい方は続けて使えました。

なのでこれで一応新しいウィンドウ的な事はできますが、タブの移動とかはやっぱり出来ません。

まあ、この辺は自分ではあまり使わない部分なのでそれ程問題ないのですが。

Explorerから現在のフォルダをターミナルで開く?

Add “open Windows terminal here” into right-click context menu · Issue #1060 · microsoft/terminal

右クリックメニューとかでExplorer上から開いてるフォルダをターミナルで開く、 ということも頑張れば出来るらしい。

ただ、現状やるのはちょっと面倒。

一方で、

Not currently supported "out of the box" (See issue #1060). However, you can open Windows Terminal in current directory by typing wt -d . in the Explorer address bar.

というのがあるんですが、Explorerのアドレスバーにwt -d .と打ってみてもうまく行きませんでした。

バージョンが違うのか何か間違っているのか。。。

cursorShapeが設定できない

グローバル設定でcursorShapeという項目があり、デフォルトがbarで細い先が 文字の間に表示される状態です。

VimのInsert Mode的な状態。

Macとかのターミナルとかだと挿入位置にブロック表示になるので (VimのNormal Mode的な状態) これと同じ様にしたければfilledBoxにする、かemptyBoxが近いもの。

ただ、Macとかではこれらが点滅し、さらに下の文字が点滅に応じて反転して 常に見える様な状態になります。

現状Windows Terminalのカーソルは点滅もしないので文字列の途中に行くと、下の文字がカーソルに隠れて見てなくなってしまう様な状態。

なのでemptyBoxと言ったものを作っているようです。

Feature Request: Show character under cursor when cursorShape is set to filledBox · Issue #1203 · microsoft/terminal

多分これは将来的に他のターミナルの様に点滅で下が見える様なものが出来ると思います。

ということなのですが、今使ってみた所ではそもそもcursorShapeに何を設定しても 状態が変わりません。

それどころか、Vimを開いてもNormal Modeでもブロック表示になりません。

変更できない、といったバグ報告見たいのは見かけないので、やっぱり何か手元の設定がおかしい…? (settings.jsonは元に戻してcursorShapeだけ加えてもやっぱり出来ないのですが。)

日本語入力中が汚くなる

すでに文字列がある部分に日本語を挿入しようとすると すでにある文字列と重なって汚い表示んになってしまいます。

20200531_jpwt.jpg

決定すればちゃんと挿入されて大丈夫なんですが、入力中が 非常に見づらいです。

他のターミナルではどうなのか、というと、

20200531_jpwsltty.jpg

こんな感じで背景、文字の色を反転させて下の文字が見えないような状態にして 入力が行われます。

これが結構日本語を使う上では辛い。

Windows Terminal以外のターミナル

Windows用のターミナルは結構いろいろなものがあります。

What’s the difference between a console, a terminal, and a shell? - Scott Hanselman

Windows10 WSLのターミナル事情 - kamijin-fanta

Best terminal for neovim and WSL on Windows 10 : neovim

WSLをインストールするとデフォルトで使える様になるものや Cygwin時代から使われているmintty、それをWSL用にしたものなど。

WSLのコンソールを便利で高機能な「wsltty」に置き換える:Tech TIPS - @IT

また、Electronで作ったマルチプラットフォームなHyperも使えます。

HyperとかならMacとかと共通で使えます。

今回関係ないですが、Mac用のものもいろいろなものがあります。

この中でWSLのデフォルトのターミナルを最初使ってましたが、 これだとVimのモード変換時に変なずれが起こる様になってました。

今年のはじめくらいに色々試してた時にそういったメモが残ってるんですが、 今やってみるとそんな問題はなくなっている様でした。

ただ、一つ問題として、フォントがデフォルトでMSゴシックなんですが、 これをコード用のCascadia Monoとかにしてみると、 日本語もこのフォントで表示しようとするのか化けてしまいます。

上記のVimの問題がHyperとかでも起こっていたので、 使っていたのはwslttyでした。

wslttyでは最初からVimのずれな問題も起きず、フォントを英字用フォントにしても 日本語はちゃんと日本語フォントで表示してくれます。

一つ気になるのがウィンドウをリサイズした時に、それに引っ張られてフォントのサイズが変わってしまうこと。

毎回Ctrl-0を押して元のフォントサイズに戻したりしています。

ただ他に比べると問題が一番少ないので利用中。

Windows Terminalに関してはこのVimな問題も無く、 リサイズしてもフォントの大きさは変わらず、良いな、とは思ったのですが。

まとめ

Windows Terminalがバージョン1.0で正式リリースされたということですが、 画面分割などかなり頑張ってるな、という印象。

ただ、個人的にその辺はMacなどのターミナルでもそうなんですが一切使っておらず必要のない部分。 タブも同様不要な機能。

単に安定して、まともに日本語が扱えるターミナル、というのが求めるものなのですが、 上にも書いたとおりちょっとまだ日本語とかは難しい点がありそうです。

カーソル表示もちょっと気になる所。

その辺の気になる点があり、結局今の所wslttyを使い続けようかな、と思っています。

ただ、Windows Terminalはsshを直接するプロファイルが作れたり、色々と面白い点もありますし、 OSSで開発も活発っぽいので、 フィードバックしたりして使いやすいものになって行ってくれれば、とは思います。

Sponsored Links
Sponsored Links

« macOS Catalina 10.15.5 (19F96)にアップデート WSL2は場合によってはWSL1の10倍も速い!? »