mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-25 12:23:09 +00:00
Use parm_left_cursor and parm_right_cursor for bulk cursor motions.
Fixes #1448
This commit is contained in:
parent
7f2c4cbf8a
commit
fa68c2619f
3 changed files with 36 additions and 37 deletions
24
output.cpp
24
output.cpp
|
@ -418,13 +418,6 @@ int writeb(tputs_arg_t b)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int writembs_internal(char *str)
|
||||
{
|
||||
CHECK(str, 1);
|
||||
|
||||
return tputs(str,1,&writeb)==ERR?1:0;
|
||||
}
|
||||
|
||||
int writech(wint_t ch)
|
||||
{
|
||||
mbstate_t state;
|
||||
|
@ -725,3 +718,20 @@ const wchar_t *output_get_term()
|
|||
{
|
||||
return current_term.empty() ? L"<unknown>" : current_term.c_str();
|
||||
}
|
||||
|
||||
void writembs_check(char *mbs, const char *mbs_name, const char *file, long line)
|
||||
{
|
||||
if (mbs != NULL)
|
||||
{
|
||||
tputs(mbs, 1, &writeb);
|
||||
}
|
||||
else
|
||||
{
|
||||
debug( 0, _(L"Tried to use terminfo string %s on line %ld of %s, which is undefined in terminal of type \"%ls\". Please report this error to %s"),
|
||||
mbs_name,
|
||||
line,
|
||||
file,
|
||||
output_get_term(),
|
||||
PACKAGE_BUGREPORT);
|
||||
}
|
||||
}
|
||||
|
|
29
output.h
29
output.h
|
@ -78,33 +78,8 @@ void set_color(rgb_color_t c, rgb_color_t c2);
|
|||
/**
|
||||
Write specified multibyte string
|
||||
*/
|
||||
#define writembs( mbs ) \
|
||||
{ \
|
||||
char *tmp = mbs; \
|
||||
if( tmp ) \
|
||||
{ \
|
||||
writembs_internal( tmp ); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
debug( 0, \
|
||||
_(L"Tried to use terminfo string %s on line %d of %s, which is undefined in terminal of type \"%ls\". Please report this error to %s"), \
|
||||
#mbs, \
|
||||
__LINE__, \
|
||||
__FILE__, \
|
||||
output_get_term(), \
|
||||
PACKAGE_BUGREPORT); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Write a char * narrow string to FD 1, needed for the terminfo
|
||||
strings. This is usually just a wrapper aound tputs, using writeb
|
||||
as the sending function. But a weird bug on PPC Linux means that on
|
||||
this platform, write is instead used directly.
|
||||
*/
|
||||
int writembs_internal(char *str);
|
||||
void writembs_check(char *mbs, const char *mbs_name, const char *file, long line);
|
||||
#define writembs(mbs) writembs_check((mbs), #mbs, __FILE__, __LINE__)
|
||||
|
||||
/**
|
||||
Write a wide character using the output method specified using output_set_writer().
|
||||
|
|
20
screen.cpp
20
screen.cpp
|
@ -638,18 +638,32 @@ static void s_move(screen_t *s, data_buffer_t *b, int new_x, int new_y)
|
|||
x_steps = 0;
|
||||
}
|
||||
|
||||
char *multi_str = NULL;
|
||||
if (x_steps < 0)
|
||||
{
|
||||
str = cursor_left;
|
||||
multi_str = parm_left_cursor;
|
||||
}
|
||||
else
|
||||
{
|
||||
str = cursor_right;
|
||||
multi_str = parm_right_cursor;
|
||||
}
|
||||
|
||||
for (i=0; i<abs(x_steps); i++)
|
||||
|
||||
// Use the bulk ('multi') output for cursor movement if it is supported and it would be shorter
|
||||
// Note that this is required to avoid some visual glitches in iTerm (#1448)
|
||||
bool use_multi = (multi_str != NULL && multi_str[0] != '\0' && abs(x_steps) * strlen(str) > strlen(multi_str));
|
||||
if (use_multi)
|
||||
{
|
||||
writembs(str);
|
||||
char *multi_param = tparm(multi_str, abs(x_steps));
|
||||
writembs(multi_param);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i=0; i<abs(x_steps); i++)
|
||||
{
|
||||
writembs(str);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue