10942 lines · 245.8 KB · C
RawDownload
/* vi:set ts=8 sts=4 sw=4: * * VIM - Vi IMproved	by Bram Moolenaar * * Do ":help uganda"  in Vim to read copying and usage conditions. * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ /* * ex_docmd.c: functions for executing an Ex command line. */ #include "vim.h" #ifdef HAVE_FCNTL_H# include <fcntl.h>	    /* for chdir() */#endif static int	quitmore = 0;static int	ex_pressedreturn = FALSE;#ifndef FEAT_PRINTER# define ex_hardcopy	ex_ni#endif #ifdef FEAT_USR_CMDStypedef struct ucmd{    char_u	*uc_name;	/* The command name */    long_u	uc_argt;	/* The argument type */    char_u	*uc_rep;	/* The command's replacement string */    long	uc_def;		/* The default value for a range/count */    scid_T	uc_scriptID;	/* SID where the command was defined */    int		uc_compl;	/* completion type */# if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)    char_u	*uc_compl_arg;	/* completion argument if any */# endif} ucmd_T; #define UC_BUFFER	1	/* -buffer: local to current buffer */ static garray_T ucmds = {0, 0, sizeof(ucmd_T), 4, NULL}; #define USER_CMD(i) (&((ucmd_T *)(ucmds.ga_data))[i])#define USER_CMD_GA(gap, i) (&((ucmd_T *)((gap)->ga_data))[i]) static void do_ucmd __ARGS((exarg_T *eap));static void ex_command __ARGS((exarg_T *eap));static void ex_delcommand __ARGS((exarg_T *eap));# ifdef FEAT_CMDL_COMPLstatic char_u *get_user_command_name __ARGS((int idx));# endif #else# define ex_command	ex_ni# define ex_comclear	ex_ni# define ex_delcommand	ex_ni#endif #ifdef FEAT_EVALstatic char_u	*do_one_cmd __ARGS((char_u **, int, struct condstack *, char_u *(*fgetline)(int, void *, int), void *cookie));#elsestatic char_u	*do_one_cmd __ARGS((char_u **, int, char_u *(*fgetline)(int, void *, int), void *cookie));static int	if_level = 0;		/* depth in :if */#endifstatic char_u	*find_command __ARGS((exarg_T *eap, int *full)); static void	ex_abbreviate __ARGS((exarg_T *eap));static void	ex_map __ARGS((exarg_T *eap));static void	ex_unmap __ARGS((exarg_T *eap));static void	ex_mapclear __ARGS((exarg_T *eap));static void	ex_abclear __ARGS((exarg_T *eap));#ifndef FEAT_MENU# define ex_emenu		ex_ni# define ex_menu		ex_ni# define ex_menutranslate	ex_ni#endif#ifdef FEAT_AUTOCMDstatic void	ex_autocmd __ARGS((exarg_T *eap));static void	ex_doautocmd __ARGS((exarg_T *eap));#else# define ex_autocmd		ex_ni# define ex_doautocmd		ex_ni# define ex_doautoall		ex_ni#endif#ifdef FEAT_LISTCMDSstatic void	ex_bunload __ARGS((exarg_T *eap));static void	ex_buffer __ARGS((exarg_T *eap));static void	ex_bmodified __ARGS((exarg_T *eap));static void	ex_bnext __ARGS((exarg_T *eap));static void	ex_bprevious __ARGS((exarg_T *eap));static void	ex_brewind __ARGS((exarg_T *eap));static void	ex_blast __ARGS((exarg_T *eap));#else# define ex_bunload		ex_ni# define ex_buffer		ex_ni# define ex_bmodified		ex_ni# define ex_bnext		ex_ni# define ex_bprevious		ex_ni# define ex_brewind		ex_ni# define ex_blast		ex_ni# define buflist_list		ex_ni# define ex_checktime		ex_ni#endif#if !defined(FEAT_LISTCMDS) || !defined(FEAT_WINDOWS)# define ex_buffer_all		ex_ni#endifstatic char_u	*getargcmd __ARGS((char_u **));static char_u	*skip_cmd_arg __ARGS((char_u *p, int rembs));static int	getargopt __ARGS((exarg_T *eap));#ifndef FEAT_QUICKFIX# define ex_make		ex_ni# define ex_cbuffer		ex_ni# define ex_cc			ex_ni# define ex_cnext		ex_ni# define ex_cfile		ex_ni# define qf_list		ex_ni# define qf_age			ex_ni# define ex_helpgrep		ex_ni# define ex_vimgrep		ex_ni#endif#if !defined(FEAT_QUICKFIX) || !defined(FEAT_WINDOWS)# define ex_cclose		ex_ni# define ex_copen		ex_ni# define ex_cwindow		ex_ni#endif#if !defined(FEAT_QUICKFIX) || !defined(FEAT_EVAL)# define ex_cexpr		ex_ni#endif static int	check_more __ARGS((int, int));static linenr_T get_address __ARGS((char_u **, int skip, int to_other_file));static void	get_flags __ARGS((exarg_T *eap));#if !defined(FEAT_PERL) || !defined(FEAT_PYTHON) || !defined(FEAT_TCL) \	|| !defined(FEAT_RUBY) || !defined(FEAT_MZSCHEME)static void	ex_script_ni __ARGS((exarg_T *eap));#endifstatic char_u	*invalid_range __ARGS((exarg_T *eap));static void	correct_range __ARGS((exarg_T *eap));#ifdef FEAT_QUICKFIXstatic char_u	*replace_makeprg __ARGS((exarg_T *eap, char_u *p, char_u **cmdlinep));#endifstatic char_u	*repl_cmdline __ARGS((exarg_T *eap, char_u *src, int srclen, char_u *repl, char_u **cmdlinep));static void	ex_highlight __ARGS((exarg_T *eap));static void	ex_colorscheme __ARGS((exarg_T *eap));static void	ex_quit __ARGS((exarg_T *eap));static void	ex_cquit __ARGS((exarg_T *eap));static void	ex_quit_all __ARGS((exarg_T *eap));#ifdef FEAT_WINDOWSstatic void	ex_close __ARGS((exarg_T *eap));static void	ex_win_close __ARGS((int forceit, win_T *win, tabpage_T *tp));static void	ex_only __ARGS((exarg_T *eap));static void	ex_resize __ARGS((exarg_T *eap));static void	ex_stag __ARGS((exarg_T *eap));static void	ex_tabclose __ARGS((exarg_T *eap));static void	ex_tabonly __ARGS((exarg_T *eap));static void	ex_tabnext __ARGS((exarg_T *eap));static void	ex_tabmove __ARGS((exarg_T *eap));static void	ex_tabs __ARGS((exarg_T *eap));#else# define ex_close		ex_ni# define ex_only		ex_ni# define ex_all			ex_ni# define ex_resize		ex_ni# define ex_splitview		ex_ni# define ex_stag		ex_ni# define ex_tabnext		ex_ni# define ex_tabmove		ex_ni# define ex_tabs		ex_ni# define ex_tabclose		ex_ni# define ex_tabonly		ex_ni#endif#if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)static void	ex_pclose __ARGS((exarg_T *eap));static void	ex_ptag __ARGS((exarg_T *eap));static void	ex_pedit __ARGS((exarg_T *eap));#else# define ex_pclose		ex_ni# define ex_ptag		ex_ni# define ex_pedit		ex_ni#endifstatic void	ex_hide __ARGS((exarg_T *eap));static void	ex_stop __ARGS((exarg_T *eap));static void	ex_exit __ARGS((exarg_T *eap));static void	ex_print __ARGS((exarg_T *eap));#ifdef FEAT_BYTEOFFstatic void	ex_goto __ARGS((exarg_T *eap));#else# define ex_goto		ex_ni#endifstatic void	ex_shell __ARGS((exarg_T *eap));static void	ex_preserve __ARGS((exarg_T *eap));static void	ex_recover __ARGS((exarg_T *eap));#ifndef FEAT_LISTCMDS# define ex_argedit		ex_ni# define ex_argadd		ex_ni# define ex_argdelete		ex_ni# define ex_listdo		ex_ni#endifstatic void	ex_mode __ARGS((exarg_T *eap));static void	ex_wrongmodifier __ARGS((exarg_T *eap));static void	ex_find __ARGS((exarg_T *eap));static void	ex_open __ARGS((exarg_T *eap));static void	ex_edit __ARGS((exarg_T *eap));#if !defined(FEAT_GUI) && !defined(FEAT_CLIENTSERVER)# define ex_drop		ex_ni#endif#ifndef FEAT_GUI# define ex_gui			ex_noguistatic void	ex_nogui __ARGS((exarg_T *eap));#endif#if defined(FEAT_GUI_W32) && defined(FEAT_MENU) && defined(FEAT_TEAROFF)static void	ex_tearoff __ARGS((exarg_T *eap));#else# define ex_tearoff		ex_ni#endif#if (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK)) && defined(FEAT_MENU)static void	ex_popup __ARGS((exarg_T *eap));#else# define ex_popup		ex_ni#endif#ifndef FEAT_GUI_MSWIN# define ex_simalt		ex_ni#endif#if !defined(FEAT_GUI_MSWIN) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MOTIF)# define gui_mch_find_dialog	ex_ni# define gui_mch_replace_dialog ex_ni#endif#if !defined(FEAT_GUI_GTK)# define ex_helpfind		ex_ni#endif#ifndef FEAT_CSCOPE# define do_cscope		ex_ni# define do_scscope		ex_ni# define do_cstag		ex_ni#endif#ifndef FEAT_SYN_HL# define ex_syntax		ex_ni#endif#ifndef FEAT_SPELL# define ex_spell		ex_ni# define ex_mkspell		ex_ni# define ex_spelldump		ex_ni# define ex_spellinfo		ex_ni# define ex_spellrepall		ex_ni#endif#ifndef FEAT_MZSCHEME# define ex_mzscheme		ex_script_ni# define ex_mzfile		ex_ni#endif#ifndef FEAT_PERL# define ex_perl		ex_script_ni# define ex_perldo		ex_ni#endif#ifndef FEAT_PYTHON# define ex_python		ex_script_ni# define ex_pyfile		ex_ni#endif#ifndef FEAT_TCL# define ex_tcl			ex_script_ni# define ex_tcldo		ex_ni# define ex_tclfile		ex_ni#endif#ifndef FEAT_RUBY# define ex_ruby		ex_script_ni# define ex_rubydo		ex_ni# define ex_rubyfile		ex_ni#endif#ifndef FEAT_SNIFF# define ex_sniff		ex_ni#endif#ifndef FEAT_KEYMAP# define ex_loadkeymap		ex_ni#endifstatic void	ex_swapname __ARGS((exarg_T *eap));static void	ex_syncbind __ARGS((exarg_T *eap));static void	ex_read __ARGS((exarg_T *eap));static void	ex_cd __ARGS((exarg_T *eap));static void	ex_pwd __ARGS((exarg_T *eap));static void	ex_equal __ARGS((exarg_T *eap));static void	ex_sleep __ARGS((exarg_T *eap));static void	do_exmap __ARGS((exarg_T *eap, int isabbrev));static void	ex_winsize __ARGS((exarg_T *eap));#ifdef FEAT_WINDOWSstatic void	ex_wincmd __ARGS((exarg_T *eap));#else# define ex_wincmd	    ex_ni#endif#if defined(FEAT_GUI) || defined(UNIX) || defined(VMS) || defined(MSWIN)static void	ex_winpos __ARGS((exarg_T *eap));#else# define ex_winpos	    ex_ni#endifstatic void	ex_operators __ARGS((exarg_T *eap));static void	ex_put __ARGS((exarg_T *eap));static void	ex_copymove __ARGS((exarg_T *eap));static void	ex_may_print __ARGS((exarg_T *eap));static void	ex_submagic __ARGS((exarg_T *eap));static void	ex_join __ARGS((exarg_T *eap));static void	ex_at __ARGS((exarg_T *eap));static void	ex_bang __ARGS((exarg_T *eap));static void	ex_undo __ARGS((exarg_T *eap));static void	ex_redo __ARGS((exarg_T *eap));static void	ex_later __ARGS((exarg_T *eap));static void	ex_redir __ARGS((exarg_T *eap));static void	ex_redraw __ARGS((exarg_T *eap));static void	ex_redrawstatus __ARGS((exarg_T *eap));static void	close_redir __ARGS((void));static void	ex_mkrc __ARGS((exarg_T *eap));static void	ex_mark __ARGS((exarg_T *eap));#ifdef FEAT_USR_CMDSstatic char_u	*uc_fun_cmd __ARGS((void));static char_u	*find_ucmd __ARGS((exarg_T *eap, char_u *p, int *full, expand_T *xp, int *compl));#endif#ifdef FEAT_EX_EXTRAstatic void	ex_normal __ARGS((exarg_T *eap));static void	ex_startinsert __ARGS((exarg_T *eap));static void	ex_stopinsert __ARGS((exarg_T *eap));#else# define ex_normal		ex_ni# define ex_align		ex_ni# define ex_retab		ex_ni# define ex_startinsert		ex_ni# define ex_stopinsert		ex_ni# define ex_helptags		ex_ni# define ex_sort		ex_ni#endif#ifdef FEAT_FIND_IDstatic void	ex_checkpath __ARGS((exarg_T *eap));static void	ex_findpat __ARGS((exarg_T *eap));#else# define ex_findpat		ex_ni# define ex_checkpath		ex_ni#endif#if defined(FEAT_FIND_ID) && defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)static void	ex_psearch __ARGS((exarg_T *eap));#else# define ex_psearch		ex_ni#endifstatic void	ex_tag __ARGS((exarg_T *eap));static void	ex_tag_cmd __ARGS((exarg_T *eap, char_u *name));#ifndef FEAT_EVAL# define ex_scriptnames		ex_ni# define ex_finish		ex_ni# define ex_echo		ex_ni# define ex_echohl		ex_ni# define ex_execute		ex_ni# define ex_call		ex_ni# define ex_if			ex_ni# define ex_endif		ex_ni# define ex_else		ex_ni# define ex_while		ex_ni# define ex_for			ex_ni# define ex_continue		ex_ni# define ex_break		ex_ni# define ex_endwhile		ex_ni# define ex_endfor		ex_ni# define ex_throw		ex_ni# define ex_try			ex_ni# define ex_catch		ex_ni# define ex_finally		ex_ni# define ex_endtry		ex_ni# define ex_endfunction		ex_ni# define ex_let			ex_ni# define ex_unlet		ex_ni# define ex_lockvar		ex_ni# define ex_unlockvar		ex_ni# define ex_function		ex_ni# define ex_delfunction		ex_ni# define ex_return		ex_ni#endifstatic char_u	*arg_all __ARGS((void));#ifdef FEAT_SESSIONstatic int	makeopens __ARGS((FILE *fd, char_u *dirnow));static int	put_view __ARGS((FILE *fd, win_T *wp, int add_edit, unsigned *flagp));static void	ex_loadview __ARGS((exarg_T *eap));static char_u	*get_view_file __ARGS((int c));static int	did_lcd;	/* whether ":lcd" was produced for a session */#else# define ex_loadview		ex_ni#endif#ifndef FEAT_EVAL# define ex_compiler		ex_ni#endif#ifdef FEAT_VIMINFOstatic void	ex_viminfo __ARGS((exarg_T *eap));#else# define ex_viminfo		ex_ni#endifstatic void	ex_behave __ARGS((exarg_T *eap));#ifdef FEAT_AUTOCMDstatic void	ex_filetype __ARGS((exarg_T *eap));static void	ex_setfiletype  __ARGS((exarg_T *eap));#else# define ex_filetype		ex_ni# define ex_setfiletype		ex_ni#endif#ifndef FEAT_DIFF# define ex_diffoff		ex_ni# define ex_diffpatch		ex_ni# define ex_diffgetput		ex_ni# define ex_diffsplit		ex_ni# define ex_diffthis		ex_ni# define ex_diffupdate		ex_ni#endifstatic void	ex_digraphs __ARGS((exarg_T *eap));static void	ex_set __ARGS((exarg_T *eap));#if !defined(FEAT_EVAL) || !defined(FEAT_AUTOCMD)# define ex_options		ex_ni#endif#ifdef FEAT_SEARCH_EXTRAstatic void	ex_nohlsearch __ARGS((exarg_T *eap));static void	ex_match __ARGS((exarg_T *eap));#else# define ex_nohlsearch		ex_ni# define ex_match		ex_ni#endif#ifdef FEAT_CRYPTstatic void	ex_X __ARGS((exarg_T *eap));#else# define ex_X			ex_ni#endif#ifdef FEAT_FOLDINGstatic void	ex_fold __ARGS((exarg_T *eap));static void	ex_foldopen __ARGS((exarg_T *eap));static void	ex_folddo __ARGS((exarg_T *eap));#else# define ex_fold		ex_ni# define ex_foldopen		ex_ni# define ex_folddo		ex_ni#endif#if !((defined(HAVE_LOCALE_H) || defined(X_LOCALE)) \	&& (defined(FEAT_GETTEXT) || defined(FEAT_MBYTE)))# define ex_language		ex_ni#endif#ifndef FEAT_SIGNS# define ex_sign		ex_ni#endif#ifndef FEAT_SUN_WORKSHOP# define ex_wsverb		ex_ni#endif#ifndef FEAT_NETBEANS_INTG# define ex_nbkey		ex_ni#endif #ifndef FEAT_EVAL# define ex_debug		ex_ni# define ex_breakadd		ex_ni# define ex_debuggreedy		ex_ni# define ex_breakdel		ex_ni# define ex_breaklist		ex_ni#endif #ifndef FEAT_CMDHIST# define ex_history		ex_ni#endif#ifndef FEAT_JUMPLIST# define ex_jumps		ex_ni# define ex_changes		ex_ni#endif #ifndef FEAT_PROFILE# define ex_profile		ex_ni#endif /* * Declare cmdnames[]. */#define DO_DECLARE_EXCMD#include "ex_cmds.h" /* * Table used to quickly search for a command, based on its first character. */static cmdidx_T cmdidxs[27] ={	CMD_append,	CMD_buffer,	CMD_change,	CMD_delete,	CMD_edit,	CMD_file,	CMD_global,	CMD_help,	CMD_insert,	CMD_join,	CMD_k,	CMD_list,	CMD_move,	CMD_next,	CMD_open,	CMD_print,	CMD_quit,	CMD_read,	CMD_substitute,	CMD_t,	CMD_undo,	CMD_vglobal,	CMD_write,	CMD_xit,

Lines 1–500 of 10942.