diff --git a/Filelist b/Filelist
index 0246ac7..9b0634d 100644
--- a/Filelist
+++ b/Filelist
@@ -23,6 +23,7 @@
 		src/change.c \
 		src/channel.c \
 		src/charset.c \
+		src/cmdhist.c \
 		src/crypt.c \
 		src/crypt_zip.c \
 		src/debugger.c \
diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak
index 2fb4bf8..c073b5f 100644
--- a/src/Make_cyg_ming.mak
+++ b/src/Make_cyg_ming.mak
@@ -710,6 +710,7 @@
 	$(OUTDIR)/buffer.o \
 	$(OUTDIR)/change.o \
 	$(OUTDIR)/charset.o \
+	$(OUTDIR)/cmdhist.o \
 	$(OUTDIR)/crypt.o \
 	$(OUTDIR)/crypt_zip.o \
 	$(OUTDIR)/debugger.o \
diff --git a/src/Make_morph.mak b/src/Make_morph.mak
index f75afd3..7616ce2 100644
--- a/src/Make_morph.mak
+++ b/src/Make_morph.mak
@@ -30,6 +30,7 @@
 	buffer.c						\
 	change.c						\
 	charset.c						\
+	cmdhist.c						\
 	crypt.c							\
 	crypt_zip.c						\
 	debugger.c						\
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index 6b6d073..07ea52a 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -719,6 +719,7 @@
 	$(OUTDIR)\buffer.obj \
 	$(OUTDIR)\change.obj \
 	$(OUTDIR)\charset.obj \
+	$(OUTDIR)\cmdhist.obj \
 	$(OUTDIR)\crypt.obj \
 	$(OUTDIR)\crypt_zip.obj \
 	$(OUTDIR)\debugger.obj \
@@ -1446,6 +1447,8 @@
 
 $(OUTDIR)/charset.obj:	$(OUTDIR) charset.c  $(INCL)
 
+$(OUTDIR)/cmdhist.obj:	$(OUTDIR) cmdhist.c  $(INCL)
+
 $(OUTDIR)/crypt.obj:	$(OUTDIR) crypt.c  $(INCL)
 
 $(OUTDIR)/crypt_zip.obj: $(OUTDIR) crypt_zip.c  $(INCL)
@@ -1747,6 +1750,7 @@
 	proto/buffer.pro \
 	proto/change.pro \
 	proto/charset.pro \
+	proto/cmdhist.pro \
 	proto/crypt.pro \
 	proto/crypt_zip.pro \
 	proto/debugger.pro \
diff --git a/src/Make_vms.mms b/src/Make_vms.mms
index 3995749..4e55ad4 100644
--- a/src/Make_vms.mms
+++ b/src/Make_vms.mms
@@ -308,7 +308,7 @@
 	   $(PERL_LIB) $(PYTHON_LIB) $(TCL_LIB) $(RUBY_LIB)
 
 SRC =	arabic.c autocmd.c beval.c blob.c blowfish.c buffer.c change.c charset.c \
-	crypt.c crypt_zip.c debugger.c dict.c diff.c digraph.c edit.c eval.c \
+	cmdhist.c crypt.c crypt_zip.c debugger.c dict.c diff.c digraph.c edit.c eval.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 \
@@ -322,7 +322,7 @@
  	$(RUBY_SRC) $(HANGULIN_SRC) $(MZSCH_SRC) $(XDIFF_SRC)
 
 OBJ = 	arabic.obj autocmd.obj beval.obj blob.obj blowfish.obj buffer.obj change.obj \
-	charset.obj crypt.obj crypt_zip.obj debugger.obj dict.obj diff.obj \
+	charset.obj cmdhist.obj crypt.obj crypt_zip.obj debugger.obj dict.obj diff.obj \
 	digraph.obj edit.obj eval.obj evalfunc.obj ex_cmds.obj ex_cmds2.obj \
 	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 \
@@ -520,6 +520,10 @@
  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
+cmdhist.obj : cmdhist.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
 crypt.obj : crypt.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h option.h structs.h regexp.h gui.h \
  beval.h [.proto]gui_beval.pro alloc.h ex_cmds.h spell.h proto.h \
diff --git a/src/Makefile b/src/Makefile
index bcfc513..9eff349 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1584,6 +1584,7 @@
 	buffer.c \
 	change.c \
 	charset.c \
+	cmdhist.c \
 	crypt.c \
 	crypt_zip.c \
 	debugger.c \
@@ -1709,6 +1710,7 @@
 	objects/change.o \
 	objects/blob.o \
 	objects/blowfish.o \
+	objects/cmdhist.o \
 	objects/crypt.o \
 	objects/crypt_zip.o \
 	objects/debugger.o \
@@ -1847,6 +1849,7 @@
 	buffer.pro \
 	change.pro \
 	charset.pro \
+	cmdhist.pro \
 	crypt.pro \
 	crypt_zip.pro \
 	debugger.pro \
@@ -3004,6 +3007,9 @@
 objects/charset.o: charset.c
 	$(CCC) -o $@ charset.c
 
+objects/cmdhist.o: cmdhist.c
+	$(CCC) -o $@ cmdhist.c
+
 objects/crypt.o: crypt.c
 	$(CCC) -o $@ crypt.c
 
@@ -3498,6 +3504,10 @@
  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/cmdhist.o: cmdhist.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/crypt.o: crypt.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 \
diff --git a/src/README.md b/src/README.md
index c02a696..2e77490 100644
--- a/src/README.md
+++ b/src/README.md
@@ -24,8 +24,10 @@
 File name       | Description
 --------------- | -----------
 autocmd.c	| autocommands
+blob.c		| blob data type
 buffer.c	| manipulating buffers (loaded files)
 change.c	| handling changes to text
+cmdhist.c	| command-line history
 debugger.c	| vim script debugger
 diff.c		| diff mode (vimdiff)
 eval.c		| expression evaluation
