質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

2回答

8695閲覧

VSCode ターミナル表示でエスケープシーケンスがそのまま表示されてしまう

namnium1125

総合スコア2043

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

1クリップ

投稿2019/02/06 07:51

VSCodeの統合ターミナルをMinGWにして使用しているのですが、エスケープシーケンスがそのまま表示されてしまいます。

例 1 scalaのREPL

bash

1$ scala 2Welcome to Scala 2.12.8 (Java HotSpot(TM) Client VM, Java 1.8.0_171). 3Type in expressions for evaluation. Or try :help. 4 5scala> println("helll?[?[Ko") 6hello 7 8scala> :q

上記は途中でバックスペースを実行した場合です。

例 2 以下のようなプログラムの実行結果

c

1#include <stdio.h> 2 3int main(void) { 4 printf("\x1b[36mhello, color!\x1b[0m\n"); 5 return 0; 6}

というファイルをコンパイルして実行すると、直接MinGW64を起動して実行した場合は水色になるのですが、VSCodeだとエスケープと認識されないまま表示されてしまいます。

bash

1$ ./a 2?[36mhello, color!?[0m

それらしいVSCodeのissueページを見つけたのですが結局解決方法がわからないので質問いたしました。

Ansi escape sequences are broken in Terminal. · Issue #45516 · Microsoft/vscode

もし何かご存知の方がおりましたら、回答よろしくお願いします。m(_ _)m

ターミナル関連のユーザー設定

{ // ... "terminal.integrated.shell.windows": "C:\msys64\usr\bin\bash.exe", "terminal.integrated.shellArgs.windows": [ "--login", "-i" ], // ... }

バージョンなど

  • VSCode : Code 1.30.2 (61122f88f0bf01e2ac16bdb9e1bc4571755f5bd8, 2019-01-07T22:54:13.295Z)
  • MinGW : バージョンの確認方法がよくわからないのですが、とりあえずx86_64-w64-mingw32という文字列を確認しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

VSCodeだけの問題じゃなくてWindows自体がまともにANSIエスケープシーケンスに対応していないらしいです。
MinGWで表示出来るというのはターミナルがMinTTYだからじゃないですかね?

以下の記事を参考にすると良いかも?

Windows向けのプログラムでANSIエスケープシーケンスを使うには

c

1#include <stdio.h> 2#include <io.h> 3#include <windows.h> 4 5int main(void) 6{ 7 HANDLE handle = (HANDLE)_get_osfhandle(_fileno(stdout)); 8 DWORD mode = 0; 9 GetConsoleMode(handle, &mode); 10 SetConsoleMode(handle, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING); 11 printf("\x1b[36mhello, color!\x1b[0m\n"); 12 return 0; 13}

VSCode


Windows版のVSCodeのターミナル関係の問題はWinptyに依存しているためで、
これを新しいもの(ConPTY)に変える動きがあるようですね。
仮にこの問題も修正されるとしてもWindows10の次期大型アップデート以降になりそうですが…。
(現行のWindows10のビルド番号は17763でConPTYを有効にするのに必要なのは18309以降になりそうなため)

Windows terminal issues caused by winpty #45693

次のInsidersビルドではConPTYのサポートが開始されています。これはWIndows 10ビルド番号17692+の端末に新しいバックエンドを使用します。Microsoftの公式pty APIを採用しているのでWindowsの端末の多くのバグが修正される予定です。以前のバージョンでは、winptyがまだ使用されています(それらがそのプロジェクトで修正されていない限り)多くのバグがまだ残っています。

更新:17692で安定していなかったため、Windowsビルド番号18309+がConPTYを有効にするために必要になりました。

投稿2019/02/06 09:19

編集2019/02/06 09:46
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namnium1125

2019/02/06 10:12

回答ありがとうございます。m(_ _)m なるほど、、色を付ける場合にはプログラム側で工夫するしかないんですね... どちらかというと色を付けたいわけではなくscalaのREPL等でANSIエスケープ文字が出てこないようにしたかったのですが、難しいみたいですね...
guest

0

ANSIエスケープシーケンスがない環境で無理やり実行する必要がないことに気が付き、

例に挙げたscalaのREPLはエイリアスを設定してpowershellに切り替えて実行するという手法で解決したので、

一応自己解決法として挙げておきます。

(以下powershellでpowershellが立ち上がる前提とする。)

~/.bash_aliases

bash

1alias scala_repl="powershell scala"

bash

1$ scala_repl 2Welcome to Scala 2.12.8 (Java HotSpot(TM) Client VM, Java 1.8.0_171). 3Type in expressions for evaluation. Or try :help. 4 5scala> println("hello, scala") 6hello, scala 7 8scala> :q 9 10$

VSCodeがそもそもANSIエスケープシーケンスに対応していないというのが解決の糸口になりました。

lunatea様、改めて回答ありがとうございました。m(_ _)m

投稿2019/02/06 10:58

編集2019/02/06 11:01
namnium1125

総合スコア2043

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namnium1125

2019/02/06 11:11

ただこの方法はScalaのREPLが(原理はよくわからないのですが、、それこそ内部でシェルを認識して切り替えている...?)PowershellでもMinGWでも実行できたからこそ取れた方法です...(^ ^; ソフトごとに使うシェルを変えるしかとりあえずなさそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問