diff options
author | axel <axel@liljencrantz.se> | 2007-01-19 02:27:00 +1000 |
---|---|---|
committer | axel <axel@liljencrantz.se> | 2007-01-19 02:27:00 +1000 |
commit | 421aff7d67a82aa217550fd428fcf215f55ef4dc (patch) | |
tree | 796c177aab2f05033d64e69e2e47620e469fd4c8 /builtin_commandline.c | |
parent | 9e7094adfcbb2cfb63f1ea6ac587354dd3463e48 (diff) |
Make command specific completions handle quoted and otherwise escaped tokens better by making sure that the output from the commandline builtin is properly unescaped
darcs-hash:20070118162700-ac50b-cd93d9a6aff5bb7629a790d60b241000eb1d0ac0.gz
Diffstat (limited to 'builtin_commandline.c')
-rw-r--r-- | builtin_commandline.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/builtin_commandline.c b/builtin_commandline.c index 4aaadb05..7d29efc5 100644 --- a/builtin_commandline.c +++ b/builtin_commandline.c @@ -146,7 +146,6 @@ static void write_part( const wchar_t *begin, if( tokenize ) { - buff = wcsndup( begin, end-begin ); // fwprintf( stderr, L"Subshell: %ls, end char %lc\n", buff, *end ); sb_init( &out ); @@ -159,20 +158,21 @@ static void write_part( const wchar_t *begin, (tok_get_pos( &tok)+wcslen(tok_last( &tok)) >= pos) ) break; -// fwprintf( stderr, L"Next token %ls\n", tok_last( &tok ) ); - switch( tok_last_type( &tok ) ) { case TOK_STRING: - sb_append2( &out, tok_last( &tok), L"\n", (void *)0 ); + { + wchar_t *tmp = unescape( tok_last( &tok ), UNESCAPE_INCOMPLETE ); + sb_append2( &out, tmp, L"\n", (void *)0 ); + free( tmp ); break; - + } + } } - - if( out.buff ) - sb_append( sb_out, - (wchar_t *)out.buff ); + + sb_append( sb_out, + (wchar_t *)out.buff ); free( buff ); tok_destroy( &tok ); @@ -180,12 +180,24 @@ static void write_part( const wchar_t *begin, } else { + wchar_t *buff, *esc; + if( cut_at_cursor ) { end = begin+pos; } - sb_append_substring( sb_out, begin, end-begin ); - sb_append( sb_out, L"\n" ); + + buff = wcsndup( begin, end-begin ); + esc = unescape( buff, UNESCAPE_INCOMPLETE ); + +// debug( 0, L"woot2 %ls -> %ls", buff, esc ); + + sb_append( sb_out, esc ); + sb_append( sb_out, L"\n" ); + + free( esc ); + free( buff ); + } } |