diff --git a/src/cmdhist.c b/src/cmdhist.c
new file mode 100644
index 0000000..72b3998
--- /dev/null
+++ b/src/cmdhist.c
@@ -0,0 +1,762 @@
+/* vi:set ts=8 sts=4 sw=4 noet:
+ *
+ * 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.
+ */
+
+/*
+ * cmdhist.c: Functions for the history of the command-line.
+ */
+
+#include "vim.h"
+
+static histentry_T *(history[HIST_COUNT]) = {NULL, NULL, NULL, NULL, NULL};
+static int	hisidx[HIST_COUNT] = {-1, -1, -1, -1, -1};  // lastused entry
+static int	hisnum[HIST_COUNT] = {0, 0, 0, 0, 0};
+		    // identifying (unique) number of newest history entry
+static int	hislen = 0;		// actual length of history tables
+
+/*
+ * Return the length of the history tables
+ */
+    int
+get_hislen(void)
+{
+    return hislen;
+}
+
+/*
+ * Return a pointer to a specified history table
+ */
+    histentry_T *
+get_histentry(int hist_type)
+{
+    return history[hist_type];
+}
+
+    void
+set_histentry(int hist_type, histentry_T *entry)
+{
+    history[hist_type] = entry;
+}
+
+    int *
+get_hisidx(int hist_type)
+{
+    return &hisidx[hist_type];
+}
+
+    int *
+get_hisnum(int hist_type)
+{
+    return &hisnum[hist_type];
+}
+
+/*
+ * Translate a history character to the associated type number.
+ */
+    int
+hist_char2type(int c)
+{
+    if (c == ':')
+	return HIST_CMD;
+    if (c == '=')
+	return HIST_EXPR;
+    if (c == '@')
+	return HIST_INPUT;
+    if (c == '>')
+	return HIST_DEBUG;
+    return HIST_SEARCH;	    // must be '?' or '/'
+}
+
+/*
+ * Table of history names.
+ * These names are used in :history and various hist...() functions.
+ * It is sufficient to give the significant prefix of a history name.
+ */
+
+static char *(history_names[]) =
+{
+    "cmd",
+    "search",
+    "expr",
+    "input",
+    "debug",
+    NULL
+};
+
+#if defined(FEAT_CMDL_COMPL) || defined(PROTO)
+/*
+ * Function given to ExpandGeneric() to obtain the possible first
+ * arguments of the ":history command.
+ */
+    char_u *
+get_history_arg(expand_T *xp UNUSED, int idx)
+{
+    static char_u compl[2] = { NUL, NUL };
+    char *short_names = ":=@>?/";
+    int short_names_count = (int)STRLEN(short_names);
+    int history_name_count = sizeof(history_names) / sizeof(char *) - 1;
+
+    if (idx < short_names_count)
+    {
+	compl[0] = (char_u)short_names[idx];
+	return compl;
+    }
+    if (idx < short_names_count + history_name_count)
+	return (char_u *)history_names[idx - short_names_count];
+    if (idx == short_names_count + history_name_count)
+	return (char_u *)"all";
+    return NULL;
+}
+#endif
+
+/*
+ * init_history() - Initialize the command line history.
+ * Also used to re-allocate the history when the size changes.
+ */
+    void
+init_history(void)
+{
+    int		newlen;	    // new length of history table
+    histentry_T	*temp;
+    int		i;
+    int		j;
+    int		type;
+
+    // If size of history table changed, reallocate it
+    newlen = (int)p_hi;
+    if (newlen != hislen)			// history length changed
+    {
+	for (type = 0; type < HIST_COUNT; ++type)   // adjust the tables
+	{
+	    if (newlen)
+	    {
+		temp = ALLOC_MULT(histentry_T, newlen);
+		if (temp == NULL)   // out of memory!
+		{
+		    if (type == 0)  // first one: just keep the old length
+		    {
+			newlen = hislen;
+			break;
+		    }
+		    // Already changed one table, now we can only have zero
+		    // length for all tables.
+		    newlen = 0;
+		    type = -1;
+		    continue;
+		}
+	    }
+	    else
+		temp = NULL;
+	    if (newlen == 0 || temp != NULL)
+	    {
+		if (hisidx[type] < 0)		// there are no entries yet
+		{
+		    for (i = 0; i < newlen; ++i)
+			clear_hist_entry(&temp[i]);
+		}
+		else if (newlen > hislen)	// array becomes bigger
+		{
+		    for (i = 0; i <= hisidx[type]; ++i)
+			temp[i] = history[type][i];
+		    j = i;
+		    for ( ; i <= newlen - (hislen - hisidx[type]); ++i)
+			clear_hist_entry(&temp[i]);
+		    for ( ; j < hislen; ++i, ++j)
+			temp[i] = history[type][j];
+		}
+		else				// array becomes smaller or 0
+		{
+		    j = hisidx[type];
+		    for (i = newlen - 1; ; --i)
+		    {
+			if (i >= 0)		// copy newest entries
+			    temp[i] = history[type][j];
+			else			// remove older entries
+			    vim_free(history[type][j].hisstr);
+			if (--j < 0)
+			    j = hislen - 1;
+			if (j == hisidx[type])
+			    break;
+		    }
+		    hisidx[type] = newlen - 1;
+		}
+		vim_free(history[type]);
+		history[type] = temp;
+	    }
+	}
+	hislen = newlen;
+    }
+}
+
+    void
+clear_hist_entry(histentry_T *hisptr)
+{
+    hisptr->hisnum = 0;
+    hisptr->viminfo = FALSE;
+    hisptr->hisstr = NULL;
+    hisptr->time_set = 0;
+}
+
+/*
+ * Check if command line 'str' is already in history.
+ * If 'move_to_front' is TRUE, matching entry is moved to end of history.
+ */
+    int
+in_history(
+    int	    type,
+    char_u  *str,
+    int	    move_to_front,	// Move the entry to the front if it exists
+    int	    sep,
+    int	    writing)		// ignore entries read from viminfo
+{
+    int	    i;
+    int	    last_i = -1;
+    char_u  *p;
+
+    if (hisidx[type] < 0)
+	return FALSE;
+    i = hisidx[type];
+    do
+    {
+	if (history[type][i].hisstr == NULL)
+	    return FALSE;
+
+	// For search history, check that the separator character matches as
+	// well.
+	p = history[type][i].hisstr;
+	if (STRCMP(str, p) == 0
+		&& !(writing && history[type][i].viminfo)
+		&& (type != HIST_SEARCH || sep == p[STRLEN(p) + 1]))
+	{
+	    if (!move_to_front)
+		return TRUE;
+	    last_i = i;
+	    break;
+	}
+	if (--i < 0)
+	    i = hislen - 1;
+    } while (i != hisidx[type]);
+
+    if (last_i >= 0)
+    {
+	str = history[type][i].hisstr;
+	while (i != hisidx[type])
+	{
+	    if (++i >= hislen)
+		i = 0;
+	    history[type][last_i] = history[type][i];
+	    last_i = i;
+	}
+	history[type][i].hisnum = ++hisnum[type];
+	history[type][i].viminfo = FALSE;
+	history[type][i].hisstr = str;
+	history[type][i].time_set = vim_time();
+	return TRUE;
+    }
+    return FALSE;
+}
+
+/*
+ * Convert history name (from table above) to its HIST_ equivalent.
+ * When "name" is empty, return "cmd" history.
+ * Returns -1 for unknown history name.
+ */
+    static int
+get_histtype(char_u *name)
+{
+    int		i;
+    int		len = (int)STRLEN(name);
+
+    // No argument: use current history.
+    if (len == 0)
+	return hist_char2type(get_cmdline_firstc());
+
+    for (i = 0; history_names[i] != NULL; ++i)
+	if (STRNICMP(name, history_names[i], len) == 0)
+	    return i;
+
+    if (vim_strchr((char_u *)":=@>?/", name[0]) != NULL && name[1] == NUL)
+	return hist_char2type(name[0]);
+
+    return -1;
+}
+
+static int	last_maptick = -1;	// last seen maptick
+
+/*
+ * Add the given string to the given history.  If the string is already in the
+ * history then it is moved to the front.  "histype" may be one of he HIST_
+ * values.
+ */
+    void
+add_to_history(
+    int		histype,
+    char_u	*new_entry,
+    int		in_map,		// consider maptick when inside a mapping
+    int		sep)		// separator character used (search hist)
+{
+    histentry_T	*hisptr;
+    int		len;
+
+    if (hislen == 0)		// no history
+	return;
+
+    if (cmdmod.keeppatterns && histype == HIST_SEARCH)
+	return;
+
+    // Searches inside the same mapping overwrite each other, so that only
+    // the last line is kept.  Be careful not to remove a line that was moved
+    // down, only lines that were added.
+    if (histype == HIST_SEARCH && in_map)
+    {
+	if (maptick == last_maptick && hisidx[HIST_SEARCH] >= 0)
+	{
+	    // Current line is from the same mapping, remove it
+	    hisptr = &history[HIST_SEARCH][hisidx[HIST_SEARCH]];
+	    vim_free(hisptr->hisstr);
+	    clear_hist_entry(hisptr);
+	    --hisnum[histype];
+	    if (--hisidx[HIST_SEARCH] < 0)
+		hisidx[HIST_SEARCH] = hislen - 1;
+	}
+	last_maptick = -1;
+    }
+    if (!in_history(histype, new_entry, TRUE, sep, FALSE))
+    {
+	if (++hisidx[histype] == hislen)
+	    hisidx[histype] = 0;
+	hisptr = &history[histype][hisidx[histype]];
+	vim_free(hisptr->hisstr);
+
+	// Store the separator after the NUL of the string.
+	len = (int)STRLEN(new_entry);
+	hisptr->hisstr = vim_strnsave(new_entry, len + 2);
+	if (hisptr->hisstr != NULL)
+	    hisptr->hisstr[len + 1] = sep;
+
+	hisptr->hisnum = ++hisnum[histype];
+	hisptr->viminfo = FALSE;
+	hisptr->time_set = vim_time();
+	if (histype == HIST_SEARCH && in_map)
+	    last_maptick = maptick;
+    }
+}
+
+#if defined(FEAT_EVAL) || defined(PROTO)
+
+/*
+ * Get identifier of newest history entry.
+ * "histype" may be one of the HIST_ values.
+ */
+    static int
+get_history_idx(int histype)
+{
+    if (hislen == 0 || histype < 0 || histype >= HIST_COUNT
+		    || hisidx[histype] < 0)
+	return -1;
+
+    return history[histype][hisidx[histype]].hisnum;
+}
+
+/*
+ * Calculate history index from a number:
+ *   num > 0: seen as identifying number of a history entry
+ *   num < 0: relative position in history wrt newest entry
+ * "histype" may be one of the HIST_ values.
+ */
+    static int
+calc_hist_idx(int histype, int num)
+{
+    int		i;
+    histentry_T	*hist;
+    int		wrapped = FALSE;
+
+    if (hislen == 0 || histype < 0 || histype >= HIST_COUNT
+		    || (i = hisidx[histype]) < 0 || num == 0)
+	return -1;
+
+    hist = history[histype];
+    if (num > 0)
+    {
+	while (hist[i].hisnum > num)
+	    if (--i < 0)
+	    {
+		if (wrapped)
+		    break;
+		i += hislen;
+		wrapped = TRUE;
+	    }
+	if (hist[i].hisnum == num && hist[i].hisstr != NULL)
+	    return i;
+    }
+    else if (-num <= hislen)
+    {
+	i += num + 1;
+	if (i < 0)
+	    i += hislen;
+	if (hist[i].hisstr != NULL)
+	    return i;
+    }
+    return -1;
+}
+
+/*
+ * Get a history entry by its index.
+ * "histype" may be one of the HIST_ values.
+ */
+    static char_u *
+get_history_entry(int histype, int idx)
+{
+    idx = calc_hist_idx(histype, idx);
+    if (idx >= 0)
+	return history[histype][idx].hisstr;
+    else
+	return (char_u *)"";
+}
+
+/*
+ * Clear all entries of a history.
+ * "histype" may be one of the HIST_ values.
+ */
+    static int
+clr_history(int histype)
+{
+    int		i;
+    histentry_T	*hisptr;
+
+    if (hislen != 0 && histype >= 0 && histype < HIST_COUNT)
+    {
+	hisptr = history[histype];
+	for (i = hislen; i--;)
+	{
+	    vim_free(hisptr->hisstr);
+	    clear_hist_entry(hisptr);
+	    hisptr++;
+	}
+	hisidx[histype] = -1;	// mark history as cleared
+	hisnum[histype] = 0;	// reset identifier counter
+	return OK;
+    }
+    return FAIL;
+}
+
+/*
+ * Remove all entries matching {str} from a history.
+ * "histype" may be one of the HIST_ values.
+ */
+    static int
+del_history_entry(int histype, char_u *str)
+{
+    regmatch_T	regmatch;
+    histentry_T	*hisptr;
+    int		idx;
+    int		i;
+    int		last;
+    int		found = FALSE;
+
+    regmatch.regprog = NULL;
+    regmatch.rm_ic = FALSE;	// always match case
+    if (hislen != 0
+	    && histype >= 0
+	    && histype < HIST_COUNT
+	    && *str != NUL
+	    && (idx = hisidx[histype]) >= 0
+	    && (regmatch.regprog = vim_regcomp(str, RE_MAGIC + RE_STRING))
+								      != NULL)
+    {
+	i = last = idx;
+	do
+	{
+	    hisptr = &history[histype][i];
+	    if (hisptr->hisstr == NULL)
+		break;
+	    if (vim_regexec(&regmatch, hisptr->hisstr, (colnr_T)0))
+	    {
+		found = TRUE;
+		vim_free(hisptr->hisstr);
+		clear_hist_entry(hisptr);
+	    }
+	    else
+	    {
+		if (i != last)
+		{
+		    history[histype][last] = *hisptr;
+		    clear_hist_entry(hisptr);
+		}
+		if (--last < 0)
+		    last += hislen;
+	    }
+	    if (--i < 0)
+		i += hislen;
+	} while (i != idx);
+	if (history[histype][idx].hisstr == NULL)
+	    hisidx[histype] = -1;
+    }
+    vim_regfree(regmatch.regprog);
+    return found;
+}
+
+/*
+ * Remove an indexed entry from a history.
+ * "histype" may be one of the HIST_ values.
+ */
+    static int
+del_history_idx(int histype, int idx)
+{
+    int	    i, j;
+
+    i = calc_hist_idx(histype, idx);
+    if (i < 0)
+	return FALSE;
+    idx = hisidx[histype];
+    vim_free(history[histype][i].hisstr);
+
+    // When deleting the last added search string in a mapping, reset
+    // last_maptick, so that the last added search string isn't deleted again.
+    if (histype == HIST_SEARCH && maptick == last_maptick && i == idx)
+	last_maptick = -1;
+
+    while (i != idx)
+    {
+	j = (i + 1) % hislen;
+	history[histype][i] = history[histype][j];
+	i = j;
+    }
+    clear_hist_entry(&history[histype][i]);
+    if (--i < 0)
+	i += hislen;
+    hisidx[histype] = i;
+    return TRUE;
+}
+
+/*
+ * "histadd()" function
+ */
+    void
+f_histadd(typval_T *argvars UNUSED, typval_T *rettv)
+{
+    int		histype;
+    char_u	*str;
+    char_u	buf[NUMBUFLEN];
+
+    rettv->vval.v_number = FALSE;
+    if (check_secure())
+	return;
+    str = tv_get_string_chk(&argvars[0]);	// NULL on type error
+    histype = str != NULL ? get_histtype(str) : -1;
+    if (histype >= 0)
+    {
+	str = tv_get_string_buf(&argvars[1], buf);
+	if (*str != NUL)
+	{
+	    init_history();
+	    add_to_history(histype, str, FALSE, NUL);
+	    rettv->vval.v_number = TRUE;
+	    return;
+	}
+    }
+}
+
+/*
+ * "histdel()" function
+ */
+    void
+f_histdel(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
+{
+    int		n;
+    char_u	buf[NUMBUFLEN];
+    char_u	*str;
+
+    str = tv_get_string_chk(&argvars[0]);	// NULL on type error
+    if (str == NULL)
+	n = 0;
+    else if (argvars[1].v_type == VAR_UNKNOWN)
+	// only one argument: clear entire history
+	n = clr_history(get_histtype(str));
+    else if (argvars[1].v_type == VAR_NUMBER)
+	// index given: remove that entry
+	n = del_history_idx(get_histtype(str),
+					  (int)tv_get_number(&argvars[1]));
+    else
+	// string given: remove all matching entries
+	n = del_history_entry(get_histtype(str),
+				      tv_get_string_buf(&argvars[1], buf));
+    rettv->vval.v_number = n;
+}
+
+/*
+ * "histget()" function
+ */
+    void
+f_histget(typval_T *argvars UNUSED, typval_T *rettv)
+{
+    int		type;
+    int		idx;
+    char_u	*str;
+
+    str = tv_get_string_chk(&argvars[0]);	// NULL on type error
+    if (str == NULL)
+	rettv->vval.v_string = NULL;
+    else
+    {
+	type = get_histtype(str);
+	if (argvars[1].v_type == VAR_UNKNOWN)
+	    idx = get_history_idx(type);
+	else
+	    idx = (int)tv_get_number_chk(&argvars[1], NULL);
+						    // -1 on type error
+	rettv->vval.v_string = vim_strsave(get_history_entry(type, idx));
+    }
+    rettv->v_type = VAR_STRING;
+}
+
+/*
+ * "histnr()" function
+ */
+    void
+f_histnr(typval_T *argvars UNUSED, typval_T *rettv)
+{
+    int		i;
+
+    char_u	*histname = tv_get_string_chk(&argvars[0]);
+
+    i = histname == NULL ? HIST_CMD - 1 : get_histtype(histname);
+    if (i >= HIST_CMD && i < HIST_COUNT)
+	i = get_history_idx(i);
+    else
+	i = -1;
+    rettv->vval.v_number = i;
+}
+#endif // FEAT_EVAL
+
+#if defined(FEAT_CRYPT) || defined(PROTO)
+/*
+ * Very specific function to remove the value in ":set key=val" from the
+ * history.
+ */
+    void
+remove_key_from_history(void)
+{
+    char_u	*p;
+    int		i;
+
+    i = hisidx[HIST_CMD];
+    if (i < 0)
+	return;
+    p = history[HIST_CMD][i].hisstr;
+    if (p != NULL)
+	for ( ; *p; ++p)
+	    if (STRNCMP(p, "key", 3) == 0 && !isalpha(p[3]))
+	    {
+		p = vim_strchr(p + 3, '=');
+		if (p == NULL)
+		    break;
+		++p;
+		for (i = 0; p[i] && !VIM_ISWHITE(p[i]); ++i)
+		    if (p[i] == '\\' && p[i + 1])
+			++i;
+		STRMOVE(p, p + i);
+		--p;
+	    }
+}
+#endif
+
+/*
+ * :history command - print a history
+ */
+    void
+ex_history(exarg_T *eap)
+{
+    histentry_T	*hist;
+    int		histype1 = HIST_CMD;
+    int		histype2 = HIST_CMD;
+    int		hisidx1 = 1;
+    int		hisidx2 = -1;
+    int		idx;
+    int		i, j, k;
+    char_u	*end;
+    char_u	*arg = eap->arg;
+
+    if (hislen == 0)
+    {
+	msg(_("'history' option is zero"));
+	return;
+    }
+
+    if (!(VIM_ISDIGIT(*arg) || *arg == '-' || *arg == ','))
+    {
+	end = arg;
+	while (ASCII_ISALPHA(*end)
+		|| vim_strchr((char_u *)":=@>/?", *end) != NULL)
+	    end++;
+	i = *end;
+	*end = NUL;
+	histype1 = get_histtype(arg);
+	if (histype1 == -1)
+	{
+	    if (STRNICMP(arg, "all", STRLEN(arg)) == 0)
+	    {
+		histype1 = 0;
+		histype2 = HIST_COUNT-1;
+	    }
+	    else
+	    {
+		*end = i;
+		emsg(_(e_trailing));
+		return;
+	    }
+	}
+	else
+	    histype2 = histype1;
+	*end = i;
+    }
+    else
+	end = arg;
+    if (!get_list_range(&end, &hisidx1, &hisidx2) || *end != NUL)
+    {
+	emsg(_(e_trailing));
+	return;
+    }
+
+    for (; !got_int && histype1 <= histype2; ++histype1)
+    {
+	STRCPY(IObuff, "\n      #  ");
+	STRCAT(STRCAT(IObuff, history_names[histype1]), " history");
+	msg_puts_title((char *)IObuff);
+	idx = hisidx[histype1];
+	hist = history[histype1];
+	j = hisidx1;
+	k = hisidx2;
+	if (j < 0)
+	    j = (-j > hislen) ? 0 : hist[(hislen+j+idx+1) % hislen].hisnum;
+	if (k < 0)
+	    k = (-k > hislen) ? 0 : hist[(hislen+k+idx+1) % hislen].hisnum;
+	if (idx >= 0 && j <= k)
+	    for (i = idx + 1; !got_int; ++i)
+	    {
+		if (i == hislen)
+		    i = 0;
+		if (hist[i].hisstr != NULL
+			&& hist[i].hisnum >= j && hist[i].hisnum <= k)
+		{
+		    msg_putchar('\n');
+		    sprintf((char *)IObuff, "%c%6d  ", i == idx ? '>' : ' ',
+							      hist[i].hisnum);
+		    if (vim_strsize(hist[i].hisstr) > (int)Columns - 10)
+			trunc_string(hist[i].hisstr, IObuff + STRLEN(IObuff),
+			     (int)Columns - 10, IOSIZE - (int)STRLEN(IObuff));
+		    else
+			STRCAT(IObuff, hist[i].hisstr);
+		    msg_outtrans(IObuff);
+		    out_flush();
+		}
+		if (i == idx)
+		    break;
+	    }
+    }
+}
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 0c522dd..ab8efe9 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -182,10 +182,6 @@
 static void f_has(typval_T *argvars, typval_T *rettv);
 static void f_haslocaldir(typval_T *argvars, typval_T *rettv);
 static void f_hasmapto(typval_T *argvars, typval_T *rettv);
-static void f_histadd(typval_T *argvars, typval_T *rettv);
-static void f_histdel(typval_T *argvars, typval_T *rettv);
-static void f_histget(typval_T *argvars, typval_T *rettv);
-static void f_histnr(typval_T *argvars, typval_T *rettv);
 static void f_hlID(typval_T *argvars, typval_T *rettv);
 static void f_hlexists(typval_T *argvars, typval_T *rettv);
 static void f_hostname(typval_T *argvars, typval_T *rettv);
@@ -6114,9 +6110,7 @@
 #ifdef FEAT_CMDL_COMPL
 	"cmdline_compl",
 #endif
-#ifdef FEAT_CMDHIST
 	"cmdline_hist",
-#endif
 #ifdef FEAT_COMMENTS
 	"comments",
 #endif
@@ -6688,117 +6682,6 @@
 }
 
 /*
- * "histadd()" function
- */
-    static void
-f_histadd(typval_T *argvars UNUSED, typval_T *rettv)
-{
-#ifdef FEAT_CMDHIST
-    int		histype;
-    char_u	*str;
-    char_u	buf[NUMBUFLEN];
-#endif
-
-    rettv->vval.v_number = FALSE;
-    if (check_secure())
-	return;
-#ifdef FEAT_CMDHIST
-    str = tv_get_string_chk(&argvars[0]);	/* NULL on type error */
-    histype = str != NULL ? get_histtype(str) : -1;
-    if (histype >= 0)
-    {
-	str = tv_get_string_buf(&argvars[1], buf);
-	if (*str != NUL)
-	{
-	    init_history();
-	    add_to_history(histype, str, FALSE, NUL);
-	    rettv->vval.v_number = TRUE;
-	    return;
-	}
-    }
-#endif
-}
-
-/*
- * "histdel()" function
- */
-    static void
-f_histdel(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
-{
-#ifdef FEAT_CMDHIST
-    int		n;
-    char_u	buf[NUMBUFLEN];
-    char_u	*str;
-
-    str = tv_get_string_chk(&argvars[0]);	/* NULL on type error */
-    if (str == NULL)
-	n = 0;
-    else if (argvars[1].v_type == VAR_UNKNOWN)
-	/* only one argument: clear entire history */
-	n = clr_history(get_histtype(str));
-    else if (argvars[1].v_type == VAR_NUMBER)
-	/* index given: remove that entry */
-	n = del_history_idx(get_histtype(str),
-					  (int)tv_get_number(&argvars[1]));
-    else
-	/* string given: remove all matching entries */
-	n = del_history_entry(get_histtype(str),
-				      tv_get_string_buf(&argvars[1], buf));
-    rettv->vval.v_number = n;
-#endif
-}
-
-/*
- * "histget()" function
- */
-    static void
-f_histget(typval_T *argvars UNUSED, typval_T *rettv)
-{
-#ifdef FEAT_CMDHIST
-    int		type;
-    int		idx;
-    char_u	*str;
-
-    str = tv_get_string_chk(&argvars[0]);	/* NULL on type error */
-    if (str == NULL)
-	rettv->vval.v_string = NULL;
-    else
-    {
-	type = get_histtype(str);
-	if (argvars[1].v_type == VAR_UNKNOWN)
-	    idx = get_history_idx(type);
-	else
-	    idx = (int)tv_get_number_chk(&argvars[1], NULL);
-						    /* -1 on type error */
-	rettv->vval.v_string = vim_strsave(get_history_entry(type, idx));
-    }
-#else
-    rettv->vval.v_string = NULL;
-#endif
-    rettv->v_type = VAR_STRING;
-}
-
-/*
- * "histnr()" function
- */
-    static void
-f_histnr(typval_T *argvars UNUSED, typval_T *rettv)
-{
-    int		i;
-
-#ifdef FEAT_CMDHIST
-    char_u	*history = tv_get_string_chk(&argvars[0]);
-
-    i = history == NULL ? HIST_CMD - 1 : get_histtype(history);
-    if (i >= HIST_CMD && i < HIST_COUNT)
-	i = get_history_idx(i);
-    else
-#endif
-	i = -1;
-    rettv->vval.v_number = i;
-}
-
-/*
  * "highlightID(name)" function
  */
     static void
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 98f5070..282e6a0 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -3900,10 +3900,8 @@
 
 	if (!cmdmod.keeppatterns)
 	    save_re_pat(RE_SUBST, pat, p_magic);
-#ifdef FEAT_CMDHIST
-	/* put pattern in history */
+	// put pattern in history
 	add_to_history(HIST_SEARCH, pat, TRUE, NUL);
-#endif
 
 	return;
     }
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 6df1c31..ea58efa 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -356,9 +356,6 @@
 # define ex_nbstart		ex_ni
 #endif
 
