diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/ex_cmds.c | 9 | ||||
| -rw-r--r-- | src/nvim/main.c | 107 | ||||
| -rw-r--r-- | src/nvim/os_unix.c | 51 | ||||
| -rw-r--r-- | src/nvim/term.c | 50 | ||||
| -rw-r--r-- | src/nvim/ui.c | 2 | 
5 files changed, 116 insertions, 103 deletions
| diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 556e0c01e3..0829049e4d 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -3602,8 +3602,13 @@ void do_sub(exarg_T *eap)        eap->flags = EXFLAG_PRINT;      } -    do_join(eap->line2 - eap->line1 + 1, FALSE, TRUE, FALSE, true); -    sub_nlines = sub_nsubs = eap->line2 - eap->line1 + 1; +    linenr_T joined_lines_count = eap->line2 < curbuf->b_ml.ml_line_count +                                  ? eap->line2 - eap->line1 + 2 +                                  : eap->line2 - eap->line1 + 1; +    if (joined_lines_count >= 2) { +      do_join(joined_lines_count, FALSE, TRUE, FALSE, true); +    } +    sub_nlines = sub_nsubs = joined_lines_count - 1;      do_sub_msg(false);      ex_may_print(eap); diff --git a/src/nvim/main.c b/src/nvim/main.c index 68ae000c35..54077acfe3 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -60,10 +60,13 @@  #include "nvim/os/time.h"  #include "nvim/os/input.h"  #include "nvim/os/os.h" +#include "nvim/os/time.h" +#include "nvim/os/event.h"  #include "nvim/os/signal.h"  #include "nvim/msgpack_rpc/helpers.h"  #include "nvim/api/private/defs.h"  #include "nvim/api/private/helpers.h" +#include "nvim/api/private/handle.h"  /* Maximum number of commands from + or -c arguments. */  #define MAX_ARG_CMDS 10 @@ -142,13 +145,60 @@ static char *(main_errors[]) =  #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 */  int main(int argc, char **argv)  {    char_u      *fname = NULL;            /* file name from command line */    mparm_T params;                       /* various parameters passed between                                           * main() and other functions. */ -  mch_early_init(); +  time_init();    /* Many variables are in "params" so that we can pass them to invoked     * functions without a lot of arguments.  "argc" and "argv" are also @@ -157,24 +207,7 @@ int main(int argc, char **argv)    init_startuptime(¶ms); -  (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 +  early_init();    /*     * Check if we have an interactive window. @@ -185,32 +218,6 @@ int main(int argc, char **argv)    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].     * "vimdiff" starts diff mode, "rvim" sets "restricted", etc.     */ @@ -252,14 +259,12 @@ int main(int argc, char **argv)     */ -  /* -   * mch_init() sets up the terminal (window) for use.  This must be -   * done after resetting full_screen, otherwise it may move the cursor -   * Note that we may use mch_exit() before mch_init()! -   */ -  mch_init(); +  // term_init() sets up the terminal (window) for use.  This must be +  // done after resetting full_screen, otherwise it may move the cursor +  term_init();    TIME_MSG("shell init"); +  event_init();    if (!embedded_mode) {      // Print a warning if stdout is not a terminal. diff --git a/src/nvim/os_unix.c b/src/nvim/os_unix.c index a415b541a8..8784559b50 100644 --- a/src/nvim/os_unix.c +++ b/src/nvim/os_unix.c @@ -81,47 +81,22 @@ static int did_set_title = FALSE;  static char_u   *oldicon = NULL;  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,   * otherwise fake it by starting a new shell.   */  void mch_suspend(void)  { -  /* BeOS does have SIGTSTP, but it doesn't work. */ -#if defined(SIGTSTP) && !defined(__BEOS__) +#if defined(SIGTSTP)    out_flush();              /* needed to make cursor visible on some systems */    settmode(TMODE_COOK);    out_flush();              /* needed to disable mouse on some systems */ - +  // Note: compiler defines _REENTRANT when given -pthread flag.  # if defined(_REENTRANT) && defined(SIGCONT)    sigcont_received = FALSE;  # endif -  kill(0, SIGTSTP);         /* send ourselves a STOP signal */ +  uv_kill(0, SIGTSTP);         // send ourselves a STOP signal  # if defined(_REENTRANT) && defined(SIGCONT)    /*     * Wait for the SIGCONT signal to be handled. It generally happens @@ -153,20 +128,6 @@ void mch_suspend(void)  #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)  {    return FALSE; @@ -477,12 +438,6 @@ int mch_nodetype(char_u *name)    return NODE_WRITABLE;  } -void mch_early_init(void) -{ -  handle_init(); -  time_init(); -} -  #if defined(EXITFREE) || defined(PROTO)  void mch_free_mem(void)  { diff --git a/src/nvim/term.c b/src/nvim/term.c index 601e98f562..9da7e11b96 100644 --- a/src/nvim/term.c +++ b/src/nvim/term.c @@ -1010,6 +1010,30 @@ static struct builtin_term builtin_termcaps[] =  # define DEFAULT_TERM   (char_u *)"dumb"  #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.   * 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);  } +/// 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"   */  #  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 int out_pos = 0;                 /* number of chars in out_buf */ diff --git a/src/nvim/ui.c b/src/nvim/ui.c index 526cc3e47e..eab6251288 100644 --- a/src/nvim/ui.c +++ b/src/nvim/ui.c @@ -55,7 +55,7 @@ void ui_write(char_u *s, int len)          s = tofree;      } -    mch_write(s, len); +    term_write(s, len);      if (output_conv.vc_type != CONV_NONE)        free(tofree); | 
