@@ -696,15 +696,77 @@ _cs_do_shift_tab() {
696696 _cs_redraw
697697}
698698
699+ # _cs_quote_completion() {
700+ # local completion="$1"
701+ # if [[ "$completion" == *' '* ]]; then
702+ # completion="${completion/#\~/$HOME}"
703+ # completion="${completion//\"/}"
704+ # # Trailing slash será preservada dentro das aspas
705+ # completion="\"${completion}\""
706+ # fi
707+ # printf '%s' "$completion"
708+ # }
709+
699710_cs_quote_completion () {
700711 local completion=" $1 "
701- if [[ " $completion " == * ' ' * ]]; then
702- completion=" ${completion/# \~ / $HOME } "
703- completion=" ${completion// \" / } "
704- # Trailing slash será preservada dentro das aspas
705- completion=" \" ${completion} \" "
712+ local trailing_slash=" "
713+ [[ " $completion " == * / ]] && trailing_slash=" /" && completion=" ${completion%/ } "
714+
715+ # Escapa sempre com \ se contém espaço ou qualquer caractere não-seguro
716+ # Inclui caracteres unicode problemáticos via verificação de espaço e ASCII especial
717+ local needs_escape=0
718+ [[ " $completion " == * ' ' * ]] && needs_escape=1
719+ [[ " $completion " == * " '" * ]] && needs_escape=1
720+ [[ " $completion " == * ' "' * ]] && needs_escape=1
721+ [[ " $completion " == * ' (' * ]] && needs_escape=1
722+ [[ " $completion " == * ' )' * ]] && needs_escape=1
723+ [[ " $completion " == * ' [' * ]] && needs_escape=1
724+ [[ " $completion " == * ' ]' * ]] && needs_escape=1
725+ [[ " $completion " == * ' {' * ]] && needs_escape=1
726+ [[ " $completion " == * ' }' * ]] && needs_escape=1
727+ [[ " $completion " == * ' &' * ]] && needs_escape=1
728+ [[ " $completion " == * ' ;' * ]] && needs_escape=1
729+ [[ " $completion " == * ' !' * ]] && needs_escape=1
730+ [[ " $completion " == * ' #' * ]] && needs_escape=1
731+ [[ " $completion " == * ' $' * ]] && needs_escape=1
732+ [[ " $completion " == * ' `' * ]] && needs_escape=1
733+ [[ " $completion " == * ' |' * ]] && needs_escape=1
734+ [[ " $completion " == * ' <' * ]] && needs_escape=1
735+ [[ " $completion " == * ' >' * ]] && needs_escape=1
736+ [[ " $completion " == * ' ,' * ]] && needs_escape=1
737+ [[ " $completion " == * ' ~' * ]] && needs_escape=1
738+ [[ " $completion " == * ' *' * ]] && needs_escape=1
739+ [[ " $completion " == * ' ?' * ]] && needs_escape=1
740+ [[ " $completion " == * ' \' * ]] && needs_escape=1
741+
742+ if (( needs_escape )) ; then
743+ # Escapa \ primeiro para não duplo-escapar
744+ completion=" ${completion// \\ / \\\\ } "
745+ completion=" ${completion// / \\ } "
746+ completion=" ${completion// \' / \\\' } "
747+ completion=" ${completion// \" / \\\" } "
748+ completion=" ${completion// (/ \\ (} "
749+ completion=" ${completion// )/ \\ )} "
750+ completion=" ${completion// [/ \\ [} "
751+ completion=" ${completion// ]/ \\ ]} "
752+ completion=" ${completion// \{ / \\\{ } "
753+ completion=" ${completion// \} / \\\} } "
754+ completion=" ${completion// &/ \\ &} "
755+ completion=" ${completion// ;/ \\ ;} "
756+ completion=" ${completion//!/ \\ ! } "
757+ completion=" ${completion//#/ \\ # } "
758+ completion=" ${completion// \$ / \\\$ } "
759+ completion=" ${completion// \` / \\\` } "
760+ completion=" ${completion// |/ \\ |} "
761+ completion=" ${completion// </ \\ <} "
762+ completion=" ${completion// >/ \\ >} "
763+ completion=" ${completion// ,/ \\ ,} "
764+ completion=" ${completion// ~/ \\ ~} "
765+ completion=" ${completion// \* / \\ * } "
766+ completion=" ${completion// \? / \\ ?} "
706767 fi
707- printf ' %s' " $completion "
768+
769+ printf ' %s' " ${completion}${trailing_slash} "
708770}
709771
710772_cs_do_tab () {
0 commit comments