mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-25 20:33:08 +00:00
Bring back ellipsis
This commit is contained in:
parent
5ba1261285
commit
21e83a881e
7 changed files with 78 additions and 1 deletions
|
@ -88,6 +88,8 @@ struct termios shell_modes;
|
|||
static pthread_t main_thread_id = 0;
|
||||
static bool thread_assertions_configured_for_testing = false;
|
||||
|
||||
wchar_t ellipsis_char;
|
||||
|
||||
char *profile=0;
|
||||
|
||||
const wchar_t *program_name;
|
||||
|
@ -502,6 +504,12 @@ wcstring wsetlocale(int category, const wchar_t *locale)
|
|||
char * res = setlocale(category,lang);
|
||||
free( lang );
|
||||
|
||||
/*
|
||||
Use ellipsis if on known unicode system, otherwise use $
|
||||
*/
|
||||
char *ctype = setlocale( LC_CTYPE, NULL );
|
||||
ellipsis_char = (strstr( ctype, ".UTF")||strstr( ctype, ".utf") )?L'\x2026':L'$';
|
||||
|
||||
if( !res )
|
||||
return wcstring();
|
||||
else
|
||||
|
@ -753,6 +761,7 @@ void write_screen( const wcstring &msg, wcstring &buff )
|
|||
int line_width = 0;
|
||||
int tok_width = 0;
|
||||
int screen_width = common_get_width();
|
||||
|
||||
if( screen_width )
|
||||
{
|
||||
start = pos = msg.c_str();
|
||||
|
|
10
common.h
10
common.h
|
@ -89,6 +89,12 @@ void exit_without_destructors(int code) __attribute__ ((noreturn));
|
|||
*/
|
||||
extern struct termios shell_modes;
|
||||
|
||||
/**
|
||||
The character to use where the text has been truncated. Is an
|
||||
ellipsis on unicode system and a $ on other systems.
|
||||
*/
|
||||
extern wchar_t ellipsis_char;
|
||||
|
||||
/**
|
||||
The verbosity level of fish. If a call to debug has a severity
|
||||
level higher than \c debug_level, it will not be printed.
|
||||
|
@ -564,7 +570,9 @@ void error_reset();
|
|||
|
||||
/**
|
||||
This function behaves exactly like a wide character equivalent of
|
||||
the C function setlocale.
|
||||
the C function setlocale, except that it will also try to detect if
|
||||
the user is using a Unicode character set, and if so, use the
|
||||
unicode ellipsis character as ellipsis, instead of '$'.
|
||||
*/
|
||||
wcstring wsetlocale( int category, const wchar_t *locale );
|
||||
|
||||
|
|
|
@ -377,6 +377,8 @@ static int print_max( const wchar_t *str, int max, int has_more )
|
|||
break;
|
||||
if( ( written + wcwidth(str[i]) == max) && (has_more || str[i+1]) )
|
||||
{
|
||||
writech( ellipsis_char );
|
||||
written += wcwidth(ellipsis_char );
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
39
output.cpp
39
output.cpp
|
@ -489,6 +489,43 @@ void writestr( const wchar_t *str )
|
|||
delete[] buffer;
|
||||
}
|
||||
|
||||
|
||||
void writestr_ellipsis( const wchar_t *str, int max_width )
|
||||
{
|
||||
int written=0;
|
||||
int tot;
|
||||
|
||||
CHECK( str, );
|
||||
|
||||
tot = my_wcswidth(str);
|
||||
|
||||
if( tot <= max_width )
|
||||
{
|
||||
writestr( str );
|
||||
return;
|
||||
}
|
||||
|
||||
while( *str != 0 )
|
||||
{
|
||||
int w = fish_wcwidth( *str );
|
||||
if( written+w+fish_wcwidth( ellipsis_char )>max_width )
|
||||
{
|
||||
break;
|
||||
}
|
||||
written+=w;
|
||||
writech( *(str++) );
|
||||
}
|
||||
|
||||
written += fish_wcwidth( ellipsis_char );
|
||||
writech( ellipsis_char );
|
||||
|
||||
while( written < max_width )
|
||||
{
|
||||
written++;
|
||||
writestr( L" " );
|
||||
}
|
||||
}
|
||||
|
||||
int write_escaped_str( const wchar_t *str, int max_len )
|
||||
{
|
||||
|
||||
|
@ -509,6 +546,8 @@ int write_escaped_str( const wchar_t *str, int max_len )
|
|||
writech( out[i] );
|
||||
written += fish_wcwidth( out[i] );
|
||||
}
|
||||
writech( ellipsis_char );
|
||||
written += fish_wcwidth( ellipsis_char );
|
||||
|
||||
for( i=written; i<max_len; i++ )
|
||||
{
|
||||
|
|
6
output.h
6
output.h
|
@ -116,6 +116,12 @@ int writech( wint_t ch );
|
|||
*/
|
||||
void writestr( const wchar_t *str );
|
||||
|
||||
/**
|
||||
Write a wide character string to FD 1. If the string is wider than
|
||||
the specified maximum, truncate and ellipsize it.
|
||||
*/
|
||||
void writestr_ellipsis( const wchar_t *str, int max_width );
|
||||
|
||||
/**
|
||||
Escape and write a string to fd 1
|
||||
*/
|
||||
|
|
|
@ -1532,6 +1532,7 @@ static bool handle_completions( const std::vector<completion_t> &comp )
|
|||
else
|
||||
{
|
||||
// append just the end of the string
|
||||
prefix = wcstring(&ellipsis_char, 1);
|
||||
prefix.append(data->command_line, prefix_start + len - PREFIX_MAX_LEN, wcstring::npos);
|
||||
}
|
||||
|
||||
|
|
12
screen.cpp
12
screen.cpp
|
@ -968,6 +968,7 @@ void s_write( screen_t *s,
|
|||
assert(screen_width - prompt_width >= 1);
|
||||
max_line_width = screen_width - prompt_width - 1;
|
||||
truncated_autosuggestion_line = wcstring(commandline, 0, last_char_that_fits);
|
||||
truncated_autosuggestion_line.push_back(ellipsis_char);
|
||||
commandline = truncated_autosuggestion_line.c_str();
|
||||
}
|
||||
for( size_t i=0; i<prompt_width; i++ )
|
||||
|
@ -1002,6 +1003,17 @@ void s_write( screen_t *s,
|
|||
|
||||
s_desired_append_char( s, commandline[i], col, indent[i], prompt_width );
|
||||
|
||||
if( i== cursor_pos && s->desired.cursor.y != cursor_arr.y && commandline[i] != L'\n' )
|
||||
{
|
||||
/*
|
||||
Ugh. We are placed exactly at the wrapping point of a
|
||||
wrapped line, move cursor to the line below so the
|
||||
cursor won't be on the ellipsis which looks
|
||||
unintuitive.
|
||||
*/
|
||||
cursor_arr.x = s->desired.cursor.x - fish_wcwidth(commandline[i]);
|
||||
cursor_arr.y = s->desired.cursor.y;
|
||||
}
|
||||
}
|
||||
if( i == cursor_pos )
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue