1
0
forked from aniani/vim

patch 8.1.1785: map functionality mixed with character input

Problem:    Map functionality mixed with character input.
Solution:   Move the map functionality to a separate file. (Yegappan
            Lakshmanan, closes #4740)  Graduate the +localmap feature.
This commit is contained in:
Bram Moolenaar
2019-08-01 14:28:24 +02:00
parent 3f9bdeb2a5
commit b66bab381c
18 changed files with 2343 additions and 2427 deletions

View File

@@ -60,6 +60,7 @@ SRC_ALL = \
src/keymap.h \
src/macros.h \
src/main.c \
src/map.c \
src/mark.c \
src/mbyte.c \
src/memfile.c \
@@ -199,6 +200,7 @@ SRC_ALL = \
src/proto/json.pro \
src/proto/list.pro \
src/proto/main.pro \
src/proto/map.pro \
src/proto/mark.pro \
src/proto/mbyte.pro \
src/proto/memfile.pro \

View File

@@ -736,6 +736,7 @@ OBJ = \
$(OUTDIR)/json.o \
$(OUTDIR)/list.o \
$(OUTDIR)/main.o \
$(OUTDIR)/map.o \
$(OUTDIR)/mark.o \
$(OUTDIR)/memfile.o \
$(OUTDIR)/memline.o \

View File

@@ -56,6 +56,7 @@ SRC = arabic.c \
json.c \
list.c \
main.c \
map.c \
mark.c \
mbyte.c \
memfile.c \

View File

@@ -745,6 +745,7 @@ OBJ = \
$(OUTDIR)\json.obj \
$(OUTDIR)\list.obj \
$(OUTDIR)\main.obj \
$(OUTDIR)\map.obj \
$(OUTDIR)\mark.obj \
$(OUTDIR)\mbyte.obj \
$(OUTDIR)\memfile.obj \
@@ -1556,6 +1557,8 @@ $(OUTDIR)/list.obj: $(OUTDIR) list.c $(INCL)
$(OUTDIR)/main.obj: $(OUTDIR) main.c $(INCL) $(CUI_INCL)
$(OUTDIR)/map.obj: $(OUTDIR) map.c $(INCL)
$(OUTDIR)/mark.obj: $(OUTDIR) mark.c $(INCL)
$(OUTDIR)/memfile.obj: $(OUTDIR) memfile.c $(INCL)
@@ -1769,6 +1772,7 @@ proto.h: \
proto/json.pro \
proto/list.pro \
proto/main.pro \
proto/map.pro \
proto/mark.pro \
proto/memfile.pro \
proto/memline.pro \

View File

@@ -312,8 +312,8 @@ SRC = arabic.c autocmd.c beval.c blob.c blowfish.c buffer.c change.c charset.c \
evalfunc.c ex_cmds.c ex_cmds2.c ex_docmd.c ex_eval.c ex_getln.c \
if_cscope.c if_xcmdsrv.c fileio.c findfile.c fold.c getchar.c \
hardcopy.c hashtab.c highlight.c indent.c insexpand.c json.c list.c \
main.c mark.c menu.c mbyte.c memfile.c memline.c message.c misc1.c \
misc2.c move.c normal.c ops.c option.c popupmnu.c popupwin.c \
main.c map.c mark.c menu.c mbyte.c memfile.c memline.c message.c \
misc1.c misc2.c move.c normal.c ops.c option.c popupmnu.c popupwin.c \
profiler.c quickfix.c regexp.c search.c session.c sha256.c sign.c \
spell.c spellfile.c syntax.c tag.c term.c termlib.c testing.c \
textprop.c ui.c undo.c usercmd.c userfunc.c version.c viminfo.c \
@@ -327,8 +327,8 @@ OBJ = arabic.obj autocmd.obj beval.obj blob.obj blowfish.obj buffer.obj change.
ex_docmd.obj ex_eval.obj ex_getln.obj if_cscope.obj if_xcmdsrv.obj \
fileio.obj findfile.obj fold.obj getchar.obj hardcopy.obj hashtab.obj \
highlight.obj indent.obj insexpand.obj json.obj list.obj main.obj \
mark.obj menu.obj memfile.obj memline.obj message.obj misc1.obj \
misc2.obj move.obj mbyte.obj normal.obj ops.obj option.obj \
map.obj mark.obj menu.obj memfile.obj memline.obj message.obj \
misc1.obj misc2.obj move.obj mbyte.obj normal.obj ops.obj option.obj \
popupmnu.obj popupwin.obj profiler.obj quickfix.obj regexp.obj \
search.obj session.obj sha256.obj sign.obj spell.obj spellfile.obj \
syntax.obj tag.obj term.obj termlib.obj testing.obj textprop.obj \
@@ -630,6 +630,9 @@ main.obj : main.c vim.h [.auto]config.h feature.h os_unix.h \
ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
[.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
arabic.c
map.obj : map.c vim.h [.auto]config.h feature.h os_unix.h \
ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
[.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
mark.obj : mark.c vim.h [.auto]config.h feature.h os_unix.h \
ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
[.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \

View File

@@ -1612,6 +1612,7 @@ BASIC_SRC = \
json.c \
list.c \
main.c \
map.c \
mark.c \
memfile.c \
memline.c \
@@ -1735,6 +1736,7 @@ OBJ_COMMON = \
objects/indent.o \
objects/insexpand.o \
objects/list.o \
objects/map.o \
objects/mark.o \
objects/memline.o \
objects/menu.o \
@@ -1879,6 +1881,7 @@ PRO_AUTO = \
json.pro \
list.pro \
main.pro \
map.pro \
mark.pro \
mbyte.pro \
memfile.pro \
@@ -3169,6 +3172,9 @@ objects/list.o: list.c
objects/main.o: main.c
$(CCC) -o $@ main.c
objects/map.o: map.c
$(CCC) -o $@ map.c
objects/mark.o: mark.c
$(CCC) -o $@ mark.c
@@ -3604,6 +3610,10 @@ objects/main.o: main.c vim.h protodef.h auto/config.h feature.h os_unix.h \
auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
proto.h globals.h
objects/map.o: map.c vim.h protodef.h auto/config.h feature.h os_unix.h \
auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
proto.h globals.h
objects/mark.o: mark.c vim.h protodef.h auto/config.h feature.h os_unix.h \
auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \

View File

@@ -38,6 +38,7 @@ highlight.c | syntax highlighting
indent.c | C and Lisp indentation
insexpand.c | Insert mode completion
mark.c | marks
map.c | mapping and abbreviations
mbyte.c | multi-byte character handling
memfile.c | storing lines for buffers in a swapfile
memline.c | storing lines for buffers in memory

View File

@@ -951,10 +951,8 @@ free_buffer_stuff(
#ifdef FEAT_NETBEANS_INTG
netbeans_file_killed(buf);
#endif
#ifdef FEAT_LOCALMAP
map_clear_int(buf, MAP_ALL_MODES, TRUE, FALSE); /* clear local mappings */
map_clear_int(buf, MAP_ALL_MODES, TRUE, TRUE); /* clear local abbrevs */
#endif
VIM_CLEAR(buf->b_start_fenc);
}

View File

@@ -6189,9 +6189,7 @@ f_has(typval_T *argvars, typval_T *rettv)
"lispindent",
#endif
"listcmds",
#ifdef FEAT_LOCALMAP
"localmap",
#endif
#ifdef FEAT_LUA
# ifndef DYNAMIC_LUA
"lua",
@@ -7396,84 +7394,6 @@ f_localtime(typval_T *argvars UNUSED, typval_T *rettv)
rettv->vval.v_number = (varnumber_T)time(NULL);
}
static void
get_maparg(typval_T *argvars, typval_T *rettv, int exact)
{
char_u *keys;
char_u *which;
char_u buf[NUMBUFLEN];
char_u *keys_buf = NULL;
char_u *rhs;
int mode;
int abbr = FALSE;
int get_dict = FALSE;
mapblock_T *mp;
int buffer_local;
/* return empty string for failure */
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
keys = tv_get_string(&argvars[0]);
if (*keys == NUL)
return;
if (argvars[1].v_type != VAR_UNKNOWN)
{
which = tv_get_string_buf_chk(&argvars[1], buf);
if (argvars[2].v_type != VAR_UNKNOWN)
{
abbr = (int)tv_get_number(&argvars[2]);
if (argvars[3].v_type != VAR_UNKNOWN)
get_dict = (int)tv_get_number(&argvars[3]);
}
}
else
which = (char_u *)"";
if (which == NULL)
return;
mode = get_map_mode(&which, 0);
keys = replace_termcodes(keys, &keys_buf, TRUE, TRUE, FALSE);
rhs = check_map(keys, mode, exact, FALSE, abbr, &mp, &buffer_local);
vim_free(keys_buf);
if (!get_dict)
{
/* Return a string. */
if (rhs != NULL)
{
if (*rhs == NUL)
rettv->vval.v_string = vim_strsave((char_u *)"<Nop>");
else
rettv->vval.v_string = str2special_save(rhs, FALSE);
}
}
else if (rettv_dict_alloc(rettv) != FAIL && rhs != NULL)
{
/* Return a dictionary. */
char_u *lhs = str2special_save(mp->m_keys, TRUE);
char_u *mapmode = map_mode_to_chars(mp->m_mode);
dict_T *dict = rettv->vval.v_dict;
dict_add_string(dict, "lhs", lhs);
dict_add_string(dict, "rhs", mp->m_orig_str);
dict_add_number(dict, "noremap", mp->m_noremap ? 1L : 0L);
dict_add_number(dict, "expr", mp->m_expr ? 1L : 0L);
dict_add_number(dict, "silent", mp->m_silent ? 1L : 0L);
dict_add_number(dict, "sid", (long)mp->m_script_ctx.sc_sid);
dict_add_number(dict, "lnum", (long)mp->m_script_ctx.sc_lnum);
dict_add_number(dict, "buffer", (long)buffer_local);
dict_add_number(dict, "nowait", mp->m_nowait ? 1L : 0L);
dict_add_string(dict, "mode", mapmode);
vim_free(lhs);
vim_free(mapmode);
}
}
#ifdef FEAT_FLOAT
/*
* "log()" function

View File

@@ -29,11 +29,6 @@ static void free_cmdmod(void);
static void append_command(char_u *cmd);
static char_u *find_command(exarg_T *eap, int *full);
static void ex_abbreviate(exarg_T *eap);
static void ex_map(exarg_T *eap);
static void ex_unmap(exarg_T *eap);
static void ex_mapclear(exarg_T *eap);
static void ex_abclear(exarg_T *eap);
#ifndef FEAT_MENU
# define ex_emenu ex_ni
# define ex_menu ex_ni
@@ -231,7 +226,6 @@ static void ex_read(exarg_T *eap);
static void ex_pwd(exarg_T *eap);
static void ex_equal(exarg_T *eap);
static void ex_sleep(exarg_T *eap);
static void do_exmap(exarg_T *eap, int isabbrev);
static void ex_winsize(exarg_T *eap);
static void ex_wincmd(exarg_T *eap);
#if defined(FEAT_GUI) || defined(UNIX) || defined(VMS) || defined(MSWIN)
@@ -5347,61 +5341,6 @@ getargopt(exarg_T *eap)
return OK;
}
/*
* ":abbreviate" and friends.
*/
static void
ex_abbreviate(exarg_T *eap)
{
do_exmap(eap, TRUE); /* almost the same as mapping */
}
/*
* ":map" and friends.
*/
static void
ex_map(exarg_T *eap)
{
/*
* If we are sourcing .exrc or .vimrc in current directory we
* print the mappings for security reasons.
*/
if (secure)
{
secure = 2;
msg_outtrans(eap->cmd);
msg_putchar('\n');
}
do_exmap(eap, FALSE);
}
/*
* ":unmap" and friends.
*/
static void
ex_unmap(exarg_T *eap)
{
do_exmap(eap, FALSE);
}
/*
* ":mapclear" and friends.
*/
static void
ex_mapclear(exarg_T *eap)
{
map_clear(eap->cmd, eap->arg, eap->forceit, FALSE);
}
/*
* ":abclear" and friends.
*/
static void
ex_abclear(exarg_T *eap)
{
map_clear(eap->cmd, eap->arg, TRUE, TRUE);
}
static void
ex_autocmd(exarg_T *eap)
{
@@ -7782,25 +7721,6 @@ do_sleep(long msec)
(void)vpeekc();
}
static void
do_exmap(exarg_T *eap, int isabbrev)
{
int mode;
char_u *cmdp;
cmdp = eap->cmd;
mode = get_map_mode(&cmdp, eap->forceit || isabbrev);
switch (do_map((*cmdp == 'n') ? 2 : (*cmdp == 'u'),
eap->arg, mode, isabbrev))
{
case 1: emsg(_(e_invarg));
break;
case 2: emsg((isabbrev ? _(e_noabbr) : _(e_nomap)));
break;
}
}
/*
* ":winsize" command (obsolete).
*/

View File

@@ -166,10 +166,8 @@
/*
* +localmap Mappings and abbreviations local to a buffer.
* Now always included.
*/
#ifdef FEAT_NORMAL
# define FEAT_LOCALMAP
#endif
/*
* +insert_expand CTRL-N/CTRL-P/CTRL-X in insert mode. Takes about

File diff suppressed because it is too large Load Diff

2268
src/map.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -98,6 +98,7 @@ extern int _stricoll(char *a, char *b);
# include "list.pro"
# include "blob.pro"
# include "main.pro"
# include "map.pro"
# include "mark.pro"
# include "memfile.pro"
# include "memline.pro"

View File

@@ -23,6 +23,7 @@ void stuffnumReadbuff(long n);
int start_redo(long count, int old_redo);
int start_redo_ins(void);
void stop_redo_ins(void);
int noremap_keys(void);
int ins_typebuf(char_u *str, int noremap, int offset, int nottyped, int silent);
void ins_char_typebuf(int c);
int typebuf_changed(int tb_change_cnt);
@@ -49,22 +50,4 @@ int char_avail(void);
void vungetc(int c);
int fix_input_buffer(char_u *buf, int len);
int input_available(void);
int do_map(int maptype, char_u *arg, int mode, int abbrev);
int get_map_mode(char_u **cmdp, int forceit);
void map_clear(char_u *cmdp, char_u *arg, int forceit, int abbr);
void map_clear_int(buf_T *buf, int mode, int local, int abbr);
char_u *map_mode_to_chars(int mode);
int map_to_exists(char_u *str, char_u *modechars, int abbr);
int map_to_exists_mode(char_u *rhs, int mode, int abbr);
char_u *set_context_in_map_cmd(expand_T *xp, char_u *cmd, char_u *arg, int forceit, int isabbrev, int isunmap, cmdidx_T cmdidx);
int ExpandMappings(regmatch_T *regmatch, int *num_file, char_u ***file);
int check_abbr(int c, char_u *ptr, int col, int mincol);
char_u *vim_strsave_escape_csi(char_u *p);
void vim_unescape_csi(char_u *p);
int makemap(FILE *fd, buf_T *buf);
int put_escstr(FILE *fd, char_u *strstart, int what);
void check_map_keycodes(void);
char_u *check_map(char_u *keys, int mode, int exact, int ign_mod, int abbr, mapblock_T **mp_ptr, int *local_ptr);
void init_mappings(void);
void add_map(char_u *map, int mode);
/* vim: set ft=c : */

27
src/proto/map.pro Normal file
View File

@@ -0,0 +1,27 @@
/* map.c */
mapblock_T *get_maphash_list(int state, int c);
mapblock_T *get_buf_maphash_list(int state, int c);
int is_maphash_valid(void);
int do_map(int maptype, char_u *arg, int mode, int abbrev);
void map_clear_int(buf_T *buf, int mode, int local, int abbr);
int map_to_exists(char_u *str, char_u *modechars, int abbr);
int map_to_exists_mode(char_u *rhs, int mode, int abbr);
char_u *set_context_in_map_cmd(expand_T *xp, char_u *cmd, char_u *arg, int forceit, int isabbrev, int isunmap, cmdidx_T cmdidx);
int ExpandMappings(regmatch_T *regmatch, int *num_file, char_u ***file);
int check_abbr(int c, char_u *ptr, int col, int mincol);
char_u *eval_map_expr(char_u *str, int c);
char_u *vim_strsave_escape_csi(char_u *p);
void vim_unescape_csi(char_u *p);
int makemap(FILE *fd, buf_T *buf);
int put_escstr(FILE *fd, char_u *strstart, int what);
void check_map_keycodes(void);
char_u *check_map(char_u *keys, int mode, int exact, int ign_mod, int abbr, mapblock_T **mp_ptr, int *local_ptr);
void get_maparg(typval_T *argvars, typval_T *rettv, int exact);
void init_mappings(void);
void add_map(char_u *map, int mode);
void ex_abbreviate(exarg_T *eap);
void ex_map(exarg_T *eap);
void ex_unmap(exarg_T *eap);
void ex_mapclear(exarg_T *eap);
void ex_abclear(exarg_T *eap);
/* vim: set ft=c : */

View File

@@ -2293,13 +2293,12 @@ struct file_buffer
*/
char_u b_chartab[32];
#ifdef FEAT_LOCALMAP
// Table used for mappings local to a buffer.
mapblock_T *(b_maphash[256]);
// First abbreviation local to a buffer.
mapblock_T *b_first_abbr;
#endif
// User commands local to the buffer.
garray_T b_ucmds;
// start and end of an operator, also used for '[ and ']

View File

@@ -354,11 +354,7 @@ static char *(features[]) =
"-lispindent",
#endif
"+listcmds",
#ifdef FEAT_LOCALMAP
"+localmap",
#else
"-localmap",
#endif
#ifdef FEAT_LUA
# ifdef DYNAMIC_LUA
"+lua/dyn",
@@ -777,6 +773,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1785,
/**/
1784,
/**/