-#ifndef FEAT_CMDHIST
-# define ex_history		ex_ni
-#endif
 #ifndef FEAT_JUMPLIST
 # define ex_jumps		ex_ni
 # define ex_clearjumps		ex_ni
@@ -985,7 +982,7 @@
 	if (next_cmdline == NULL)
 	{
 	    VIM_CLEAR(cmdline_copy);
-#ifdef FEAT_CMDHIST
+
 	    /*
 	     * If the command was typed, remember it for the ':' register.
 	     * Do this AFTER executing the command to make :@: work.
@@ -997,7 +994,6 @@
 		last_cmdline = new_last_cmdline;
 		new_last_cmdline = NULL;
 	    }
-#endif
 	}
 	else
 	{
@@ -4130,12 +4126,10 @@
 	    xp->xp_pattern = arg;
 	    break;
 
-#if defined(FEAT_CMDHIST)
 	case CMD_history:
 	    xp->xp_context = EXPAND_HISTORY;
 	    xp->xp_pattern = arg;
 	    break;
-#endif
 #if defined(FEAT_PROFILE)
 	case CMD_syntime:
 	    xp->xp_context = EXPAND_SYNTIME;
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 0e5d2ba..7a00c6b 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -59,14 +59,6 @@
 				    * the command line */
 static int	extra_char_shift;
 
-#ifdef FEAT_CMDHIST
-static histentry_T *(history[HIST_COUNT]) = {NULL, NULL, NULL, NULL, NULL};
-static int	hisidx[HIST_COUNT] = {-1, -1, -1, -1, -1};  /* lastused entry */
-static int	hisnum[HIST_COUNT] = {0, 0, 0, 0, 0};
-		    /* identifying (unique) number of newest history entry */
-static int	hislen = 0;		/* actual length of history tables */
-#endif
-
 #ifdef FEAT_RIGHTLEFT
 static int	cmd_hkmap = 0;	/* Hebrew mapping during command line */
 #endif
@@ -98,9 +90,6 @@
 static int	expand_shellcmd(char_u *filepat, int *num_file, char_u ***file, int flagsarg);
 static int	ExpandRTDir(char_u *pat, int flags, int *num_file, char_u ***file, char *dirname[]);
 static int	ExpandPackAddDir(char_u *pat, int *num_file, char_u ***file);
-# ifdef FEAT_CMDHIST
-static char_u	*get_history_arg(expand_T *xp, int idx);
-# endif
 # if defined(FEAT_EVAL)
 static int	ExpandUserDefined(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file);
 static int	ExpandUserList(expand_T *xp, int *num_file, char_u ***file);
@@ -844,11 +833,9 @@
     int		j;
     int		gotesc = FALSE;		/* TRUE when <ESC> just typed */
     int		do_abbr;		/* when TRUE check for abbr. */
-#ifdef FEAT_CMDHIST
     char_u	*lookfor = NULL;	/* string to match */
     int		hiscnt;			/* current history line in use */
     int		histype;		/* history type to be used */
-#endif
 #ifdef FEAT_SEARCH_EXTRA
     incsearch_state_T	is_state;
 #endif
@@ -1004,11 +991,9 @@
     cmdline_type = firstc == NUL ? '-' : firstc;
     trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINEENTER);
 
