/* ex_getln.c */
extern char_u *getcmdline __ARGS((int firstc, long count, int indent));
extern char_u *getcmdline_prompt __ARGS((int firstc, char_u *prompt, int attr, int xp_context, char_u *xp_arg));
extern int text_locked __ARGS((void));
extern void text_locked_msg __ARGS((void));
extern int curbuf_locked __ARGS((void));
extern char_u *getexline __ARGS((int c, void *dummy, int indent));
extern char_u *getexmodeline __ARGS((int promptc, void *dummy, int indent));
extern int cmdline_overstrike __ARGS((void));
extern int cmdline_at_end __ARGS((void));
extern colnr_T cmdline_getvcol_cursor __ARGS((void));
extern void free_cmdline_buf __ARGS((void));
extern void putcmdline __ARGS((int c, int shift));
extern void unputcmdline __ARGS((void));
extern int put_on_cmdline __ARGS((char_u *str, int len, int redraw));
extern void cmdline_paste_str __ARGS((char_u *s, int literally));
extern void redrawcmdline __ARGS((void));
extern void redrawcmd __ARGS((void));
extern void compute_cmdrow __ARGS((void));
extern void gotocmdline __ARGS((int clr));
extern char_u *ExpandOne __ARGS((expand_T *xp, char_u *str, char_u *orig, int options, int mode));
extern void ExpandInit __ARGS((expand_T *xp));
extern void ExpandCleanup __ARGS((expand_T *xp));
extern void ExpandEscape __ARGS((expand_T *xp, char_u *str, int numfiles, char_u **files, int options));
extern void tilde_replace __ARGS((char_u *orig_pat, int num_files, char_u **files));
extern char_u *sm_gettail __ARGS((char_u *s));
extern char_u *addstar __ARGS((char_u *fname, int len, int context));
extern void set_cmd_context __ARGS((expand_T *xp, char_u *str, int len, int col));
extern int expand_cmdline __ARGS((expand_T *xp, char_u *str, int col, int *matchcount, char_u ***matches));
extern int ExpandGeneric __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file, char_u *((*func)(expand_T *, int))));
extern char_u *globpath __ARGS((char_u *path, char_u *file));
extern void init_history __ARGS((void));
extern int get_histtype __ARGS((char_u *name));
extern void add_to_history __ARGS((int histype, char_u *new_entry, int in_map, int sep));
extern int get_history_idx __ARGS((int histype));
extern char_u *get_cmdline_str __ARGS((void));
extern int get_cmdline_pos __ARGS((void));
extern int set_cmdline_pos __ARGS((int pos));
extern int get_cmdline_type __ARGS((void));
extern char_u *get_history_entry __ARGS((int histype, int idx));
extern int clr_history __ARGS((int histype));
extern int del_history_entry __ARGS((int histype, char_u *str));
extern int del_history_idx __ARGS((int histype, int idx));
extern void remove_key_from_history __ARGS((void));
extern int get_list_range __ARGS((char_u **str, int *num1, int *num2));
extern void ex_history __ARGS((exarg_T *eap));
extern void prepare_viminfo_history __ARGS((int asklen));
extern int read_viminfo_history __ARGS((vir_T *virp));
extern void finish_viminfo_history __ARGS((void));
extern void write_viminfo_history __ARGS((FILE *fp));
extern void cmd_pchar __ARGS((int c, int offset));
extern int cmd_gchar __ARGS((int offset));
extern char_u *script_get __ARGS((exarg_T *eap, char_u *cmd));
/* vim: set ft=c : */
