mirror of
https://github.com/neovim/neovim.git
synced 2025-09-18 01:08:20 +00:00
mch_write -> term_write
Switch from POSIX's write() to fwrite(stdout,...) and disable buffering since vim buffers output explicitly and flushes when needed, like when a key is typed.
This commit is contained in:
@@ -82,30 +82,6 @@ static int did_set_title = FALSE;
|
|||||||
static char_u *oldicon = NULL;
|
static char_u *oldicon = NULL;
|
||||||
static int did_set_icon = FALSE;
|
static int did_set_icon = FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write s[len] to the screen.
|
|
||||||
*/
|
|
||||||
void mch_write(char_u *s, int len)
|
|
||||||
{
|
|
||||||
if (embedded_mode) {
|
|
||||||
// TODO(tarruda): This is a temporary hack to stop Neovim from writing
|
|
||||||
// messages to stdout in embedded mode. In the future, embedded mode will
|
|
||||||
// be the only possibility(GUIs will always start neovim with a msgpack-rpc
|
|
||||||
// over stdio) and this function won't exist.
|
|
||||||
//
|
|
||||||
// The reason for this is because before Neovim fully migrates to a
|
|
||||||
// msgpack-rpc-driven architecture, we must have a fully functional
|
|
||||||
// UI working
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ignored = (int)write(1, (char *)s, len);
|
|
||||||
if (p_wd) /* Unix is too fast, slow down a bit more */
|
|
||||||
os_microdelay(p_wd, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the machine has job control, use it to suspend the program,
|
* If the machine has job control, use it to suspend the program,
|
||||||
* otherwise fake it by starting a new shell.
|
* otherwise fake it by starting a new shell.
|
||||||
@@ -159,6 +135,12 @@ void mch_init(void)
|
|||||||
Columns = 80;
|
Columns = 80;
|
||||||
Rows = 24;
|
Rows = 24;
|
||||||
|
|
||||||
|
// Prevent buffering output.
|
||||||
|
// Output gets explicitly buffered and flushed by out_flush() at times like,
|
||||||
|
// for example, when the user presses a key. Without this line, vim will not
|
||||||
|
// render the screen correctly.
|
||||||
|
setbuf(stdout, NULL);
|
||||||
|
|
||||||
out_flush();
|
out_flush();
|
||||||
|
|
||||||
#ifdef MACOS_CONVERT
|
#ifdef MACOS_CONVERT
|
||||||
|
@@ -1822,11 +1822,35 @@ void termcapinit(char_u *name)
|
|||||||
set_termname(T_NAME != NULL ? T_NAME : term);
|
set_termname(T_NAME != NULL ? T_NAME : term);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Write s[len] to the screen.
|
||||||
|
void term_write(char_u *s, size_t len)
|
||||||
|
{
|
||||||
|
if (embedded_mode) {
|
||||||
|
// TODO(tarruda): This is a temporary hack to stop Neovim from writing
|
||||||
|
// messages to stdout in embedded mode. In the future, embedded mode will
|
||||||
|
// be the only possibility(GUIs will always start neovim with a msgpack-rpc
|
||||||
|
// over stdio) and this function won't exist.
|
||||||
|
//
|
||||||
|
// The reason for this is because before Neovim fully migrates to a
|
||||||
|
// msgpack-rpc-driven architecture, we must have a fully functional
|
||||||
|
// UI working
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
(void) fwrite(s, len, 1, stdout);
|
||||||
|
|
||||||
|
#ifdef UNIX
|
||||||
|
if (p_wd) { // Unix is too fast, slow down a bit more
|
||||||
|
os_microdelay(p_wd, false);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* the number of calls to ui_write is reduced by using the buffer "out_buf"
|
* the number of calls to ui_write is reduced by using the buffer "out_buf"
|
||||||
*/
|
*/
|
||||||
# define OUT_SIZE 2047
|
# define OUT_SIZE 2047
|
||||||
/* Add one to allow mch_write() in os_win32.c to append a NUL */
|
// Add one to allow term_write() in os_win32.c to append a NUL
|
||||||
static char_u out_buf[OUT_SIZE + 1];
|
static char_u out_buf[OUT_SIZE + 1];
|
||||||
static int out_pos = 0; /* number of chars in out_buf */
|
static int out_pos = 0; /* number of chars in out_buf */
|
||||||
|
|
||||||
|
@@ -55,7 +55,7 @@ void ui_write(char_u *s, int len)
|
|||||||
s = tofree;
|
s = tofree;
|
||||||
}
|
}
|
||||||
|
|
||||||
mch_write(s, len);
|
term_write(s, len);
|
||||||
|
|
||||||
if (output_conv.vc_type != CONV_NONE)
|
if (output_conv.vc_type != CONV_NONE)
|
||||||
free(tofree);
|
free(tofree);
|
||||||
|
Reference in New Issue
Block a user