Windowsの純正のターミナルアプリが正式リリースされたので試してみました。
Windows Terminal
Windows TerminalはMicrosoft Storeから入手出来ます。
これまでもコマンドプロンプトやPowerShell専用のもの、 WSLのターミナルなどはありましたが、 Windows Terminalを使うとそれらを一つのターミナルから使える様になります。
また、タブ機能や画面を分割して使う機能などがあり 細かな設定も出来るようになっていてかなり充実したターミナルアプリになっていると感じました。
ドキュメントも結構頑張って作っている感じ。
OSSなのでソースコードはGitHubにあり開発に参加することも出来ます。
今回使っているのは バージョン1.0.1401.0です。
設定項目
Windows Terminalの設定は設定項目が書かれたJSONファイルを直接編集する形で 設定変更を行います。
ターミナル上のタブの右側にあるボタンを押すか、ターミナル上でCtrl-, を押すと設定用JSONファイルを開けます。
ただ、最初は.jsonをどのアプリで編集するか紐付けられてません。 推奨するアプリも設定されてないみたいで、 Microsoft Storeでアプリを探すが出てきますが、その他のアプリから メモ帳なりVimを選んで、常にそのアプリで開く様にチェックを入れて開きます。
開くと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 |
|
defaultProfile
に起動時に開くプロファイルのGUID、
profiles
にPowerShellやWSLの情報が入っています。
WSLはインストールすると自動的に追加されるようです。
ここに追加の設定を書いたり、プロファイルを加えたり変更したりすればOK。
有効な設定値などは以下を参照。
色も変更可能:
直接設定ファイルをいじれる様になってるのでかなり自由度が高く変更が可能です。
ただ、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。 これは好み。
launtMode
にmaximized
を設定すると起動時に最大化された状態で始める事もできます。
alwaysShowTabs, showTabasInTitlebar
タブが一つの場合でもタブを表示するかどうか、と タブをタイトルバーの中に表示するか、タイトルバーと分けるか、という設定。
デフォルトはそれぞれtrue
とtrue
。
デフォルト状態だとこんな感じ。
showTabsInTitlebar
をFalseにすると
こんな感じでタイトルバーが別に現れます。
タイトルバーは右クリックすると最大化、などのメニューが出てきますが、 タイトルに書かれるものはタブのものと一緒だし、 タイトルバーをダブルクリックして最大化、みたいなことは タブをタイトルバーに入れてもタブ以外の部分をダブルクリックすれば出来ます。
なので、もしタブを常に表示させている場合、タイトルバーを表示させてるメリットはあまりないので
showTabsInTitlebar
はfalse
の方が良いかと。
一方で、alwaysShowTabs
をfalse
にしてshowTabsInTitlebar
もfalse
にすると、
タブが一つだけの場合、タブがなくなりタイトルバーだけになります。
この場合、わずかにタイトルバー無しでタブだけの表示の場合よりも上側の 部分が短くなります。
ただし、タブが2つ以上になるとタイトルバーに加えてタブのバーが別に現れます。
現状、タブを使うつもりはないので、false
、false
にしてあります。
この状態にすると設定を開くボタンが消えてしまうので、Ctrl-, で開ける、ということを忘れずに。
ただ、タイトルバーが白いので、なんとなく黒に統一したいと思ったらtrue
、true
のデフォルト表示のが良いかも、とは迷い中。
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"
},
な感じにstartingDirectory
とscrollbarState
を加えました。
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ディレクトリからスタートする、という形にしています。
以前はstartingDirectory
にwsl$
の様なWSLのパスを設定する方法がなかったので
こちらが使われてましたが、
現在はwsl$
を使ってstartingDirectory
での設定が可能になっています。
ただ、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.com
にssh
した状態で開始出来る様になります。
こういった自作のプロファイルを作る場合、メニューから選択するだけならguid
は要りませんが、
デフォルトに設定したい場合には必要です。
GUIDは桁数とかさえあってれば何でも良いのですが、 Generate GUIDs online とかで適当なものを作ってくれるので作って設定しておきます。
commandline
でssh
コマンドを指定しますが、このssh
は
C:\Users<user>.sshがsshの設定ディレクトリになります。
configはC:\Users<user>.ssh\config。
また、このコマンドの中で~
を使ったディレクトリ指定は(HOMEは)*C:\Users<user>*になります。
なので C:\Users<user>.ssh\id_rsaみたいな鍵を使いたければ上記の様な指定をすればOK。
Cywginとかを加えることも出来ます。
terminal/ThirdPartyToolProfiles.md at master · microsoft/terminal
これで新しいプロファイルが加わります。
ショートカットを作って特定のプロファイルを直接起動
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
と言ったものを作っているようです。
多分これは将来的に他のターミナルの様に点滅で下が見える様なものが出来ると思います。
ということなのですが、今使ってみた所ではそもそもcursorShape
に何を設定しても
状態が変わりません。
それどころか、Vimを開いてもNormal Modeでもブロック表示になりません。
変更できない、といったバグ報告見たいのは見かけないので、やっぱり何か手元の設定がおかしい…? (settings.jsonは元に戻してcursorShape
だけ加えてもやっぱり出来ないのですが。)
日本語入力中が汚くなる
すでに文字列がある部分に日本語を挿入しようとすると すでにある文字列と重なって汚い表示んになってしまいます。
決定すればちゃんと挿入されて大丈夫なんですが、入力中が 非常に見づらいです。
他のターミナルではどうなのか、というと、
こんな感じで背景、文字の色を反転させて下の文字が見えないような状態にして 入力が行われます。
これが結構日本語を使う上では辛い。
Windows Terminal以外のターミナル
Windows用のターミナルは結構いろいろなものがあります。
What’s the difference between a console, a terminal, and a shell? - Scott Hanselman
WSLをインストールするとデフォルトで使える様になるものや Cygwin時代から使われているmintty、それをWSL用にしたものなど。
また、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で開発も活発っぽいので、 フィードバックしたりして使いやすいものになって行ってくれれば、とは思います。