diff options
Diffstat (limited to 'src/nvim/ex_cmds2.c')
| -rw-r--r-- | src/nvim/ex_cmds2.c | 240 | 
1 files changed, 63 insertions, 177 deletions
diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c index 33f9477608..8666c7e33a 100644 --- a/src/nvim/ex_cmds2.c +++ b/src/nvim/ex_cmds2.c @@ -12,6 +12,7 @@  #include <string.h>  #include "nvim/ascii.h" +#include "nvim/globals.h"  #include "nvim/vim.h"  #ifdef HAVE_LOCALE_H  # include <locale.h> @@ -135,21 +136,6 @@ void ex_profile(exarg_T *eap)    }  } -void ex_python(exarg_T *eap) -{ -  script_host_execute("python", eap); -} - -void ex_pyfile(exarg_T *eap) -{ -  script_host_execute_file("python", eap); -} - -void ex_pydo(exarg_T *eap) -{ -  script_host_do_range("python", eap); -} -  void ex_ruby(exarg_T *eap)  {    script_host_execute("ruby", eap); @@ -1613,7 +1599,7 @@ void ex_compiler(exarg_T *eap)        if (old_cur_comp != NULL) {          old_cur_comp = vim_strsave(old_cur_comp);        } -      do_cmdline_cmd("command -nargs=* CompilerSet setlocal <args>"); +      do_cmdline_cmd("command -nargs=* -keepscript CompilerSet setlocal <args>");      }      do_unlet(S_LEN("g:current_compiler"), true);      do_unlet(S_LEN("b:current_compiler"), true); @@ -1660,126 +1646,6 @@ void ex_options(exarg_T *eap)    cmd_source((char_u *)SYS_OPTWIN_FILE, NULL);  } -// Detect Python 3 or 2, and initialize 'pyxversion'. -void init_pyxversion(void) -{ -  if (p_pyx == 0) { -    if (eval_has_provider("python3")) { -      p_pyx = 3; -    } else if (eval_has_provider("python")) { -      p_pyx = 2; -    } -  } -} - -// Does a file contain one of the following strings at the beginning of any -// line? -// "#!(any string)python2"  => returns 2 -// "#!(any string)python3"  => returns 3 -// "# requires python 2.x"  => returns 2 -// "# requires python 3.x"  => returns 3 -// otherwise return 0. -static int requires_py_version(char_u *filename) -{ -  FILE *file; -  int requires_py_version = 0; -  int i, lines; - -  lines = (int)p_mls; -  if (lines < 0) { -    lines = 5; -  } - -  file = os_fopen((char *)filename, "r"); -  if (file != NULL) { -    for (i = 0; i < lines; i++) { -      if (vim_fgets(IObuff, IOSIZE, file)) { -        break; -      } -      if (i == 0 && IObuff[0] == '#' && IObuff[1] == '!') { -        // Check shebang. -        if (strstr((char *)IObuff + 2, "python2") != NULL) { -          requires_py_version = 2; -          break; -        } -        if (strstr((char *)IObuff + 2, "python3") != NULL) { -          requires_py_version = 3; -          break; -        } -      } -      IObuff[21] = '\0'; -      if (STRCMP("# requires python 2.x", IObuff) == 0) { -        requires_py_version = 2; -        break; -      } -      if (STRCMP("# requires python 3.x", IObuff) == 0) { -        requires_py_version = 3; -        break; -      } -    } -    fclose(file); -  } -  return requires_py_version; -} - - -// Source a python file using the requested python version. -static void source_pyx_file(exarg_T *eap, char_u *fname) -{ -  exarg_T ex; -  long int v = requires_py_version(fname); - -  init_pyxversion(); -  if (v == 0) { -    // user didn't choose a preference, 'pyx' is used -    v = p_pyx; -  } - -  // now source, if required python version is not supported show -  // unobtrusive message. -  if (eap == NULL) { -    memset(&ex, 0, sizeof(ex)); -  } else { -    ex = *eap; -  } -  ex.arg = fname; -  ex.cmd = (char_u *)(v == 2 ? "pyfile" : "pyfile3"); - -  if (v == 2) { -    ex_pyfile(&ex); -  } else { -    ex_py3file(&ex); -  } -} - -// ":pyxfile {fname}" -void ex_pyxfile(exarg_T *eap) -{ -  source_pyx_file(eap, eap->arg); -} - -// ":pyx" -void ex_pyx(exarg_T *eap) -{ -  init_pyxversion(); -  if (p_pyx == 2) { -    ex_python(eap); -  } else { -    ex_python3(eap); -  } -} - -// ":pyxdo" -void ex_pyxdo(exarg_T *eap) -{ -  init_pyxversion(); -  if (p_pyx == 2) { -    ex_pydo(eap); -  } else { -    ex_pydo3(eap); -  } -} -  /// ":source [{fname}]"  void ex_source(exarg_T *eap)  { @@ -1957,7 +1823,9 @@ static int source_using_linegetter(void *cookie, LineGetter fgetline, const char    sourcing_lnum = 0;    const sctx_T save_current_sctx = current_sctx; -  current_sctx.sc_sid = SID_STR; +  if (current_sctx.sc_sid != SID_LUA) { +    current_sctx.sc_sid = SID_STR; +  }    current_sctx.sc_seq = 0;    current_sctx.sc_lnum = save_sourcing_lnum;    funccal_entry_T entry; @@ -2038,7 +1906,6 @@ int do_source(char *fname, int check_other, int is_vimrc)    char_u *fname_exp;    char_u *firstline = NULL;    int retval = FAIL; -  static int last_current_SID_seq = 0;    int save_debug_break_level = debug_break_level;    scriptitem_T *si = NULL;    proftime_T wait_start; @@ -2086,7 +1953,7 @@ int do_source(char *fname, int check_other, int is_vimrc)    }    if (cookie.fp == NULL) { -    if (p_verbose > 0) { +    if (p_verbose > 1) {        verbose_enter();        if (sourcing_name == NULL) {          smsg(_("could not source \"%s\""), fname); @@ -2162,37 +2029,8 @@ int do_source(char *fname, int check_other, int is_vimrc)    funccal_entry_T funccalp_entry;    save_funccal(&funccalp_entry); -  // Check if this script was sourced before to finds its SID. -  // If it's new, generate a new SID. -  // Always use a new sequence number.    const sctx_T save_current_sctx = current_sctx; -  current_sctx.sc_seq = ++last_current_SID_seq; -  current_sctx.sc_lnum = 0; -  FileID file_id; -  bool file_id_ok = os_fileid((char *)fname_exp, &file_id); -  assert(script_items.ga_len >= 0); -  for (current_sctx.sc_sid = script_items.ga_len; current_sctx.sc_sid > 0; -       current_sctx.sc_sid--) { -    si = &SCRIPT_ITEM(current_sctx.sc_sid); -    // Compare dev/ino when possible, it catches symbolic links. -    // Also compare file names, the inode may change when the file was edited. -    bool file_id_equal = file_id_ok && si->file_id_valid -                         && os_fileid_equal(&(si->file_id), &file_id); -    if (si->sn_name != NULL -        && (file_id_equal || fnamecmp(si->sn_name, fname_exp) == 0)) { -      break; -    } -  } -  if (current_sctx.sc_sid == 0) { -    si = new_script_item(fname_exp, ¤t_sctx.sc_sid); -    fname_exp = vim_strsave(si->sn_name);  // used for autocmd -    if (file_id_ok) { -      si->file_id_valid = true; -      si->file_id = file_id; -    } else { -      si->file_id_valid = false; -    } -  } +  si = get_current_script_id(fname_exp, ¤t_sctx);    if (l_do_profiling == PROF_YES) {      bool forceit = false; @@ -2225,16 +2063,14 @@ int do_source(char *fname, int check_other, int is_vimrc)      firstline = p;    } -  if (path_with_extension((const char *)fname, "lua")) { -    // TODO(shadmansaleh): Properly handle :verbose for lua -    // For now change currennt_sctx before sourcing lua files -    // So verbose doesn't say everything was done in line 1 since we don't know +  if (path_with_extension((const char *)fname_exp, "lua")) {      const sctx_T current_sctx_backup = current_sctx;      const linenr_T sourcing_lnum_backup = sourcing_lnum; +    current_sctx.sc_sid = SID_LUA;      current_sctx.sc_lnum = 0;      sourcing_lnum = 0;      // Source the file as lua -    nlua_exec_file((const char *)fname); +    nlua_exec_file((const char *)fname_exp);      current_sctx = current_sctx_backup;      sourcing_lnum = sourcing_lnum_backup;    } else { @@ -2307,6 +2143,52 @@ theend:  } +/// Check if fname was sourced before to finds its SID. +/// If it's new, generate a new SID. +/// @param[in] fname file path of script +/// @param[out] ret_sctx sctx of this script +scriptitem_T *get_current_script_id(char_u *fname, sctx_T *ret_sctx) +{ +  static int last_current_SID_seq = 0; + +  sctx_T script_sctx = { .sc_seq = ++last_current_SID_seq, +                         .sc_lnum = 0, +                         .sc_sid = 0 }; +  FileID file_id; +  scriptitem_T *si = NULL; + +  bool file_id_ok = os_fileid((char *)fname, &file_id); +  assert(script_items.ga_len >= 0); +  for (script_sctx.sc_sid = script_items.ga_len; script_sctx.sc_sid > 0; +       script_sctx.sc_sid--) { +    si = &SCRIPT_ITEM(script_sctx.sc_sid); +    // Compare dev/ino when possible, it catches symbolic links. +    // Also compare file names, the inode may change when the file was edited. +    bool file_id_equal = file_id_ok && si->file_id_valid +                         && os_fileid_equal(&(si->file_id), &file_id); +    if (si->sn_name != NULL +        && (file_id_equal || fnamecmp(si->sn_name, fname) == 0)) { +      break; +    } +  } +  if (script_sctx.sc_sid == 0) { +    si = new_script_item(vim_strsave(fname), &script_sctx.sc_sid); +    if (file_id_ok) { +      si->file_id_valid = true; +      si->file_id = file_id; +    } else { +      si->file_id_valid = false; +    } +  } +  if (ret_sctx != NULL) { +    *ret_sctx = script_sctx; +  } + +  return si; +} + + +  /// ":scriptnames"  void ex_scriptnames(exarg_T *eap)  { @@ -2323,9 +2205,13 @@ void ex_scriptnames(exarg_T *eap)    for (int i = 1; i <= script_items.ga_len && !got_int; i++) {      if (SCRIPT_ITEM(i).sn_name != NULL) { -      home_replace(NULL, SCRIPT_ITEM(i).sn_name, -                   NameBuff, MAXPATHL, true); -      smsg("%3d: %s", i, NameBuff); +      home_replace(NULL, SCRIPT_ITEM(i).sn_name, NameBuff, MAXPATHL, true); +      vim_snprintf((char *)IObuff, IOSIZE, "%3d: %s", i, NameBuff); +      if (!message_filtered(IObuff)) { +        msg_putchar('\n'); +        msg_outtrans(IObuff); +        line_breakcheck(); +      }      }    }  }  | 
