📄 eval.c
字号:
VAR retvar;
{
#if defined(GUI_DIALOG) || defined(CON_DIALOG)
char_u *message;
char_u *buttons;
char_u buf[NUMBUFLEN];
char_u buf2[NUMBUFLEN];
int def = 0;
int type = VIM_GENERIC;
int c;
message = get_var_string(&argvars[0]);
buttons = get_var_string_buf(&argvars[1], buf);
if (argvars[2].var_type != VAR_UNKNOWN)
{
def = get_var_number(&argvars[2]);
if (argvars[3].var_type != VAR_UNKNOWN)
{
/* avoid that TO_UPPER calls get_var_string_buf() twice */
c = *get_var_string_buf(&argvars[3], buf2);
switch (TO_UPPER(c))
{
case 'E': type = VIM_ERROR; break;
case 'Q': type = VIM_QUESTION; break;
case 'I': type = VIM_INFO; break;
case 'W': type = VIM_WARNING; break;
case 'G': type = VIM_GENERIC; break;
}
}
}
retvar->var_val.var_number = do_dialog(type, NULL, message, buttons, def);
#else
retvar->var_val.var_number = 0;
#endif
}
/*
* "browse(save, title, initdir, default)" function
*/
/* ARGSUSED */
static void
f_browse(argvars, retvar)
VAR argvars;
VAR retvar;
{
#ifdef USE_BROWSE
int save;
char_u *title;
char_u *initdir;
char_u *defname;
char_u buf[NUMBUFLEN];
char_u buf2[NUMBUFLEN];
save = get_var_number(&argvars[0]);
title = get_var_string(&argvars[1]);
initdir = get_var_string_buf(&argvars[2], buf);
defname = get_var_string_buf(&argvars[3], buf2);
retvar->var_val.var_string =
do_browse(save, title, defname, NULL, initdir, NULL, curbuf);
#else
retvar->var_val.var_string = NULL;
#endif
retvar->var_type = VAR_STRING;
}
/*
* "delete()" function
*/
static void
f_delete(argvars, retvar)
VAR argvars;
VAR retvar;
{
retvar->var_val.var_number = mch_remove(get_var_string(&argvars[0]));
}
/*
* "escape({string}, {chars})" function
*/
static void
f_escape(argvars, retvar)
VAR argvars;
VAR retvar;
{
char_u buf[NUMBUFLEN];
retvar->var_val.var_string =
vim_strsave_escaped(get_var_string(&argvars[0]),
get_var_string_buf(&argvars[1], buf));
retvar->var_type = VAR_STRING;
}
/*
* "exists()" function
*/
static void
f_exists(argvars, retvar)
VAR argvars;
VAR retvar;
{
char_u *p;
char_u *name;
int n = FALSE;
int len;
p = get_var_string(&argvars[0]);
if (*p == '$') /* environment variable */
n = (get_env_string(&p) != NULL);
else if (*p == '&') /* option */
n = (get_option_var(&p, NULL) == OK);
else /* internal variable */
{
name = p;
len = get_id_len(&p);
if (len != 0)
n = (get_var_var(name, len, NULL) == OK);
}
retvar->var_val.var_number = n;
}
/*
* "expand()" function
*/
static void
f_expand(argvars, retvar)
VAR argvars;
VAR retvar;
{
char_u *s;
int len;
char_u *errormsg;
retvar->var_type = VAR_STRING;
s = get_var_string(&argvars[0]);
if (*s == '%' || *s == '#' || *s == '<')
retvar->var_val.var_string = eval_vars(s, &len, NULL, &errormsg, s);
else
retvar->var_val.var_string = ExpandOne(s, NULL, WILD_USE_NL, WILD_ALL);
}
/*
* "filereadable()" function
*/
static void
f_filereadable(argvars, retvar)
VAR argvars;
VAR retvar;
{
FILE *fd;
char_u *p;
int n;
p = get_var_string(&argvars[0]);
if (*p && !mch_isdir(p) && (fd = fopen((char *)p, "r")) != NULL)
{
n = TRUE;
fclose(fd);
}
else
n = FALSE;
retvar->var_val.var_number = n;
}
/*
* "fnamemodify({fname}, {mods})" function
*/
static void
f_fnamemodify(argvars, retvar)
VAR argvars;
VAR retvar;
{
char_u *fname;
char_u *mods;
int usedlen = 0;
int len;
char_u *fbuf = NULL;
char_u buf[NUMBUFLEN];
fname = get_var_string(&argvars[0]);
mods = get_var_string_buf(&argvars[1], buf);
len = STRLEN(fname);
(void)modify_fname(mods, &usedlen, &fname, &fbuf, &len);
retvar->var_type = VAR_STRING;
if (fname == NULL)
retvar->var_val.var_string = NULL;
else
retvar->var_val.var_string = vim_strnsave(fname, len);
vim_free(fbuf);
}
/*
* "getcwd()" function
*/
/*ARGSUSED*/
static void
f_getcwd(argvars, retvar)
VAR argvars;
VAR retvar;
{
char_u cwd[MAXPATHL];
retvar->var_type = VAR_STRING;
if (mch_dirname(cwd, MAXPATHL) == FAIL)
retvar->var_val.var_string = NULL;
else
retvar->var_val.var_string = vim_strsave(cwd);
}
/*
* "getline(lnum)" function
*/
static void
f_getline(argvars, retvar)
VAR argvars;
VAR retvar;
{
linenr_t lnum;
char_u *p;
lnum = get_var_number(&argvars[0]);
if (lnum == 0) /* no valid number, try using line() */
{
f_line(argvars, retvar);
lnum = retvar->var_val.var_number;
clear_var(retvar);
}
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
p = ml_get(lnum);
else
p = (char_u *)"";
retvar->var_type = VAR_STRING;
retvar->var_val.var_string = vim_strsave(p);
}
/*
* "has()" function
*/
static void
f_has(argvars, retvar)
VAR argvars;
VAR retvar;
{
int i;
char_u *name;
int n = FALSE;
static char *(has_list[]) =
{
#ifdef AMIGA
"amiga",
# ifndef NO_ARP
"arp",
# endif
#endif
#ifdef __BEOS__
"beos",
#endif
#ifdef MSDOS
# ifdef DJGPP
"dos32",
# else
"dos16",
# endif
#endif
#ifdef macintosh
"mac",
#endif
#ifdef RISCOS
"riscos",
#endif
#ifdef UNIX
"unix",
#endif
#ifdef VMS
"vms",
#endif
#ifdef WIN32
"win32",
#endif
#ifndef CASE_INSENSITIVE_FILENAME
"fname_case",
#endif
#ifdef AUTOCMD
"autocmd",
#endif
#if defined(SOME_BUILTIN_TCAPS) || defined(ALL_BUILTIN_TCAPS)
"builtin_terms",
# ifdef ALL_BUILTIN_TCAPS
"all_builtin_terms",
# endif
#endif
#ifdef CINDENT
"cindent",
#endif
#ifdef USE_CSCOPE
"cscope",
#endif
#ifdef DEBUG
"debug",
#endif
#ifdef CON_DIALOG
"dialog_con",
#endif
#ifdef GUI_DIALOG
"dialog_gui",
#endif
#ifdef DIGRAPHS
"digraphs",
#endif
#ifdef EMACS_TAGS
"emacs_tags",
#endif
"eval", /* always present, of course! */
#ifdef EX_EXTRA
"ex_extra",
#endif
#ifdef EXTRA_SEARCH
"extra_search",
#endif
#ifdef FKMAP
"farsi",
#endif
#ifdef FILE_IN_PATH
"file_in_path",
#endif
#ifdef WANT_FILETYPE
"filetype",
#endif
#ifdef FIND_IN_PATH
"find_in_path",
#endif
#if !defined(USE_SYSTEM) && defined(UNIX)
"fork",
#endif
#ifdef USE_GUI
"gui",
#endif
#ifdef USE_GUI_ATHENA
"gui_athena",
#endif
#ifdef USE_GUI_BEOS
"gui_beos",
#endif
#ifdef USE_GUI_MAC
"gui_mac",
#endif
#ifdef USE_GUI_MOTIF
"gui_motif",
#endif
#ifdef USE_GUI_WIN32
"gui_win32",
#endif
#ifdef INSERT_EXPAND
"insert_expand",
#endif
#ifdef HAVE_LANGMAP
"langmap",
#endif
#ifdef LISPINDENT
"lispindent",
#endif
#ifdef WANT_MODIFY_FNAME
"modify_fname",
#endif
#ifdef USE_MOUSE
"mouse",
#endif
#ifdef UNIX
# ifdef DEC_MOUSE
"mouse_dec",
# endif
# ifdef NETTERM_MOUSE
"mouse_netterm",
# endif
# ifdef XTERM_MOUSE
"mouse_xterm",
# endif
#endif
#ifdef MULTI_BYTE
"multi_byte",
#endif
#ifdef MULTI_BYTE_IME
"multi_byte_ime",
#endif
#ifdef HAVE_OLE
"ole",
#endif
#ifdef HAVE_PERL_INTERP
"perl",
#endif
#ifdef HAVE_PYTHON
"python",
#endif
#ifdef QUICKFIX
"quickfix",
#endif
#ifdef RIGHTLEFT
"rightleft",
#endif
#ifdef SHOWCMD
"showcmd",
#endif
#ifdef SMARTINDENT
"smartindent",
#endif
#ifdef SYNTAX_HL
"syntax",
#endif
#if defined(USE_SYSTEM) || !defined(UNIX)
"system",
#endif
#ifdef BINARY_TAGS
"tag_binary",
#endif
#ifdef OLD_STATIC_TAGS
"tag_old_static",
#endif
#ifdef TAG_ANY_WHITE
"tag_any_white",
#endif
#ifdef HAVE_TCL
"tcl",
#endif
#ifdef TERMINFO
"terminfo",
#endif
#ifdef TEXT_OBJECTS
"textobjects",
#endif
#ifdef HAVE_TGETENT
"tgetent",
#endif
#ifdef USER_COMMANDS
"user-commands",
#endif
#ifdef VIMINFO
"viminfo",
#endif
#ifdef WILDIGNORE
"wildignore",
#endif
#ifdef WRITEBACKUP
"writebackup",
#endif
#ifdef SAVE_XTERM_SCREEN
"xterm_save",
#endif
#if defined(UNIX) && defined(WANT_X11) && defined(HAVE_X11)
"X11",
#endif
NULL
};
name = get_var_string(&argvars[0]);
for (i = 0; has_list[i] != NULL; ++i)
if (STRICMP(name, has_list[i]) == 0)
{
n = TRUE;
break;
}
if (n == FALSE)
{
#ifdef USE_GUI
if (STRICMP(name, "gui_running") == 0)
{
n = (gui.in_use || gui.starting);
}
# ifdef USE_GUI_WIN32
else if (STRICMP(name, "gui_win32s") == 0)
{
n = gui_is_win32s();
}
# endif
#ifdef USE_BROWSE
else if (STRICMP(name, "browse") == 0)
{
n = gui.in_use; /* gui_mch_browse() works when GUI is running */
}
#endif
#endif
#ifdef SYNTAX_HL
# ifdef USE_GUI
else
# endif
if (STRICMP(name, "syntax_items") == 0)
{
n = syntax_present(curbuf);
}
#endif
}
retvar->var_val.var_number = n;
}
/*
* "highlight_exists()" function
*/
static void
f_hlexists(argvars, retvar)
VAR argvars;
VAR retvar;
{
retvar->var_val.var_number = highlight_exists(get_var_string(&argvars[0]));
}
/*
* "highlightID(name)" function
*/
static void
f_hlID(argvars, retvar)
VAR argvars;
VAR retvar;
{
retvar->var_val.var_number = syn_name2id(get_var_string(&argvars[0]));
}
/*
* "hostname()" function
*/
/*ARGSUSED*/
static void
f_hostname(argvars, retvar)
VAR argvars;
VAR retvar;
{
char_u hostname[256];
mch_get_host_name(hostname, 256);
retvar->var_type = VAR_STRING;
retvar->var_val.var_string = vim_strsave(hostname);
}
/*
* "input()" function
*/
static void
f_input(argvars, retvar)
VAR argvars;
VAR retvar;
{
char_u *prompt = get_var_string(&argvars[0]);
char_u *p;
int c;
retvar->var_type = VAR_STRING;
#ifdef NO_CONSOLE
/*
* While starting up, there is no place to enter text.
*/
if (!gui.in_use || gui.starting)
{
retvar->var_val.var_string = NULL;
return;
}
#endif
if (prompt != NULL)
{
/* Only the part of the message after the last NL is considered as
* prompt for the command line */
p = vim_strrchr(prompt, '\n');
if (p == NULL)
p = prompt;
else
{
++p;
c = *p;
*p = NUL;
msg_start();
msg_clr_eos();
msg_puts_attr(prompt, echo_attr);
msg_didout = FALSE;
*p = c;
}
cmdline_prompt(p, echo_attr);
cmdline_row = msg_row;
}
retvar->var_val.var_string = getexline('@', NULL, 0);
cmdline_prompt(NULL, 0);
/* since the user typed this, no need to wait for return */
need_wait_return = FALSE;
msg_didout = FALSE;
dont_wait_return = TRUE;
}
/*
* "isdirectory()" function
*/
static void
f_isdirectory(argvars, retvar)
VAR argvars;
VAR retvar;
{
retvar->var_val.var_number = mch_isdir(get_var_string(&argvars[0]));
}
/*
* "last_buffer_nr()" function.
*/
/*ARGSUSED*/
static void
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -