Skip to content

Commit

Permalink
msys2: work around MSYS2 Bash bug of missing "CR"
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Feb 7, 2020
1 parent 880bb2c commit 71f3498
Show file tree
Hide file tree
Showing 7 changed files with 143 additions and 26 deletions.
16 changes: 8 additions & 8 deletions lib/core-syntax.sh
Expand Up @@ -466,7 +466,7 @@ function ble/syntax/print-status/nest.get-text {
if [[ $nparam == none ]]; then
nparam=
else
nparam=" nparam=${nparam//$_ble_term_fs/$'\e[7m^\\\e[m'}"
nparam=" nparam=${nparam//$_ble_term_FS/$'\e[7m^\\\e[m'}"
fi

nest=" nest=($nctx w=$nword n=$nnest t=$nchild:$nprev$nparam)"
Expand Down Expand Up @@ -520,7 +520,7 @@ function ble/syntax/print-status/stat.get-text {
if [[ $snparam == none ]]; then
snparam=
else
snparam=" nparam=${snparam//"$_ble_term_fs"/$'\e[7m^\\\e[m'}"
snparam=" nparam=${snparam//"$_ble_term_FS"/$'\e[7m^\\\e[m'}"
fi

local stat_lookahead=
Expand Down Expand Up @@ -2892,7 +2892,7 @@ function ble/syntax:bash/check-word-end/is-delimiter {
function ble/syntax:bash/check-here-document-from {
local spaces=$1
[[ $nparam && $spaces == *$'\n'* ]] || return 1
local rex="$_ble_term_fs@([RI][QH][^$_ble_term_fs]*)(.*$)" && [[ $nparam =~ $rex ]] || return 1
local rex="$_ble_term_FS@([RI][QH][^$_ble_term_FS]*)(.*$)" && [[ $nparam =~ $rex ]] || return 1

# ヒアドキュメントの開始
local rematch1=${BASH_REMATCH[1]}
Expand Down Expand Up @@ -3916,7 +3916,7 @@ function ble/syntax:bash/ctx-heredoc-word/initialize {
ble/util/sprintf _ble_syntax_bash_heredoc_EscHT '\\%03o' "$ret"
ble/util/s2c $'\n'
ble/util/sprintf _ble_syntax_bash_heredoc_EscLF '\\%03o' "$ret"
ble/util/s2c "$_ble_term_fs"
ble/util/s2c "$_ble_term_FS"
ble/util/sprintf _ble_syntax_bash_heredoc_EscFS '\\%03o' "$ret"
}
ble/syntax:bash/ctx-heredoc-word/initialize
Expand Down Expand Up @@ -3970,8 +3970,8 @@ function ble/syntax:bash/ctx-heredoc-word/remove-quotes {
## @var[out] escaped
function ble/syntax:bash/ctx-heredoc-word/escape-delimiter {
local ret=$1
if [[ $ret == *[\\\'$_ble_syntax_bash_IFS$_ble_term_fs]* ]]; then
local a b fs=$_ble_term_fs
if [[ $ret == *[\\\'$_ble_syntax_bash_IFS$_ble_term_FS]* ]]; then
local a b fs=$_ble_term_FS
a=\\ ; b="\\$a"; ret="${ret//"$a"/$b}"
a=\' ; b="\\$a"; ret="${ret//"$a"/$b}"
a=' ' ; b="$_ble_syntax_bash_heredoc_EscSP"; ret="${ret//"$a"/$b}"
Expand Down Expand Up @@ -4018,7 +4018,7 @@ function ble/syntax:bash/ctx-heredoc-word/check-word-end {
fi

local escaped; ble/syntax:bash/ctx-heredoc-word/escape-delimiter "$delimiter"
nparam=$nparam$_ble_term_fs@$I$Q$escaped
nparam=$nparam$_ble_term_FS@$I$Q$escaped
return 0
}
function ble/syntax:bash/ctx-heredoc-word {
Expand Down Expand Up @@ -4106,7 +4106,7 @@ function ble/syntax:bash/is-complete {

# (3) ヒアドキュメントの待ちがある時
local nparam=${stat[6]}; [[ $nparam == none ]] && nparam=
local rex="$_ble_term_fs@([RI][QH][^$_ble_term_fs]*)(.*$)"
local rex="$_ble_term_FS@([RI][QH][^$_ble_term_FS]*)(.*$)"
[[ $nparam =~ $rex ]] && return 1

# (4) 完結している文脈値の時以外
Expand Down
2 changes: 2 additions & 0 deletions lib/init-term.sh
@@ -1,5 +1,7 @@
#!/bin/bash

# 2020-02-07 #D12MSYS2 の CR 対策のため更新の必要あり

function ble/init:term/tput { return 1; }
if ble/bin/.freeze-utility-path tput; then
_ble_term_hasput=1
Expand Down
7 changes: 6 additions & 1 deletion memo/ChangeLog.md
Expand Up @@ -7,10 +7,13 @@

- complete: support `bleopt complete_auto_wordbreaks` (suggestion by dylankb) `#D1219` c294e31
- main: check `~/.config/blesh/init.sh` `#D1224` a82f961
- progcolor: support programmable highlighting `#D1218` 0770234 `#D1244` 9cb3583 `#D1245` 8e8a296 `#D1247` 154f638
- progcolor: support programmable highlighting `#D1218` 0770234 `#D1244` 9cb3583 `#D1245` 8e8a296 `#D1247` 154f638 `#D1269` fa0036c
- decode/kbd: support <kbd>U+XXXX</kbd>, <kbd>@ESC</kbd> and <kbd>@NUL</kbd> for keynames `#D1251` 441117c
- syntax: support `coproc` `#D1252` 7ff68d2
- vi/nmap: support readline widgets for <kbd>M-left</kbd>, <kbd>M-right</kbd>, <kbd>C-delete</kbd>, <kbd>#</kbd> and <kbd>&</kbd> `#D1258` 846e0be
- main: support MSYS (motivated by SUCHMOKUO's report) `#D1264` 0000000
- edit: support `\$` in `PS1` for MSYS2 `#D1265` 0000000
- msys2: work around MSYS2 Bash bug of missing <kbd>CR</kbd> `#D1270` 0000000

## Fix

Expand All @@ -29,6 +32,8 @@
- syntax: fix a bug that arguments of `eval` are not highlighted `#D1254` 5046d14
- term: support `TERM=minix` `#D1262` ae0b80f
- decode: fix error message `command=${[key]-}` for mouse input `#D1263` 0000000
- [ble-0.3] reload: fix a bug that the state is broken by `ble-reload` `#D1266` f2f30d1
- decode (`ble/builtin/bind`): remove comment from bind argument `#D1267` 0000000

## Changes
- highlight: highlight symlink directories as symlinks `#D1249` 25e8a72
Expand Down
14 changes: 7 additions & 7 deletions memo/D1241.array-SOH-DEL.sh
Expand Up @@ -16,17 +16,17 @@ ble/util/declare-print-definitions arr1 arr2 | cat -A
echo

echo '# Check arr1=(1 "$del" "$soh")'
_ble_term_del=
_ble_term_soh=
arr1=(1 "$_ble_term_del" "$_ble_term_soh")
_ble_term_DEL=
_ble_term_SOH=
arr1=(1 "$_ble_term_DEL" "$_ble_term_SOH")
ble/util/declare-print-definitions arr1 | cat -A
echo

echo '# Check arr1=(2 $del $soh)'
_ble_term_del=
_ble_term_soh=
arr1=(2 $_ble_term_del $_ble_term_soh)
arr2=(2 ''$_ble_term_del'' ''$_ble_term_soh'')
_ble_term_DEL=
_ble_term_SOH=
arr1=(2 $_ble_term_DEL $_ble_term_SOH)
arr2=(2 ''$_ble_term_DEL'' ''$_ble_term_SOH'')
ble/util/declare-print-definitions arr1 arr2 | cat -A
echo

Expand Down
99 changes: 99 additions & 0 deletions note.txt
Expand Up @@ -918,6 +918,19 @@ bash_tips
ToDo
-------------------------------------------------------------------------------

2020-02-06

* proghl の中で行った fix を ble-0.3 にも適用しなければならない。

* mintty で modifyOtherKeys を有効にしているので
quoted-insert で C-t 等の基本的なキーですら修飾されている。
つまり、制御文字を入力する事ができない。

然し、本当に modifyOtherKeys を入力したい場合や、
或いは、本当に端末が送ってくる内容を知りたい場合もある。
その場合には勝手にキー入力をいい感じに翻訳されると困る。
C-q と C-v で二種類あるのだから片方に別の物を割り当てるという手もある。

2020-02-02

* vi mode の時は read も vi mode になっているべきではないのか?
Expand Down Expand Up @@ -2655,6 +2668,92 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2020-02-07

* msys2: 端末の座標計算が時々おかしい。 [#D1270]
https://github.com/akinomyoga/ble.sh/issues/40#issuecomment-582941178

DA2R を見ると mintty 30000 の気がする。
実際に Options... を開いてみると mintty 3.1.0 is available
という感じの内容が表示される。

或いは何か msys の terminfo か tput が壊れているという事だろうか。
うーん。これについてもちゃんと調べる必要がある。
取り敢えず cygwin の term cache と比較してみる?

→ xterm-256color.term (Cygwin) と xterm.term (MSYS2) を比較してみたが、
着色と DECSCUSR しか違いは見られなかった。これらは配置には関係ない。
従って、やはり MSYS2 の mintty の振る舞いが変なのだという気がする。
もしそうだとしたらどの様にして変な振る舞いの原因を特定するのか。
そしてどの様にして workaround をすれば良いのか。
結構面倒な問題である。そもそも他の端末で異常は発生していない。
もし純粋に mintty のバグであるのであれば、これは ble.sh で対処しなくても良い。

これは CR が効いていないという事? 或いは stty の状態が変?
以下は stty -a の diff である。微妙な違いはあるが関係ない気がする。
実際に cygwin を msys 側に合わせてみたが問題は再現しない。
| --- stty -a (cygwin)^I2020-02-07 07:21:43.088892300 +0800
| +++ stty -a (msys)^I2020-02-07 07:21:47.549238700 +0800
| @@ -4,7 +4,7 @@
| werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
| -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
| -ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff
| --iuclc ixany imaxbel iutf8
| +-iuclc -ixany imaxbel -iutf8
| opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
| isig icanon iexten echo echoe echok -echonl -noflsh -tostop echoctl echoke
| -flusho
次に CR の振る舞いを確認する。特に問題なく動いている様に見える。
何と ${#_ble_term_cr} を出力してみたら中身が空である。。

分かった。_ble_term_cr='^M' を実行すると中身が空になる。
_ble_term_cr=$'\r' だと大丈夫。
その他の駄目なパターンはあるだろうか。
変数に入っている _ble_term_cr の場合は大丈夫の様だ。

うーん。これの対策方法は不明である。
a 一つの方法は _ble_term_cr で CR を使わないという方法。
別の制御機能 (hpa) 等を用いて _ble_term_cr を模倣する。
これの問題は本当に CR が欲しい所で _ble_term_cr を使っている箇所がないかという事。
確認してみた所そういう場所はないようである。
b もう一つの方法は _ble_term_cr=$'\r' という形式で記録するという事。
うーん。前者の方が楽だが、こちらの方が妥当の気がする。
declare-print-definitions を修正する?
修正したほうが良い気がする。もし MSYS2 でこれが一般に問題になるのであれば、
その他の場所で記録した CR も消滅するという事である。
という事であれば declare-print-definition 等で根本から修正する必要がある。

declare -p の振る舞いについて確認しておく。

bash-3.1 declare -- a="\$" bash-3.1 declare -a a='([0]="\$")' ")'h-3.1 declare -a a='([0]="
bash-3.2 declare -- a="\$" bash-3.2 declare -a a='([0]="\$")' ")'h-3.2 declare -a a='([0]="
bash-4.0 declare -- a="\$" bash-4.0 declare -a a='([0]="\$")' ")'h-4.0 declare -a a='([0]="
bash-4.2 declare -- a="\$" bash-4.2 declare -a a='([0]="\$")' ")'h-4.2 declare -a a='([0]="
bash-3.0 declare -- a="\$" bash-3.0 declare -a a='([0]="\$")' ")'h-3.0 declare -a a='([0]="
bash-4.1 declare -- a="\$" bash-4.1 declare -a a='([0]="\$")' ")'h-4.1 declare -a a='([0]="
bash-4.3 declare -- a="\$" bash-4.3 declare -a a='([0]="\$")' ")'h-4.3 declare -a a='([0]="
bash-4.4 declare -- a="\$" bash-4.4 declare -a a=([0]="\$") bash-4.4 declare -a a=([0]=$'\r')
bash-5.0 declare -- a="\$" bash-5.0 declare -a a=([0]="\$") bash-5.0 declare -a a=([0]=$'\r')

どうも declare -p は一貫して ".." に囲んで出力する様だ。
但し、Bash 4.4, 5.0 で制御文字が含まれている場合を除く。
Bash 4.4, 5.0 の場合にはそもそも ^M が含まれないという事だから、
^M が含まれる場合には "" の中にあると仮定して良いだろう。
従って ^M を $_ble_term_CR に変換する。
_ble_term_CR は本体の方で直接 $'\r' を代入すれば良いだろう。

固定文字列とそうでない物は大文字と小文字で区別する事にする。
* _ble_term_{soh,del,fs} も変更する?
* 然しそうすると _ble_term_nl も変更しなければならず面倒だ。
取り敢えず _ble_term_nl は出力に使っているから変更は保留。
他は特殊用途でしか使っていないのである。

取り敢えず動いている気がする。これで良い。
ble-0.3 に移植した。動いている。OK

* ble-decode/has-input [#D1269]
→これはマージのミスだった。修正した。

2020-02-06

* [勘違い] msys2: inputrc の `$if` が正しく解析されていない [#D1268]
Expand Down
9 changes: 6 additions & 3 deletions src/history.sh
Expand Up @@ -326,9 +326,12 @@ else
else
gsub(apos, apos "\\" apos apos, line);
# 対策 #D1239 bash-3.2 以前では ^A, ^? が ^A^A, ^A^? に化ける
gsub(/\001/, "'$apos'${_ble_term_soh}'$apos'", line);
gsub(/\177/, "'$apos'${_ble_term_del}'$apos'", line);
# 対策 #D1239: bash-3.2 以前では ^A, ^? が ^A^A, ^A^? に化ける
gsub(/\001/, "'$apos'${_ble_term_SOH}'$apos'", line);
gsub(/\177/, "'$apos'${_ble_term_DEL}'$apos'", line);
# 対策 #D1270: MSYS2 で ^M を代入すると消える
gsub(/\015/, "'$apos'${_ble_term_CR}'$apos'", line);
t = t != "" ? t "\n" line : line;
}
Expand Down
22 changes: 15 additions & 7 deletions src/util.sh
Expand Up @@ -1425,8 +1425,13 @@ function ble/util/print-quoted-command {
}
function ble/util/declare-print-definitions {
if [[ $# -gt 0 ]]; then
declare -p "$@" | ble/bin/awk -v _ble_bash="$_ble_bash" '
BEGIN { decl = ""; }
declare -p "$@" | ble/bin/awk -v _ble_bash="$_ble_bash" -v OSTYPE="$OSTYPE" '
BEGIN {
decl = "";
# 対策 #D1270: MSYS2 で ^M を代入すると消える
flag_escape_cr = OSTYPE == "msys";
}
function declflush(_, isArray) {
if (decl) {
isArray = (decl ~ /^declare +-[fFgilrtux]*[aA]/);
Expand All @@ -1437,9 +1442,11 @@ function ble/util/declare-print-definitions {
if (_ble_bash < 40000) {
# #D1238 bash-3.2 以前の declare -p は ^A, ^? を
# ^A^A, ^A^? と出力してしまうので補正する。
gsub(/\001\001/, "${_ble_term_soh}", decl);
gsub(/\001\177/, "${_ble_term_del}", decl);
gsub(/\001\001/, "${_ble_term_SOH}", decl);
gsub(/\001\177/, "${_ble_term_DEL}", decl);
}
if (flag_escape_cr)
gsub(/\015/, "${_ble_term_CR}", decl);
# declare 除去
sub(/^declare +(-[-aAfFgilrtux]+ +)?(-- +)?/, "", decl);
Expand Down Expand Up @@ -2915,10 +2922,11 @@ function ble/term:cygwin/initialize.hook {
function ble/term/.initialize {
# Constants (init-term.sh に失敗すると大変なので此処に書く)
_ble_term_nl=$'\n'
_ble_term_fs=$'\034'
_ble_term_soh=$'\001'
_ble_term_del=$'\177'
_ble_term_FS=$'\034'
_ble_term_SOH=$'\001'
_ble_term_DEL=$'\177'
_ble_term_IFS=$' \t\n'
_ble_term_CR=$'\r'

if [[ $_ble_base/lib/init-term.sh -nt $_ble_base_cache/$TERM.term ]]; then
source "$_ble_base/lib/init-term.sh"
Expand Down

0 comments on commit 71f3498

Please sign in to comment.