-#ifdef FEAT_CMDHIST
     init_history();
-    hiscnt = hislen;		/* set hiscnt to impossible history value */
+    hiscnt = get_hislen();	/* set hiscnt to impossible history value */
     histype = hist_char2type(firstc);
-#endif
 
 #ifdef FEAT_DIGRAPHS
     do_digraph(-1);		/* init digraph typeahead */
@@ -1090,9 +1075,8 @@
 		&& !global_busy)
 	    got_int = FALSE;
 
-#ifdef FEAT_CMDHIST
-	/* free old command line when finished moving around in the history
-	 * list */
+	// free old command line when finished moving around in the history
+	// list
 	if (lookfor != NULL
 		&& c != K_S_DOWN && c != K_S_UP
 		&& c != K_DOWN && c != K_UP
@@ -1101,7 +1085,6 @@
 		&& c != K_LEFT && c != K_RIGHT
 		&& (xpc.xp_numfiles > 0 || (c != Ctrl_P && c != Ctrl_N)))
 	    VIM_CLEAR(lookfor);
-#endif
 
 	/*
 	 * When there are matching completions to select <S-Tab> works like
@@ -2108,7 +2091,6 @@
 			break;
 		    goto cmdline_not_changed;
 		}
-#ifdef FEAT_CMDHIST
 		/* FALLTHROUGH */
 	case K_UP:
 	case K_DOWN:
