mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge pull request #1186 from splinterofchaos/write
Non-unix-specific os_unix function.
This commit is contained in:
commit
ad848ced11
107
src/nvim/main.c
107
src/nvim/main.c
@ -60,10 +60,13 @@
|
|||||||
#include "nvim/os/time.h"
|
#include "nvim/os/time.h"
|
||||||
#include "nvim/os/input.h"
|
#include "nvim/os/input.h"
|
||||||
#include "nvim/os/os.h"
|
#include "nvim/os/os.h"
|
||||||
|
#include "nvim/os/time.h"
|
||||||
|
#include "nvim/os/event.h"
|
||||||
#include "nvim/os/signal.h"
|
#include "nvim/os/signal.h"
|
||||||
#include "nvim/msgpack_rpc/helpers.h"
|
#include "nvim/msgpack_rpc/helpers.h"
|
||||||
#include "nvim/api/private/defs.h"
|
#include "nvim/api/private/defs.h"
|
||||||
#include "nvim/api/private/helpers.h"
|
#include "nvim/api/private/helpers.h"
|
||||||
|
#include "nvim/api/private/handle.h"
|
||||||
|
|
||||||
/* Maximum number of commands from + or -c arguments. */
|
/* Maximum number of commands from + or -c arguments. */
|
||||||
#define MAX_ARG_CMDS 10
|
#define MAX_ARG_CMDS 10
|
||||||
@ -142,13 +145,60 @@ static char *(main_errors[]) =
|
|||||||
#define ME_INVALID_ARG 5
|
#define ME_INVALID_ARG 5
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Performs early initialization.
|
||||||
|
///
|
||||||
|
/// Needed for unit tests. Must be called after `time_init()`.
|
||||||
|
void early_init(void)
|
||||||
|
{
|
||||||
|
handle_init();
|
||||||
|
|
||||||
|
(void)mb_init(); // init mb_bytelen_tab[] to ones
|
||||||
|
eval_init(); // init global variables
|
||||||
|
|
||||||
|
#ifdef __QNXNTO__
|
||||||
|
qnx_init(); // PhAttach() for clipboard, (and gui)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Init the table of Normal mode commands.
|
||||||
|
init_normal_cmds();
|
||||||
|
|
||||||
|
#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
|
||||||
|
// Setup to use the current locale (for ctype() and many other things).
|
||||||
|
// NOTE: Translated messages with encodings other than latin1 will not
|
||||||
|
// work until set_init_1() has been called!
|
||||||
|
init_locale();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Allocate the first window and buffer.
|
||||||
|
// Can't do anything without it, exit when it fails.
|
||||||
|
if (!win_alloc_first()) {
|
||||||
|
mch_exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
init_yank(); // init yank buffers
|
||||||
|
|
||||||
|
alist_init(&global_alist); // Init the argument list to empty.
|
||||||
|
global_alist.id = 0;
|
||||||
|
|
||||||
|
// Set the default values for the options.
|
||||||
|
// NOTE: Non-latin1 translated messages are working only after this,
|
||||||
|
// because this is where "has_mbyte" will be set, which is used by
|
||||||
|
// msg_outtrans_len_attr().
|
||||||
|
// First find out the home directory, needed to expand "~" in options.
|
||||||
|
init_homedir(); // find real value of $HOME
|
||||||
|
set_init_1();
|
||||||
|
TIME_MSG("inits 1");
|
||||||
|
|
||||||
|
set_lang_var(); // set v:lang and v:ctype
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef NO_VIM_MAIN /* skip this for unittests */
|
#ifndef NO_VIM_MAIN /* skip this for unittests */
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
char_u *fname = NULL; /* file name from command line */
|
char_u *fname = NULL; /* file name from command line */
|
||||||
mparm_T params; /* various parameters passed between
|
mparm_T params; /* various parameters passed between
|
||||||
* main() and other functions. */
|
* main() and other functions. */
|
||||||
mch_early_init();
|
time_init();
|
||||||
|
|
||||||
/* Many variables are in "params" so that we can pass them to invoked
|
/* Many variables are in "params" so that we can pass them to invoked
|
||||||
* functions without a lot of arguments. "argc" and "argv" are also
|
* functions without a lot of arguments. "argc" and "argv" are also
|
||||||
@ -157,24 +207,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
init_startuptime(¶ms);
|
init_startuptime(¶ms);
|
||||||
|
|
||||||
(void)mb_init(); /* init mb_bytelen_tab[] to ones */
|
early_init();
|
||||||
eval_init(); /* init global variables */
|
|
||||||
|
|
||||||
#ifdef __QNXNTO__
|
|
||||||
qnx_init(); /* PhAttach() for clipboard, (and gui) */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Init the table of Normal mode commands. */
|
|
||||||
init_normal_cmds();
|
|
||||||
|
|
||||||
#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
|
|
||||||
/*
|
|
||||||
* Setup to use the current locale (for ctype() and many other things).
|
|
||||||
* NOTE: Translated messages with encodings other than latin1 will not
|
|
||||||
* work until set_init_1() has been called!
|
|
||||||
*/
|
|
||||||
init_locale();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if we have an interactive window.
|
* Check if we have an interactive window.
|
||||||
@ -184,32 +217,6 @@ int main(int argc, char **argv)
|
|||||||
*/
|
*/
|
||||||
check_and_set_isatty(¶ms);
|
check_and_set_isatty(¶ms);
|
||||||
|
|
||||||
/*
|
|
||||||
* Allocate the first window and buffer.
|
|
||||||
* Can't do anything without it, exit when it fails.
|
|
||||||
*/
|
|
||||||
if (win_alloc_first() == FAIL)
|
|
||||||
mch_exit(0);
|
|
||||||
|
|
||||||
init_yank(); /* init yank buffers */
|
|
||||||
|
|
||||||
alist_init(&global_alist); /* Init the argument list to empty. */
|
|
||||||
global_alist.id = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the default values for the options.
|
|
||||||
* NOTE: Non-latin1 translated messages are working only after this,
|
|
||||||
* because this is where "has_mbyte" will be set, which is used by
|
|
||||||
* msg_outtrans_len_attr().
|
|
||||||
* First find out the home directory, needed to expand "~" in options.
|
|
||||||
*/
|
|
||||||
init_homedir(); /* find real value of $HOME */
|
|
||||||
set_init_1();
|
|
||||||
TIME_MSG("inits 1");
|
|
||||||
|
|
||||||
set_lang_var(); /* set v:lang and v:ctype */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Figure out the way to work from the command name argv[0].
|
* Figure out the way to work from the command name argv[0].
|
||||||
* "vimdiff" starts diff mode, "rvim" sets "restricted", etc.
|
* "vimdiff" starts diff mode, "rvim" sets "restricted", etc.
|
||||||
@ -252,14 +259,12 @@ int main(int argc, char **argv)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/*
|
// term_init() sets up the terminal (window) for use. This must be
|
||||||
* mch_init() sets up the terminal (window) for use. This must be
|
// done after resetting full_screen, otherwise it may move the cursor
|
||||||
* done after resetting full_screen, otherwise it may move the cursor
|
term_init();
|
||||||
* Note that we may use mch_exit() before mch_init()!
|
|
||||||
*/
|
|
||||||
mch_init();
|
|
||||||
TIME_MSG("shell init");
|
TIME_MSG("shell init");
|
||||||
|
|
||||||
|
event_init();
|
||||||
|
|
||||||
if (!embedded_mode) {
|
if (!embedded_mode) {
|
||||||
// Print a warning if stdout is not a terminal.
|
// Print a warning if stdout is not a terminal.
|
||||||
|
@ -82,47 +82,22 @@ 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.
|
||||||
*/
|
*/
|
||||||
void mch_suspend(void)
|
void mch_suspend(void)
|
||||||
{
|
{
|
||||||
/* BeOS does have SIGTSTP, but it doesn't work. */
|
#if defined(SIGTSTP)
|
||||||
#if defined(SIGTSTP) && !defined(__BEOS__)
|
|
||||||
out_flush(); /* needed to make cursor visible on some systems */
|
out_flush(); /* needed to make cursor visible on some systems */
|
||||||
settmode(TMODE_COOK);
|
settmode(TMODE_COOK);
|
||||||
out_flush(); /* needed to disable mouse on some systems */
|
out_flush(); /* needed to disable mouse on some systems */
|
||||||
|
|
||||||
|
// Note: compiler defines _REENTRANT when given -pthread flag.
|
||||||
# if defined(_REENTRANT) && defined(SIGCONT)
|
# if defined(_REENTRANT) && defined(SIGCONT)
|
||||||
sigcont_received = FALSE;
|
sigcont_received = FALSE;
|
||||||
# endif
|
# endif
|
||||||
kill(0, SIGTSTP); /* send ourselves a STOP signal */
|
uv_kill(0, SIGTSTP); // send ourselves a STOP signal
|
||||||
# if defined(_REENTRANT) && defined(SIGCONT)
|
# if defined(_REENTRANT) && defined(SIGCONT)
|
||||||
/*
|
/*
|
||||||
* Wait for the SIGCONT signal to be handled. It generally happens
|
* Wait for the SIGCONT signal to be handled. It generally happens
|
||||||
@ -154,20 +129,6 @@ void mch_suspend(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void mch_init(void)
|
|
||||||
{
|
|
||||||
Columns = 80;
|
|
||||||
Rows = 24;
|
|
||||||
|
|
||||||
out_flush();
|
|
||||||
|
|
||||||
#ifdef MACOS_CONVERT
|
|
||||||
mac_conv_init();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
event_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
static int get_x11_title(int test_only)
|
static int get_x11_title(int test_only)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -478,12 +439,6 @@ int mch_nodetype(char_u *name)
|
|||||||
return NODE_WRITABLE;
|
return NODE_WRITABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mch_early_init(void)
|
|
||||||
{
|
|
||||||
handle_init();
|
|
||||||
time_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(EXITFREE) || defined(PROTO)
|
#if defined(EXITFREE) || defined(PROTO)
|
||||||
void mch_free_mem(void)
|
void mch_free_mem(void)
|
||||||
{
|
{
|
||||||
|
@ -1010,6 +1010,30 @@ static struct builtin_term builtin_termcaps[] =
|
|||||||
# define DEFAULT_TERM (char_u *)"dumb"
|
# define DEFAULT_TERM (char_u *)"dumb"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/// Sets up the terminal window for use.
|
||||||
|
///
|
||||||
|
/// This must be done after resetting full_screen, otherwise it may move the
|
||||||
|
/// cursor.
|
||||||
|
///
|
||||||
|
/// @remark We may call mch_exit() before calling this.
|
||||||
|
void term_init(void)
|
||||||
|
{
|
||||||
|
Columns = 80;
|
||||||
|
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();
|
||||||
|
|
||||||
|
#ifdef MACOS_CONVERT
|
||||||
|
mac_conv_init();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Term_strings contains currently used terminal output strings.
|
* Term_strings contains currently used terminal output strings.
|
||||||
* It is initialized with the default values by parse_builtin_tcap().
|
* It is initialized with the default values by parse_builtin_tcap().
|
||||||
@ -1822,11 +1846,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);
|
||||||
|
@ -139,26 +139,10 @@ local function vim_init()
|
|||||||
if vim_init_called ~= nil then
|
if vim_init_called ~= nil then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
-- import os_unix.h for mch_early_init(), which initializes some globals
|
local main = cimport('./src/nvim/main.h')
|
||||||
local all = cimport('./src/nvim/os_unix.h',
|
local time = cimport('./src/nvim/os/time.h')
|
||||||
'./src/nvim/misc1.h',
|
time.time_init()
|
||||||
'./src/nvim/eval.h',
|
main.early_init()
|
||||||
'./src/nvim/os_unix.h',
|
|
||||||
'./src/nvim/option.h',
|
|
||||||
'./src/nvim/ex_cmds2.h',
|
|
||||||
'./src/nvim/window.h',
|
|
||||||
'./src/nvim/ops.h',
|
|
||||||
'./src/nvim/normal.h',
|
|
||||||
'./src/nvim/mbyte.h')
|
|
||||||
all.mch_early_init()
|
|
||||||
all.mb_init()
|
|
||||||
all.eval_init()
|
|
||||||
all.init_normal_cmds()
|
|
||||||
all.win_alloc_first()
|
|
||||||
all.init_yank()
|
|
||||||
all.init_homedir()
|
|
||||||
all.set_init_1()
|
|
||||||
all.set_lang_var()
|
|
||||||
vim_init_called = true
|
vim_init_called = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user