|--remote-expr|.
To get the full path use: >
echo exepath(v:progpath)
-< NOTE: This does not work when the command is a relative path
- and the current directory has changed.
+< If the path is relative it will be expanded to the full path,
+ so that it still works after `:cd`. Thus starting "./vim"
+ results in "/home/user/path/to/vim/src/vim".
+ On MS-Windows the executable may be called "vim.exe", but the
+ ".exe" is not added to v:progpath.
Read-only.
*v:register* *register-variable*
# if defined(HAS_SWAP_EXISTS_ACTION)
static void check_swap_exists_action(void);
# endif
+# ifdef FEAT_EVAL
+static void set_progpath(char_u *argv0);
+# endif
# if defined(FEAT_CLIENTSERVER) || defined(PROTO)
static void exec_on_server(mparm_T *parmp);
static void prepare_server(mparm_T *parmp);
#ifdef FEAT_EVAL
set_vim_var_string(VV_PROGNAME, initstr, -1);
- set_vim_var_string(VV_PROGPATH, (char_u *)parmp->argv[0], -1);
+ set_progpath((char_u *)parmp->argv[0]);
#endif
if (TOLOWER_ASC(initstr[0]) == 'r')
}
#endif
-#endif
+#endif /* NO_VIM_MAIN */
#if defined(STARTUPTIME) || defined(PROTO)
static void time_diff(struct timeval *then, struct timeval *now);
#endif
+#ifndef NO_VIM_MAIN
+ static void
+set_progpath(char_u *argv0)
+{
+ char_u *val = argv0;
+ char_u buf[MAXPATHL];
+
+ /* A relative path containing a "/" will become invalid when using ":cd",
+ * turn it into a full path.
+ * On MS-Windows "vim.exe" is found in the current directory, thus also do
+ * it when there is no path and the file exists. */
+ if ( !mch_isFullName(argv0)
+# ifdef WIN32
+ && mch_can_exe(argv0, NULL, TRUE)
+# else
+ && gettail(argv0) != argv0
+# endif
+ && vim_FullName(argv0, buf, MAXPATHL, TRUE) != FAIL)
+ val = buf;
+ set_vim_var_string(VV_PROGPATH, val, -1);
+}
+
+#endif /* NO_VIM_MAIN */
+
#if (defined(FEAT_CLIENTSERVER) && !defined(NO_VIM_MAIN)) || defined(PROTO)
/*
endif
call delete('Xtestout')
endfunc
+
+func Test_progpath()
+ " Tests normally run with "./vim" or "../vim", these must have been expanded
+ " to a full path.
+ if has('unix')
+ call assert_equal('/', v:progpath[0])
+ elseif has('win32')
+ call assert_equal(':', v:progpath[1])
+ call assert_match('[/\\]', v:progpath[2])
+ endif
+
+ " Only expect "vim" to appear in v:progname.
+ call assert_match('vim\c', v:progname)
+endfunc