@@ -2118,7 +2100,7 @@
 	case K_KPAGEUP:
 	case K_PAGEDOWN:
 	case K_KPAGEDOWN:
-		if (hislen == 0 || firstc == NUL)	/* no history */
+		if (get_hislen() == 0 || firstc == NUL)	/* no history */
 		    goto cmdline_not_changed;
 
 		i = hiscnt;
@@ -2138,11 +2120,11 @@
 		    if (c == K_UP|| c == K_S_UP || c == Ctrl_P
 			    || c == K_PAGEUP || c == K_KPAGEUP)
 		    {
-			if (hiscnt == hislen)	/* first time */
-			    hiscnt = hisidx[histype];
-			else if (hiscnt == 0 && hisidx[histype] != hislen - 1)
-			    hiscnt = hislen - 1;
-			else if (hiscnt != hisidx[histype] + 1)
+			if (hiscnt == get_hislen())	/* first time */
+			    hiscnt = *get_hisidx(histype);
+			else if (hiscnt == 0 && *get_hisidx(histype) != get_hislen() - 1)
+			    hiscnt = get_hislen() - 1;
+			else if (hiscnt != *get_hisidx(histype) + 1)
 			    --hiscnt;
 			else			/* at top of list */
 			{
@@ -2153,28 +2135,28 @@
 		    else    /* one step forwards */
 		    {
 			/* on last entry, clear the line */
-			if (hiscnt == hisidx[histype])
+			if (hiscnt == *get_hisidx(histype))
 			{
-			    hiscnt = hislen;
+			    hiscnt = get_hislen();
 			    break;
 			}
 
 			/* not on a history line, nothing to do */
-			if (hiscnt == hislen)
+			if (hiscnt == get_hislen())
 			    break;
-			if (hiscnt == hislen - 1)   /* wrap around */
+			if (hiscnt == get_hislen() - 1)   /* wrap around */
 			    hiscnt = 0;
 			else
 			    ++hiscnt;
 		    }
-		    if (hiscnt < 0 || history[histype][hiscnt].hisstr == NULL)
+		    if (hiscnt < 0 || get_histentry(histype)[hiscnt].hisstr == NULL)
 		    {
 			hiscnt = i;
 			break;
 		    }
 		    if ((c != K_UP && c != K_DOWN)
 			    || hiscnt == i
-			    || STRNCMP(history[histype][hiscnt].hisstr,
+			    || STRNCMP(get_histentry(histype)[hiscnt].hisstr,
 						    lookfor, (size_t)j) == 0)
 			break;
 		}
@@ -2187,10 +2169,10 @@
 
 		    VIM_CLEAR(ccline.cmdbuff);
 		    xpc.xp_context = EXPAND_NOTHING;
-		    if (hiscnt == hislen)
+		    if (hiscnt == get_hislen())
 			p = lookfor;	/* back to the old one */
 		    else
-			p = history[histype][hiscnt].hisstr;
+			p = get_histentry(histype)[hiscnt].hisstr;
 
 		    if (histype == HIST_SEARCH
 			    && p != lookfor
@@ -2251,7 +2233,6 @@
 		    goto cmdline_changed;
 		}
 		beep_flush();
-#endif
 		goto cmdline_not_changed;
 
 #ifdef FEAT_SEARCH_EXTRA
@@ -2419,7 +2400,6 @@
 	/*
 	 * Put line in history buffer (":" and "=" only when it was typed).
 	 */
-#ifdef FEAT_CMDHIST
 	if (ccline.cmdlen && firstc != NUL
 		&& (some_key_typed || histype == HIST_SEARCH))
 	{
@@ -2431,7 +2411,6 @@
 		new_last_cmdline = vim_strsave(ccline.cmdbuff);
 	    }
 	}
-#endif
 
 	if (gotesc)
 	    abandon_cmdline();
@@ -5205,9 +5184,7 @@
 	    {EXPAND_BEHAVE, get_behave_arg, TRUE, TRUE},
 	    {EXPAND_MAPCLEAR, get_mapclear_arg, TRUE, TRUE},
 	    {EXPAND_MESSAGES, get_messages_arg, TRUE, TRUE},
-#ifdef FEAT_CMDHIST
 	    {EXPAND_HISTORY, get_history_arg, TRUE, TRUE},
-#endif
 	    {EXPAND_USER_COMMANDS, get_user_commands, FALSE, TRUE},
 	    {EXPAND_USER_ADDR_TYPE, get_user_cmd_addr_type, FALSE, TRUE},
 	    {EXPAND_USER_CMD_FLAGS, get_user_cmd_flags, FALSE, TRUE},
@@ -5871,532 +5848,6 @@
 
 #endif
 
-#if defined(FEAT_CMDHIST) || defined(PROTO)
-
-/*********************************
- *  Command line history stuff	 *
- *********************************/
-
-/*
- * Translate a history character to the associated type number.
- */
-    int
-hist_char2type(int c)
-{
-    if (c == ':')
-	return HIST_CMD;
-    if (c == '=')
-	return HIST_EXPR;
-    if (c == '@')
-	return HIST_INPUT;
-    if (c == '>')
-	return HIST_DEBUG;
-    return HIST_SEARCH;	    /* must be '?' or '/' */
-}
-
-/*
- * Table of history names.
- * These names are used in :history and various hist...() functions.
- * It is sufficient to give the significant prefix of a history name.
- */
-
-static char *(history_names[]) =
-{
-    "cmd",
-    "search",
-    "expr",
-    "input",
-    "debug",
-    NULL
-};
-
-#if defined(FEAT_CMDL_COMPL) || defined(PROTO)
-/*
- * Function given to ExpandGeneric() to obtain the possible first
- * arguments of the ":history command.
- */
-    static char_u *
-get_history_arg(expand_T *xp UNUSED, int idx)
-{
-    static char_u compl[2] = { NUL, NUL };
-    char *short_names = ":=@>?/";
-    int short_names_count = (int)STRLEN(short_names);
-    int history_name_count = sizeof(history_names) / sizeof(char *) - 1;
-
-    if (idx < short_names_count)
-    {
-	compl[0] = (char_u)short_names[idx];
-	return compl;
-    }
-    if (idx < short_names_count + history_name_count)
-	return (char_u *)history_names[idx - short_names_count];
-    if (idx == short_names_count + history_name_count)
-	return (char_u *)"all";
-    return NULL;
-}
-#endif
-
-/*
- * init_history() - Initialize the command line history.
- * Also used to re-allocate the history when the size changes.
- */
-    void
-init_history(void)
-{
-    int		newlen;	    /* new length of history table */
-    histentry_T	*temp;
-    int		i;
-    int		j;
-    int		type;
-
-    /*
-     * If size of history table changed, reallocate it
-     */
-    newlen = (int)p_hi;
-    if (newlen != hislen)			/* history length changed */
-    {
-	for (type = 0; type < HIST_COUNT; ++type)   /* adjust the tables */
-	{
-	    if (newlen)
-	    {
-		temp = ALLOC_MULT(histentry_T, newlen);
-		if (temp == NULL)   /* out of memory! */
-		{
-		    if (type == 0)  /* first one: just keep the old length */
-		    {
-			newlen = hislen;
-			break;
-		    }
-		    /* Already changed one table, now we can only have zero
-		     * length for all tables. */
-		    newlen = 0;
-		    type = -1;
-		    continue;
-		}
-	    }
-	    else
-		temp = NULL;
-	    if (newlen == 0 || temp != NULL)
-	    {
-		if (hisidx[type] < 0)		/* there are no entries yet */
-		{
-		    for (i = 0; i < newlen; ++i)
-			clear_hist_entry(&temp[i]);
-		}
-		else if (newlen > hislen)	/* array becomes bigger */
-		{
-		    for (i = 0; i <= hisidx[type]; ++i)
-			temp[i] = history[type][i];
-		    j = i;
-		    for ( ; i <= newlen - (hislen - hisidx[type]); ++i)
-			clear_hist_entry(&temp[i]);
-		    for ( ; j < hislen; ++i, ++j)
-			temp[i] = history[type][j];
-		}
-		else				/* array becomes smaller or 0 */
-		{
-		    j = hisidx[type];
-		    for (i = newlen - 1; ; --i)
-		    {
-			if (i >= 0)		/* copy newest entries */
-			    temp[i] = history[type][j];
-			else			/* remove older entries */
-			    vim_free(history[type][j].hisstr);
-			if (--j < 0)
-			    j = hislen - 1;
-			if (j == hisidx[type])
-			    break;
-		    }
-		    hisidx[type] = newlen - 1;
-		}
-		vim_free(history[type]);
-		history[type] = temp;
-	    }
-	}
-	hislen = newlen;
-    }
-}
-
-    void
-clear_hist_entry(histentry_T *hisptr)
-{
-    hisptr->hisnum = 0;
-    hisptr->viminfo = FALSE;
-    hisptr->hisstr = NULL;
-    hisptr->time_set = 0;
-}
-
-/*
- * Check if command line 'str' is already in history.
- * If 'move_to_front' is TRUE, matching entry is moved to end of history.
- */
-    int
-in_history(
-    int	    type,
-    char_u  *str,
-    int	    move_to_front,	/* Move the entry to the front if it exists */
-    int	    sep,
-    int	    writing)		/* ignore entries read from viminfo */
-{
-    int	    i;
-    int	    last_i = -1;
-    char_u  *p;
-
-    if (hisidx[type] < 0)
-	return FALSE;
-    i = hisidx[type];
-    do
-    {
-	if (history[type][i].hisstr == NULL)
-	    return FALSE;
-
-	/* For search history, check that the separator character matches as
-	 * well. */
-	p = history[type][i].hisstr;
-	if (STRCMP(str, p) == 0
-		&& !(writing && history[type][i].viminfo)
-		&& (type != HIST_SEARCH || sep == p[STRLEN(p) + 1]))
-	{
-	    if (!move_to_front)
-		return TRUE;
-	    last_i = i;
-	    break;
-	}
-	if (--i < 0)
-	    i = hislen - 1;
-    } while (i != hisidx[type]);
-
-    if (last_i >= 0)
-    {
-	str = history[type][i].hisstr;
-	while (i != hisidx[type])
-	{
-	    if (++i >= hislen)
-		i = 0;
-	    history[type][last_i] = history[type][i];
-	    last_i = i;
-	}
-	history[type][i].hisnum = ++hisnum[type];
-	history[type][i].viminfo = FALSE;
-	history[type][i].hisstr = str;
-	history[type][i].time_set = vim_time();
-	return TRUE;
-    }
-    return FALSE;
-}
-
-/*
- * Convert history name (from table above) to its HIST_ equivalent.
- * When "name" is empty, return "cmd" history.
- * Returns -1 for unknown history name.
- */
-    int
-get_histtype(char_u *name)
-{
-    int		i;
-    int		len = (int)STRLEN(name);
-
-    /* No argument: use current history. */
-    if (len == 0)
-	return hist_char2type(ccline.cmdfirstc);
-
-    for (i = 0; history_names[i] != NULL; ++i)
-	if (STRNICMP(name, history_names[i], len) == 0)
-	    return i;
-
-    if (vim_strchr((char_u *)":=@>?/", name[0]) != NULL && name[1] == NUL)
-	return hist_char2type(name[0]);
-
-    return -1;
-}
-
-static int	last_maptick = -1;	/* last seen maptick */
-
-/*
- * Add the given string to the given history.  If the string is already in the
- * history then it is moved to the front.  "histype" may be one of he HIST_
- * values.
- */
-    void
-add_to_history(
-    int		histype,
-    char_u	*new_entry,
-    int		in_map,		/* consider maptick when inside a mapping */
-    int		sep)		/* separator character used (search hist) */
-{
-    histentry_T	*hisptr;
-    int		len;
-
-    if (hislen == 0)		/* no history */
-	return;
-
-    if (cmdmod.keeppatterns && histype == HIST_SEARCH)
-	return;
-
-    /*
-     * Searches inside the same mapping overwrite each other, so that only
-     * the last line is kept.  Be careful not to remove a line that was moved
-     * down, only lines that were added.
-     */
-    if (histype == HIST_SEARCH && in_map)
-    {
-	if (maptick == last_maptick && hisidx[HIST_SEARCH] >= 0)
-	{
-	    /* Current line is from the same mapping, remove it */
-	    hisptr = &history[HIST_SEARCH][hisidx[HIST_SEARCH]];
-	    vim_free(hisptr->hisstr);
-	    clear_hist_entry(hisptr);
-	    --hisnum[histype];
-	    if (--hisidx[HIST_SEARCH] < 0)
-		hisidx[HIST_SEARCH] = hislen - 1;
-	}
-	last_maptick = -1;
-    }
-    if (!in_history(histype, new_entry, TRUE, sep, FALSE))
-    {
-	if (++hisidx[histype] == hislen)
-	    hisidx[histype] = 0;
-	hisptr = &history[histype][hisidx[histype]];
-	vim_free(hisptr->hisstr);
-
-	/* Store the separator after the NUL of the string. */
-	len = (int)STRLEN(new_entry);
-	hisptr->hisstr = vim_strnsave(new_entry, len + 2);
-	if (hisptr->hisstr != NULL)
-	    hisptr->hisstr[len + 1] = sep;
-
-	hisptr->hisnum = ++hisnum[histype];
-	hisptr->viminfo = FALSE;
-	hisptr->time_set = vim_time();
-	if (histype == HIST_SEARCH && in_map)
-	    last_maptick = maptick;
-    }
-}
-
-#if defined(FEAT_EVAL) || defined(PROTO)
-
-/*
- * Get identifier of newest history entry.
- * "histype" may be one of the HIST_ values.
- */
-    int
-get_history_idx(int histype)
-{
-    if (hislen == 0 || histype < 0 || histype >= HIST_COUNT
-		    || hisidx[histype] < 0)
-	return -1;
-
-    return history[histype][hisidx[histype]].hisnum;
-}
-
-/*
- * Calculate history index from a number:
- *   num > 0: seen as identifying number of a history entry
- *   num < 0: relative position in history wrt newest entry
- * "histype" may be one of the HIST_ values.
- */
-    static int
-calc_hist_idx(int histype, int num)
-{
-    int		i;
-    histentry_T	*hist;
-    int		wrapped = FALSE;
-
-    if (hislen == 0 || histype < 0 || histype >= HIST_COUNT
-		    || (i = hisidx[histype]) < 0 || num == 0)
-	return -1;
-
-    hist = history[histype];
-    if (num > 0)
-    {
-	while (hist[i].hisnum > num)
-	    if (--i < 0)
-	    {
-		if (wrapped)
-		    break;
-		i += hislen;
-		wrapped = TRUE;
-	    }
-	if (hist[i].hisnum == num && hist[i].hisstr != NULL)
-	    return i;
-    }
-    else if (-num <= hislen)
-    {
-	i += num + 1;
-	if (i < 0)
-	    i += hislen;
-	if (hist[i].hisstr != NULL)
-	    return i;
-    }
-    return -1;
-}
-
-/*
- * Get a history entry by its index.
- * "histype" may be one of the HIST_ values.
- */
-    char_u *
-get_history_entry(int histype, int idx)
-{
-    idx = calc_hist_idx(histype, idx);
-    if (idx >= 0)
-	return history[histype][idx].hisstr;
-    else
-	return (char_u *)"";
-}
-
-/*
- * Clear all entries of a history.
- * "histype" may be one of the HIST_ values.
- */
-    int
-clr_history(int histype)
-{
-    int		i;
-    histentry_T	*hisptr;
-
-    if (hislen != 0 && histype >= 0 && histype < HIST_COUNT)
-    {
-	hisptr = history[histype];
-	for (i = hislen; i--;)
-	{
-	    vim_free(hisptr->hisstr);
-	    clear_hist_entry(hisptr);
-	    hisptr++;
-	}
-	hisidx[histype] = -1;	/* mark history as cleared */
-	hisnum[histype] = 0;	/* reset identifier counter */
-	return OK;
-    }
-    return FAIL;
-}
-
-/*
- * Remove all entries matching {str} from a history.
- * "histype" may be one of the HIST_ values.
- */
-    int
-del_history_entry(int histype, char_u *str)
-{
-    regmatch_T	regmatch;
-    histentry_T	*hisptr;
-    int		idx;
-    int		i;
-    int		last;
-    int		found = FALSE;
-
-    regmatch.regprog = NULL;
-    regmatch.rm_ic = FALSE;	/* always match case */
-    if (hislen != 0
-	    && histype >= 0
-	    && histype < HIST_COUNT
-	    && *str != NUL
-	    && (idx = hisidx[histype]) >= 0
-	    && (regmatch.regprog = vim_regcomp(str, RE_MAGIC + RE_STRING))
-								      != NULL)
-    {
-	i = last = idx;
-	do
-	{
-	    hisptr = &history[histype][i];
-	    if (hisptr->hisstr == NULL)
-		break;
-	    if (vim_regexec(&regmatch, hisptr->hisstr, (colnr_T)0))
-	    {
-		found = TRUE;
-		vim_free(hisptr->hisstr);
-		clear_hist_entry(hisptr);
-	    }
-	    else
-	    {
-		if (i != last)
-		{
-		    history[histype][last] = *hisptr;
-		    clear_hist_entry(hisptr);
-		}
-		if (--last < 0)
-		    last += hislen;
-	    }
-	    if (--i < 0)
-		i += hislen;
-	} while (i != idx);
-	if (history[histype][idx].hisstr == NULL)
-	    hisidx[histype] = -1;
-    }
-    vim_regfree(regmatch.regprog);
-    return found;
-}
-
-/*
- * Remove an indexed entry from a history.
- * "histype" may be one of the HIST_ values.
- */
-    int
-del_history_idx(int histype, int idx)
-{
-    int	    i, j;
-
-    i = calc_hist_idx(histype, idx);
-    if (i < 0)
-	return FALSE;
-    idx = hisidx[histype];
-    vim_free(history[histype][i].hisstr);
-
-    /* When deleting the last added search string in a mapping, reset
-     * last_maptick, so that the last added search string isn't deleted again.
-     */
-    if (histype == HIST_SEARCH && maptick == last_maptick && i == idx)
-	last_maptick = -1;
-
-    while (i != idx)
-    {
-	j = (i + 1) % hislen;
-	history[histype][i] = history[histype][j];
-	i = j;
-    }
-    clear_hist_entry(&history[histype][i]);
-    if (--i < 0)
-	i += hislen;
-    hisidx[histype] = i;
-    return TRUE;
-}
-
-#endif /* FEAT_EVAL */
-
-#if defined(FEAT_CRYPT) || defined(PROTO)
-/*
- * Very specific function to remove the value in ":set key=val" from the
- * history.
- */
-    void
-remove_key_from_history(void)
-{
-    char_u	*p;
-    int		i;
-
-    i = hisidx[HIST_CMD];
-    if (i < 0)
-	return;
-    p = history[HIST_CMD][i].hisstr;
-    if (p != NULL)
-	for ( ; *p; ++p)
-	    if (STRNCMP(p, "key", 3) == 0 && !isalpha(p[3]))
-	    {
-		p = vim_strchr(p + 3, '=');
-		if (p == NULL)
-		    break;
-		++p;
-		for (i = 0; p[i] && !VIM_ISWHITE(p[i]); ++i)
-		    if (p[i] == '\\' && p[i + 1])
-			++i;
-		STRMOVE(p, p + i);
-		--p;
-	    }
-}
-#endif
-
-#endif /* FEAT_CMDHIST */
-
 #if defined(FEAT_EVAL) || defined(FEAT_CMDWIN) || defined(PROTO)
 /*
  * Get pointer to the command line info to use. save_ccline() may clear
@@ -6498,7 +5949,15 @@
 }
 #endif
 
-#if defined(FEAT_QUICKFIX) || defined(FEAT_CMDHIST) || defined(PROTO)
+/*
+ * Return the first character of the current command line.
+ */
+    int
+get_cmdline_firstc(void)
+{
+    return ccline.cmdfirstc;
+}
+
 /*
  * Get indices "num1,num2" that specify a range within a list (not a range of
  * text lines in a buffer!) from a string.  Used for ":history" and ":clist".
@@ -6536,136 +5995,6 @@
 	*num2 = *num1;
     return OK;
 }
-#endif
-
-#if defined(FEAT_CMDHIST) || defined(PROTO)
-/*
- * :history command - print a history
- */
-    void
-ex_history(exarg_T *eap)
-{
-    histentry_T	*hist;
-    int		histype1 = HIST_CMD;
-    int		histype2 = HIST_CMD;
-    int		hisidx1 = 1;
-    int		hisidx2 = -1;
-    int		idx;
-    int		i, j, k;
-    char_u	*end;
-    char_u	*arg = eap->arg;
-
-    if (hislen == 0)
-    {
-	msg(_("'history' option is zero"));
-	return;
-    }
-
-    if (!(VIM_ISDIGIT(*arg) || *arg == '-' || *arg == ','))
-    {
-	end = arg;
-	while (ASCII_ISALPHA(*end)
-		|| vim_strchr((char_u *)":=@>/?", *end) != NULL)
-	    end++;
-	i = *end;
-	*end = NUL;
-	histype1 = get_histtype(arg);
-	if (histype1 == -1)
-	{
-	    if (STRNICMP(arg, "all", STRLEN(arg)) == 0)
-	    {
-		histype1 = 0;
-		histype2 = HIST_COUNT-1;
-	    }
-	    else
-	    {
-		*end = i;
-		emsg(_(e_trailing));
-		return;
-	    }
-	}
-	else
-	    histype2 = histype1;
-	*end = i;
-    }
-    else
-	end = arg;
-    if (!get_list_range(&end, &hisidx1, &hisidx2) || *end != NUL)
-    {
-	emsg(_(e_trailing));
-	return;
-    }
-
-    for (; !got_int && histype1 <= histype2; ++histype1)
-    {
-	STRCPY(IObuff, "\n      #  ");
-	STRCAT(STRCAT(IObuff, history_names[histype1]), " history");
-	msg_puts_title((char *)IObuff);
-	idx = hisidx[histype1];
-	hist = history[histype1];
-	j = hisidx1;
-	k = hisidx2;
-	if (j < 0)
-	    j = (-j > hislen) ? 0 : hist[(hislen+j+idx+1) % hislen].hisnum;
-	if (k < 0)
-	    k = (-k > hislen) ? 0 : hist[(hislen+k+idx+1) % hislen].hisnum;
-	if (idx >= 0 && j <= k)
-	    for (i = idx + 1; !got_int; ++i)
-	    {
-		if (i == hislen)
-		    i = 0;
-		if (hist[i].hisstr != NULL
-			&& hist[i].hisnum >= j && hist[i].hisnum <= k)
-		{
-		    msg_putchar('\n');
-		    sprintf((char *)IObuff, "%c%6d  ", i == idx ? '>' : ' ',
-							      hist[i].hisnum);
-		    if (vim_strsize(hist[i].hisstr) > (int)Columns - 10)
-			trunc_string(hist[i].hisstr, IObuff + STRLEN(IObuff),
-			     (int)Columns - 10, IOSIZE - (int)STRLEN(IObuff));
-		    else
-			STRCAT(IObuff, hist[i].hisstr);
-		    msg_outtrans(IObuff);
-		    out_flush();
-		}
-		if (i == idx)
-		    break;
-	    }
-    }
-}
-#endif
-
-#if (defined(FEAT_VIMINFO) && defined(FEAT_CMDHIST)) || defined(PROTO)
-    int
-get_hislen(void)
-{
-    return hislen;
-}
-
-    histentry_T *
-get_histentry(int hist_type)
-{
-    return history[hist_type];
-}
-
-    void
-set_histentry(int hist_type, histentry_T *entry)
-{
-    history[hist_type] = entry;
-}
-
-    int *
-get_hisidx(int hist_type)
-{
-    return &hisidx[hist_type];
-}
-
-    int *
-get_hisnum(int hist_type)
-{
-    return &hisnum[hist_type];
-}
-#endif
 
 #if defined(FEAT_CMDWIN) || defined(PROTO)
 /*
@@ -6774,21 +6103,21 @@
 
     /* Fill the buffer with the history. */
     init_history();
-    if (hislen > 0)
+    if (get_hislen() > 0)
     {
-	i = hisidx[histtype];
+	i = *get_hisidx(histtype);
 	if (i >= 0)
 	{
 	    lnum = 0;
 	    do
 	    {
-		if (++i == hislen)
+		if (++i == get_hislen())
 		    i = 0;
-		if (history[histtype][i].hisstr != NULL)
-		    ml_append(lnum++, history[histtype][i].hisstr,
+		if (get_histentry(histtype)[i].hisstr != NULL)
+		    ml_append(lnum++, get_histentry(histtype)[i].hisstr,
 							   (colnr_T)0, FALSE);
 	    }
-	    while (i != hisidx[histtype]);
+	    while (i != *get_hisidx(histtype));
 	}
     }
 
diff --git a/src/feature.h b/src/feature.h
index e2166a1..89d6cae 100644
--- a/src/feature.h
+++ b/src/feature.h
@@ -102,10 +102,8 @@
 
 /*
  * +cmdhist		Command line history.
+ *			Now always included.
  */
-#ifdef FEAT_SMALL
-# define FEAT_CMDHIST
-#endif
 
 /*
  * Message history is fixed at 200 message, 20 for the tiny version.
@@ -123,8 +121,7 @@
 # define FEAT_JUMPLIST
 #endif
 
-/* the cmdline-window requires FEAT_CMDHIST */
-#if defined(FEAT_CMDHIST)
+#if defined(FEAT_SMALL)
 # define FEAT_CMDWIN
 #endif
 
diff --git a/src/globals.h b/src/globals.h
index e6a5bb2..a07ab40 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1097,9 +1097,7 @@
 					    // start insert mode soon
 EXTERN char_u	*last_cmdline INIT(= NULL); // last command line (for ":)
 EXTERN char_u	*repeat_cmdline INIT(= NULL); // command line for "."
-#ifdef FEAT_CMDHIST
 EXTERN char_u	*new_last_cmdline INIT(= NULL);	// new value for last_cmdline
-#endif
 EXTERN char_u	*autocmd_fname INIT(= NULL); // fname for <afile> on cmdline
 EXTERN int	autocmd_fname_full;	     // autocmd_fname is full path
 EXTERN int	autocmd_bufnr INIT(= 0);     // fnum for <abuf> on cmdline
diff --git a/src/misc2.c b/src/misc2.c
index f5284c3..eb6cf55 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -1139,16 +1139,12 @@
     vim_regfree(clip_exclude_prog);
 # endif
     vim_free(last_cmdline);
-# ifdef FEAT_CMDHIST
     vim_free(new_last_cmdline);
-# endif
     set_keep_msg(NULL, 0);
 
     /* Clear cmdline history. */
     p_hi = 0;
-# ifdef FEAT_CMDHIST
     init_history();
-# endif
 # ifdef FEAT_TEXT_PROP
     clear_global_prop_types();
 # endif
diff --git a/src/normal.c b/src/normal.c
index acc5b64..f717e8c 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -5736,11 +5736,11 @@
 		    ? vim_iswordp(mb_prevptr(ml_get_curline(), ptr))
 		    : vim_iswordc(ptr[-1])))
 	    STRCAT(buf, "\\>");
