diff --git a/common.c b/common.c index a0a7323e5..a138ae2f1 100644 --- a/common.c +++ b/common.c @@ -719,10 +719,13 @@ static wchar_t *escape_simple( const wchar_t *in ) wchar_t *escape( const wchar_t *in_orig, - int escape_all ) + int flags ) { const wchar_t *in = in_orig; + int escape_all = flags & ESCAPE_ALL; + int no_quoted = flags & ESCAPE_NO_QUOTED; + wchar_t *out; wchar_t *pos; @@ -735,7 +738,7 @@ wchar_t *escape( const wchar_t *in_orig, FATAL_EXIT(); } - if( wcslen( in ) == 0 ) + if( !no_quoted && (wcslen( in ) == 0) ) { out = wcsdup(L"''"); if( !out ) @@ -884,7 +887,7 @@ wchar_t *escape( const wchar_t *in_orig, Use quoted escaping if possible, since most people find it easier to read. */ - if( need_escape && !need_complex_escape && escape_all ) + if( !no_quoted && need_escape && !need_complex_escape && escape_all ) { free( out ); out = escape_simple( in_orig ); diff --git a/common.h b/common.h index f322badaa..41fc64d59 100644 --- a/common.h +++ b/common.h @@ -40,9 +40,24 @@ */ #define BYTE_MAX 0xffu +/* + Escape special fish syntax characters liek the semicolon + */ #define UNESCAPE_SPECIAL 1 +/* + Allow incomplete escape sequences + */ #define UNESCAPE_INCOMPLETE 2 +/** + Escape all characters, including magic characters like the semicolon + */ +#define ESCAPE_ALL 1 +/** + Do not try to use 'simplified' quoted escapes, and do not use empty quotes as the empty string + */ +#define ESCAPE_NO_QUOTED 2 + /** Save the shell mode on startup so we can restore them on exit diff --git a/fish_pager.c b/fish_pager.c index 23f1ec8ef..cdf75de45 100644 --- a/fish_pager.c +++ b/fish_pager.c @@ -953,7 +953,7 @@ static void mangle_completions( array_list_t *l, const wchar_t *prefix ) if( (c == COMPLETE_ITEM_SEP) || (c==COMPLETE_SEP) || !c) { *end = 0; - wchar_t * str = escape( start, 1 ); + wchar_t * str = escape( start, ESCAPE_ALL | ESCAPE_NO_QUOTED ); comp->comp_width += my_wcswidth( str ); halloc_register( global_context, str ); diff --git a/reader.c b/reader.c index 8b73143b4..75f5be9b9 100644 --- a/reader.c +++ b/reader.c @@ -1001,7 +1001,7 @@ static void completion_insert( const wchar_t *val, int flags ) if( quote == L'\0' ) { - replaced = escape( val, 1 ); + replaced = escape( val, ESCAPE_ALL | ESCAPE_NO_QUOTED ); } else { @@ -1031,7 +1031,7 @@ static void completion_insert( const wchar_t *val, int flags ) if( unescapable ) { free( replaced ); - wchar_t *tmp = escape( val, 1 ); + wchar_t *tmp = escape( val, ESCAPE_ALL | ESCAPE_NO_QUOTED ); replaced = wcsdupcat( L" ", tmp ); free( tmp); replaced[0]=quote; @@ -1134,11 +1134,11 @@ static void run_pager( wchar_t *prefix, int is_quoted, array_list_t *comp ) - foo = escape( el->completion + base_len, 1 ); + foo = escape( el->completion + base_len, ESCAPE_ALL | ESCAPE_NO_QUOTED ); } else { - foo = escape( el->completion, 1 ); + foo = escape( el->completion, ESCAPE_ALL | ESCAPE_NO_QUOTED ); } }