Skip to content

Commit

Permalink
complete: do not quote ":" and "=" in non-filename completions genera…
Browse files Browse the repository at this point in the history
…ted by progcomp
  • Loading branch information
akinomyoga committed Dec 14, 2020
1 parent 6c54f79 commit d82535e
Show file tree
Hide file tree
Showing 8 changed files with 153 additions and 19 deletions.
2 changes: 1 addition & 1 deletion README-ja_JP.md
Expand Up @@ -143,7 +143,7 @@ $ cp -r ble-0.3.3 /path/to/blesh
# 間に通常の bashrc の内容を既述します。

# .bashrc の末端近くに以下を追加して下さい。
((_ble_bash)) && ble-attach
[[ ${BLE_VERSION-} ]] && ble-attach
```

## 1.4 初期化スクリプト `~/.blerc` について
Expand Down
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -142,7 +142,7 @@ but more reliable way is to add the following codes to your `.bashrc` file:
# your bashrc settings come here...

# Add this line at the end of .bashrc:
((_ble_bash)) && ble-attach
[[ ${BLE_VERSION-} ]] && ble-attach
```

## 1.4 User settings `~/.blerc`
Expand Down
6 changes: 5 additions & 1 deletion lib/core-complete.sh
Expand Up @@ -1021,6 +1021,10 @@ function ble/complete/action/util/quote-insert {
# '~' で始まる補完候補と同名のファイルがある時にのみチルダをクォートする。
[[ $INSERT == '~'* && ! ( $DATA == *:filenames:* && -e $INSERT ) ]] &&
escape_flags=T$escape_flags
# #D1434 = 及び : は filenames がついていない限りは quote しない事にする。
# bash-complete が unquoted =, : を生成する可能性があるので。
[[ $DATA != *:filenames:* ]] &&
escape_flags=${escape_flags//c}
fi

if [[ $comps_flags == *v* && $CAND == "$COMPV"* ]]; then
Expand Down Expand Up @@ -1819,7 +1823,7 @@ function ble/complete/source:tilde/.generate {
printf '%s\n' '~' '~+' '~-'
local dirstack_max=$((${#DIRSTACK[@]}-1))
((dirstack_max>=0)) &&
eval "printf '%s\n' '~'{0..$dirstack_max}"
builtin eval "printf '%s\n' '~'{0..$dirstack_max}"

}

Expand Down
4 changes: 2 additions & 2 deletions lib/core-syntax.sh
Expand Up @@ -646,8 +646,8 @@ function ble/syntax/print-status {
function ble/syntax/print-layer-buffer.draw {
local layer_name=$1
local -a keys vals
eval "keys=(\"\${!_ble_highlight_layer_${layer_name}_buff[@]}\")"
eval "vals=(\"\${_ble_highlight_layer_${layer_name}_buff[@]}\")"
builtin eval "keys=(\"\${!_ble_highlight_layer_${layer_name}_buff[@]}\")"
builtin eval "vals=(\"\${_ble_highlight_layer_${layer_name}_buff[@]}\")"

local ret sgr0=$_ble_term_sgr0
ble/color/face2sgr command_builtin; local sgr1=$ret
Expand Down
5 changes: 3 additions & 2 deletions memo/ChangeLog.md
Expand Up @@ -10,6 +10,7 @@
## Changes

- syntax: exclude <code>\\ + LF</code> at the word beginning from words (motivated by cmplstofB) `#D1431` 67e62d6
- complete: do not quote `:` and `=` in non-filename completions generated by progcomp `#D1434` 0000000

## Fixes

Expand Down Expand Up @@ -57,7 +58,7 @@
- prompt: support `bleopt prompt_{{ps1,rps1}{_final,_transient}}` (suggested by Dave-Elec) `#D1366` 06381c9
- prompt: fix a bug that prompt are always re-insntiated for every rendering `#D1374` 0770cda
- prompt: fix a bug that rprompt is not cleared when `bleopt prompt_rps1` is reset `#D1377` 1904b1d
- prompt: fix a bug that prompts updated by `PROMPT_COMMAND` are not reflected immediately `#D1426` 0000000
- prompt: fix a bug that prompts updated by `PROMPT_COMMAND` are not reflected immediately (reported by 3ximus) `#D1426` bbda197
- edit: support Bash 5.1 widgets `#D1368` e747ee3
- color: support `TERM=*-direct` `#D1369` 0d38897 `#D1370` f7dc477
- complete: support `bleopt complete_auto_menu` `#D1373` 77bfabd
Expand Down Expand Up @@ -103,7 +104,7 @@
- menu: preserve columns with `{forward,backward}-line` `#D1396` 3d5a341
- syntax: rename `ble_debug` to `bleopt syntax_debug` `#D1398` 3cda58b
- syntax: change a style of buffer contents in `bleopt syntax_debug` `#D1399` 3cda58b
- complete: change to generate filenames starting from `.` by default `#D1425` 987436d
- complete: change to generate filenames starting from `.` by default (motivated by cmplstofB) `#D1425` 987436d

## Fix

Expand Down
2 changes: 1 addition & 1 deletion memo/done.txt
Expand Up @@ -16,7 +16,7 @@
のみ実行したい。或いは :leave: の時にも実行するべきだろうか。leave の時に
PROMPT_COMMAND は実行しなくても良い気がしてきた。うん。その様に変更する。

* complete: 単語補完で = の右辺の . で始まるファイル名が補完されない [#D1425]
* complete: 単語補完で = の右辺の . で始まるファイル名が補完されない (reported by cmplstofB) [#D1425]
https://github.com/akinomyoga/ble.sh/issues/71

これは試してみた所、a= で補完してから . を入力して絞り込みをすると、最初の
Expand Down
143 changes: 136 additions & 7 deletions note.txt
Expand Up @@ -1197,14 +1197,23 @@ bash_tips
ToDo
-------------------------------------------------------------------------------

2020-12-10
2020-12-14

* progcomp: progcomp で生成された補完候補を現在 quote している。

* 生成された候補が既に quote されている場合や展開を含む場合に、
意図したのと異なる結果になってしまう問題がある。
* 更に既に入力済みの部分に一致しなくなるので遡って書き換わる可能性もある。
* 生成された候補が複数の単語に分かれる場合に、
それが blesh の quote によって一つに結合されてしまう問題もある。

* complete/mandb: FreeBSD でも動かす
理想的には生成された候補を改めて simple-word/eval して、
その結果に基づいて単語を再度挿入し直すという事が考えられるが、
x 全ての候補に対してこれを実行する事を考えると処理が重くなってしまう。
x また、\**\* 等を展開すると *** になってしまうので
その quote を復元する方法についてもちゃんと考えなければならない。

freebsd には roff, nroff, troff 等が存在していない。
それでも man が動作している事を考えると、
何らかの方法で man pages を変換しているという事の筈。
それについて調べて対応する。
或いは simple-word element を一つずつ抽出して処理すれば良いのかもしれない。

2020-12-09

Expand Down Expand Up @@ -3700,17 +3709,137 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2020-12-14

* progcomp: : や = の quote の取り扱い (reported by eximus) [#D1434]
https://github.com/akinomyoga/ble.sh/issues/77

? そもそも \=, \: の様にエスケープしていたのは何故だったか。

? bash-completion の提供した補完に対して \= や \: の様にエスケープを実施す
る必要はあっただろうか。その辺りの実装はどの様になっていたのだったか。

関連しそうな物を探す。ble-0.3 では = のエスケープはしていない。

#D1133 でコマンド名に関しては =, : の quote はしない様にしている。
#D1098 6c6bae56 で = や : のエスケープが導入されている。
#D1094 では = や : による候補の分割を議論している。

うーん。元々エスケープは #D1098 で導入された物の様だが深くは考察していない。
改めてどの様に振る舞うのが自然か考察する必要がある。

* そもそも ble.sh の補完は展開後の結果を生成して貰う前提になっている。
一方で bash の補完は展開前の結果を生成する事を許容している。
例えば abc$(echo hello) の様な文字列を補完で生成する事すら可能なのである。
それどころか複数単語からなる展開結果にする事も可能の筈である。

* それでは progcomp の結果はそのまま挿入する事にすれば良いのではないか
とも思われるが此処で問題になるのは、ble.sh の側で適当に展開を実行してから
COMP_LINE を構築して progcomp に渡しているという事である。

これは途中に $var 等の単純な展開等が含まれている場合でも
progcomp で補完を実行できる様にする為に必要。

この時、progcomp が展開前の補完結果を生成した時に、
それを如何に元のコマンドライン文字列に反映させるのかが問題になる。

x [OK] 手許では再現していないが scp chat\:down[TAB] で chat\: が消滅してしまう?

notepc の方は bash_completion が入っていないので今試せない。
* chat は port を変えているので localhost: から試そうとしてもできない。
localhost や chat を .ssh/config に登録してパスワード無しで補完できる様にしたが、
補完候補は出してくれない様である。
* hp2019 -> chat を試してみたが再現しない。local にも mkdir downloads したが再現しない。

うーん。取り敢えずそもそも何故失敗するのか考える?
plain bash で実行したところ failglob で失敗している。
shopt -u failglob にしたら ble.sh の中でも補完が動く様になった。

そして chat\: が消滅してしまう問題に関しては、
plain bash でも再現する事ができた。
これは bash-completion の問題である。

特にローカルのカレントディレクトリに "host:..." というファイルが存在する時に、
host\:... と入力している可能性があって、この時に host: の部分が消滅してしまう
という問題が発生する。

https://github.com/scop/bash-completion/issues で報告をしようかと考えたが、
もしかすると最新版で直っている可能性もあるので、
最新版の bash-completion を試してみても良い。

うーん。progcomp による展開結果が空白などを含んでいる時にどのように振る舞うのか。
plain bash はそのまま何も加工を行わずに展開してしまう。うーん。
blesh ではどの様に取り扱うべきか。

* できるだけ progcomp が提供した quote を保持する様にしたい。
然し、これは現実的には難しいのではないか。

a = 及び : についてだけ quote しているかそうでないか保持する? それ以外の
文字については自分で quote し直す。

その為には progcomp が生成した単語について = や : で分割を試して、その
上でそれぞれ quote してから再結合する? これだといかにも処理量が大きい。
非効率的である。

これは処理方法として複雑でありユーザから見たら不自然で予測不能に見える
かもしれない。処理の重さとしては次に述べる方法よりは現実的である。

b 入力済みの部分に一致する部分を除去してそのまま挿入。

ここで問題になっているのは既に入力済みの部分に対応する文字列を
どの様に取り除くのかという事であった。二分法を用いる等して
これについて既に入力済みの部分を除去する方法はないだろうか。

どの様にしたら良いのかを調べる必要がある。二分探索で調べるという方法と、
1 unit ずつ読み取って行くという方法の二種類を考える事ができる。

* 二分探索で調べるというのは複雑な気がする。元の文字列について途中で切
断して二分探索していくという手も考えられるが、変数名の途中など変な所
で切断すると内容が空になるなどして意図しない結果になってしまう。

* 取り敢えず 1 unit (simple word element) ずつ読み取って行って、切断す
るという方法? 然し、'...' 等の様に一気に読み取る事ができるliteral 等
になっているとすると、実装が複雑になる。面倒である。そもそも処理が複
雑になる。面倒である。

c 今まで通り基本的に progcomp が生成した物は展開毎と見做して quote を行う。
= 及び : は基本的には quote を加えない。compopt -o filename で quote が
明示的に指定された時にのみ =, : の quote を行う。

これは progcomp が quote を自前で行って候補を生成した時に問題になる。つ
まり quote が二重に為される事になり、意図しない結果になってしまう。然し、
この問題は今までにも存在していた問題の筈である。取り敢えずの修正として
は妥当である。

取り敢えず今までも quote を勝手にする事による問題はあった。
全てを一度に解決するのは難しいししなくても良い。
此処は c の方針で修正する事にする。

2020-12-13

* README: ((_ble_bash)) && ble-attach だと set -u の時駄目 [#D1433]
ble.sh ロードに失敗した時や ble.sh を意図的に読み込まなかった時に
_ble_bash が存在しないので内容をチェックする前にエラーになってしまう。

[[ ${BLE_VERSION-} ]] && ble-attach にするべき。

2020-12-10

* complete/mandb: FreeBSD 上で man 情報の抽出に失敗している [#D1432]

| freebsd には roff, nroff, troff 等が存在していない。
| それでも man が動作している事を考えると、
| 何らかの方法で man pages を変換しているという事の筈。
| それについて調べて対応する。

対応した。FreeBSD では mandoc というコマンドを使って変換を行っている。
nroff と同様に -man 等を指定する事ができる様だが、
どうやら FreeBSD は -man ではなくて -mdoc を想定して man pages を書いている様だ。
という訳なので -mdoc を前提として抽出をする様に書き換えた。

ちゃんと nroff を使う版も動いている。OK

* highlight: command \^J-a とした時に -a がコマンドとして着色されない (reported by cmplstofB) [#D1431]
* highlight: command \^J-a とした時に -a がオプションとして着色されない (reported by cmplstofB) [#D1431]
https://github.com/akinomyoga/ble.sh/issues/76

現在の着色では \-a や ''-a 等の様に quote がある場合には、
Expand Down
8 changes: 4 additions & 4 deletions src/util.sh
Expand Up @@ -1132,14 +1132,14 @@ function ble/path#remove-glob {
builtin eval -- "${_ble_local_script//opts/$1}"
}
function ble/path#contains {
eval "[[ :\${$1}: == *:\"\$2\":* ]]"
builtin eval "[[ :\${$1}: == *:\"\$2\":* ]]"
}

if ((_ble_bash>=40000)); then
_ble_util_set_declare=(declare -A NAME)
function ble/set#add { eval "$1[x\$2]=1"; }
function ble/set#add { builtin eval "$1[x\$2]=1"; }
function ble/set#remove { builtin unset -v "$1[x\$2]"; }
function ble/set#contains { eval "[[ \${$1[x\$2]+set} ]]"; }
function ble/set#contains { builtin eval "[[ \${$1[x\$2]+set} ]]"; }
else
_ble_util_set_declare=(declare NAME)
function ble/set#.escape {
Expand All @@ -1156,7 +1156,7 @@ else
}
function ble/set#contains {
local _ble_local_value=$2; ble/set#.escape
eval "[[ :\$$1: == *:\"\$_ble_local_value\":* ]]"
builtin eval "[[ :\$$1: == *:\"\$_ble_local_value\":* ]]"
}
fi

Expand Down

0 comments on commit d82535e

Please sign in to comment.