-#ifdef FEAT_CMDHIST
-	/* put pattern in search history */
+
+	// put pattern in search history
 	init_history();
 	add_to_history(HIST_SEARCH, buf, TRUE, NUL);
-#endif
+
 	(void)normal_search(cap, cmdchar == '*' ? '/' : '?', buf, 0);
     }
     else
diff --git a/src/ops.c b/src/ops.c
index 29ade3f..8f6130c 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -1233,7 +1233,6 @@
     if (regname == '_')
 	return OK;
 
-#ifdef FEAT_CMDHIST
     // use last command line
     if (regname == ':')
     {
@@ -1262,7 +1261,6 @@
 	}
 	vim_free(p);
     }
-#endif
 #ifdef FEAT_EVAL
     else if (regname == '=')
     {
diff --git a/src/option.c b/src/option.c
index bf253a4..4ad558a 100644
--- a/src/option.c
+++ b/src/option.c
@@ -6745,11 +6745,10 @@
     /* 'cryptkey' */
     else if (gvarp == &p_key)
     {
-# if defined(FEAT_CMDHIST)
-	/* Make sure the ":set" command doesn't show the new value in the
-	 * history. */
+	// Make sure the ":set" command doesn't show the new value in the
+	// history.
 	remove_key_from_history();
-# endif
+
 	if (STRCMP(curbuf->b_p_key, oldval) != 0)
 	    /* Need to update the swapfile. */
 	    ml_set_crypt_key(curbuf, oldval,
diff --git a/src/proto.h b/src/proto.h
index 34ef9cc..f6f5319 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -65,6 +65,7 @@
 # include "buffer.pro"
 # include "change.pro"
 # include "charset.pro"
+# include "cmdhist.pro"
 # ifdef FEAT_CSCOPE
 #  include "if_cscope.pro"
 # endif
diff --git a/src/proto/cmdhist.pro b/src/proto/cmdhist.pro
new file mode 100644
index 0000000..1c33f4a
--- /dev/null
+++ b/src/proto/cmdhist.pro
@@ -0,0 +1,19 @@
+/* cmdhist.c */
+int get_hislen(void);
+histentry_T *get_histentry(int hist_type);
+void set_histentry(int hist_type, histentry_T *entry);
+int *get_hisidx(int hist_type);
+int *get_hisnum(int hist_type);
+int hist_char2type(int c);
+char_u *get_history_arg(expand_T *xp, int idx);
+void init_history(void);
+void clear_hist_entry(histentry_T *hisptr);
+int in_history(int type, char_u *str, int move_to_front, int sep, int writing);
+void add_to_history(int histype, char_u *new_entry, int in_map, int sep);
+void remove_key_from_history(void);
+void ex_history(exarg_T *eap);
+void f_histadd(typval_T *argvars, typval_T *rettv);
+void f_histdel(typval_T *argvars, typval_T *rettv);
+void f_histget(typval_T *argvars, typval_T *rettv);
+void f_histnr(typval_T *argvars, typval_T *rettv);
+/* vim: set ft=c : */
diff --git a/src/proto/ex_getln.pro b/src/proto/ex_getln.pro
index cd30ed8..66e634b 100644
--- a/src/proto/ex_getln.pro
+++ b/src/proto/ex_getln.pro
@@ -34,28 +34,11 @@
 int expand_cmdline(expand_T *xp, char_u *str, int col, int *matchcount, char_u ***matches);
 int ExpandGeneric(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file, char_u *((*func)(expand_T *, int)), int escaped);
 void globpath(char_u *path, char_u *file, garray_T *ga, int expand_options);
-int hist_char2type(int c);
-void init_history(void);
-void clear_hist_entry(histentry_T *hisptr);
-int in_history(int type, char_u *str, int move_to_front, int sep, int writing);
-int get_histtype(char_u *name);
-void add_to_history(int histype, char_u *new_entry, int in_map, int sep);
-int get_history_idx(int histype);
-char_u *get_history_entry(int histype, int idx);
-int clr_history(int histype);
-int del_history_entry(int histype, char_u *str);
-int del_history_idx(int histype, int idx);
-void remove_key_from_history(void);
 char_u *get_cmdline_str(void);
 int get_cmdline_pos(void);
 int set_cmdline_pos(int pos);
 int get_cmdline_type(void);
+int get_cmdline_firstc(void);
 int get_list_range(char_u **str, int *num1, int *num2);
-void ex_history(exarg_T *eap);
-int get_hislen(void);
-histentry_T *get_histentry(int hist_type);
-void set_histentry(int hist_type, histentry_T *entry);
-int *get_hisidx(int hist_type);
-int *get_hisnum(int hist_type);
 char_u *script_get(exarg_T *eap, char_u *cmd);
 /* vim: set ft=c : */
diff --git a/src/search.c b/src/search.c
index 88b6c09..da64e65 100644
--- a/src/search.c
+++ b/src/search.c
@@ -143,10 +143,8 @@
 	magic = spats[i].magic;
 	no_smartcase = spats[i].no_scs;
     }
-#ifdef FEAT_CMDHIST
     else if (options & SEARCH_HIS)	/* put new pattern in history */
 	add_to_history(HIST_SEARCH, pat, TRUE, NUL);
-#endif
 
 #ifdef FEAT_RIGHTLEFT
     if (mr_pattern_alloced)
diff --git a/src/tag.c b/src/tag.c
index 0c36db9..147d837 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -3543,12 +3543,6 @@
 	    p_ws = TRUE;	/* need 'wrapscan' for backward searches */
 	    p_ic = FALSE;	/* don't ignore case now */
 	    p_scs = FALSE;
-#if 0	/* disabled for now */
-#ifdef FEAT_CMDHIST
-	    /* put pattern in search history */
-	    add_to_history(HIST_SEARCH, pbuf + 1, TRUE, pbuf[0]);
-#endif
-#endif
 	    save_lnum = curwin->w_cursor.lnum;
 	    curwin->w_cursor.lnum = 0;	/* start search before first line */
 	    if (do_search(NULL, pbuf[0], pbuf + 1, (long)1,
diff --git a/src/usercmd.c b/src/usercmd.c
index c04c80e..f43a0a5 100644
--- a/src/usercmd.c
+++ b/src/usercmd.c
@@ -69,9 +69,7 @@
     {EXPAND_FUNCTIONS, "function"},
     {EXPAND_HELP, "help"},
     {EXPAND_HIGHLIGHT, "highlight"},
-#if defined(FEAT_CMDHIST)
     {EXPAND_HISTORY, "history"},
-#endif
 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
     {EXPAND_LOCALES, "locale"},
 #endif
diff --git a/src/version.c b/src/version.c
index 0e1641c..ec53de2 100644
--- a/src/version.c
+++ b/src/version.c
@@ -163,11 +163,7 @@
 #else
 	"-cmdline_compl",
 #endif
-#ifdef FEAT_CMDHIST
 	"+cmdline_hist",
-#else
-	"-cmdline_hist",
-#endif
 #ifdef FEAT_CMDL_INFO
 	"+cmdline_info",
 #else
@@ -774,6 +770,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1823,
+/**/
     1822,
 /**/
     1821,
diff --git a/src/viminfo.c b/src/viminfo.c
index 1b09414..608c5cc 100644
--- a/src/viminfo.c
+++ b/src/viminfo.c
@@ -427,7 +427,6 @@
     vim_free(line);
 }
 
-#if defined(FEAT_CMDHIST) || defined(PROTO)
 /*
  * Buffers for history read from a viminfo file.  Only valid while reading.
  */
@@ -913,7 +912,6 @@
 	viminfo_hisidx[type] = 0;
     }
 }
-#endif // FEAT_CMDHIST
 
     static void
 write_viminfo_barlines(vir_T *virp, FILE *fp_out)
@@ -2756,9 +2754,7 @@
     buf_T	*buf;
     int		got_encoding = FALSE;
 
-#ifdef FEAT_CMDHIST
     prepare_viminfo_history(forceit ? 9999 : 0, writing);
-#endif
 
     eof = viminfo_readline(virp);
     while (!eof && virp->vir_line[0] != '>')
@@ -2817,13 +2813,11 @@
 	    case '?':
 	    case '=':
 	    case '@':
-#ifdef FEAT_CMDHIST
 		// When history is in bar lines skip the old style history
 		// lines.
 		if (virp->vir_version < VIMINFO_VERSION_WITH_HISTORY)
 		    eof = read_viminfo_history(virp, writing);
 		else
-#endif
 		    eof = viminfo_readline(virp);
 		break;
 	    case '-':
@@ -2844,11 +2838,9 @@
 	}
     }
 
-#ifdef FEAT_CMDHIST
     // Finish reading history items.
     if (!writing)
 	finish_viminfo_history(virp);
-#endif
 
     // Change file names to buffer numbers for fmarks.
     FOR_ALL_BUFFERS(buf)
@@ -2913,9 +2905,7 @@
 	fprintf(fp_out, "*encoding=%s\n\n", p_enc);
 	write_viminfo_search_pattern(fp_out);
 	write_viminfo_sub_string(fp_out);
-#ifdef FEAT_CMDHIST
 	write_viminfo_history(fp_out, merge);
-#endif
 	write_viminfo_registers(fp_out);
 	finish_viminfo_registers();
 #ifdef FEAT_EVAL
