xref: /vim-8.2.3635/src/feature.h (revision f573c6e1)
1 /* vi:set ts=8 sts=4 sw=4 noet:
2  *
3  * VIM - Vi IMproved		by Bram Moolenaar
4  *
5  * Do ":help uganda"  in Vim to read copying and usage conditions.
6  * Do ":help credits" in Vim to see a list of people who contributed.
7  */
8 /*
9  * feature.h: Defines for optional code and preferences
10  *
11  * Edit this file to include/exclude parts of Vim, before compiling.
12  * The only other file that may be edited is Makefile, it contains machine
13  * specific options.
14  *
15  * To include specific options, change the "#if*" and "#endif" into comments,
16  * or uncomment the "#define".
17  * To exclude specific options, change the "#define" into a comment.
18  */
19 
20 /*
21  * When adding a new feature:
22  * - Add a #define below.
23  * - Add a message in the table above ex_version().
24  * - Add a string to f_has().
25  * - Add a feature to ":help feature-list" in doc/eval.txt.
26  * - Add feature to ":help +feature-list" in doc/various.txt.
27  * - Add comment for the documentation of commands that use the feature.
28  */
29 
30 /*
31  * Basic choices:
32  * ==============
33  *
34  * +tiny		almost no features enabled, not even multiple windows
35  * +small		few features enabled, as basic as possible
36  * +normal		A default selection of features enabled
37  * +big			many features enabled, as rich as possible.
38  * +huge		all possible features enabled.
39  *
40  * When +small is used, +tiny is also included.  +normal implies +small, etc.
41  */
42 
43 /*
44  * Uncomment one of these to override the default.  For unix use a configure
45  * argument, see Makefile.
46  */
47 #if !defined(FEAT_TINY) && !defined(FEAT_SMALL) && !defined(FEAT_NORMAL) \
48 	&& !defined(FEAT_BIG) && !defined(FEAT_HUGE)
49 // #define FEAT_TINY
50 // #define FEAT_SMALL
51 // #define FEAT_NORMAL
52 // #define FEAT_BIG
53 // #define FEAT_HUGE
54 #endif
55 
56 /*
57  * For Unix, Mac and Win32 use +huge by default.  These days CPUs are fast and
58  * Memory is cheap.
59  * Use +big for older systems: Other MS-Windows and VMS.
60  * Otherwise use +normal
61  */
62 #if !defined(FEAT_TINY) && !defined(FEAT_SMALL) && !defined(FEAT_NORMAL) \
63 	&& !defined(FEAT_BIG) && !defined(FEAT_HUGE)
64 # if defined(UNIX) || defined(MSWIN) || defined(MACOS_X)
65 #  define FEAT_HUGE
66 # else
67 #  if defined(MSWIN) || defined(VMS) || defined(AMIGA)
68 #   define FEAT_BIG
69 #  else
70 #   define FEAT_NORMAL
71 #  endif
72 # endif
73 #endif
74 
75 /*
76  * Each feature implies including the "smaller" ones.
77  */
78 #ifdef FEAT_HUGE
79 # define FEAT_BIG
80 #endif
81 #ifdef FEAT_BIG
82 # define FEAT_NORMAL
83 #endif
84 #ifdef FEAT_NORMAL
85 # define FEAT_SMALL
86 #endif
87 #ifdef FEAT_SMALL
88 # define FEAT_TINY
89 #endif
90 
91 /*
92  * Optional code (see ":help +feature-list")
93  * =============
94  */
95 
96 /*
97  * These features used to be optional but are now always enabled:
98  * +windows		Multiple windows.  Without this there is no help
99  *			window and no status lines.
100  * +vertsplit		Vertically split windows.
101  * +cmdhist		Command line history.
102  * +localmap		Mappings and abbreviations local to a buffer.
103  * +visual		Visual mode
104  * +visualextra		Extra features for Visual mode (mostly block operators).
105  * +virtualedit		'virtualedit' option and its implementation
106  * +user_commands	Allow the user to define his own commands.
107  * +multi_byte		Generic multi-byte character handling.
108  * +cmdline_compl	completion of mappings/abbreviations in cmdline mode.
109  * +insert_expand	CTRL-N/CTRL-P/CTRL-X in insert mode.
110  * +modify_fname	modifiers for file name.  E.g., "%:p:h".
111  * +comments		'comments' option.
112  *
113  * Obsolete:
114  * +tag_old_static	Old style static tags: "file:tag  file  ..".
115  *			Support was removed in 8.1.1093.
116  * +farsi		Farsi (Persian language) Keymap support.
117  *			Removed in patch 8.1.0932
118  */
119 
120 /*
121  * Message history is fixed at 200 message, 20 for the tiny version.
122  */
123 #ifdef FEAT_SMALL
124 # define MAX_MSG_HIST_LEN 200
125 #else
126 # define MAX_MSG_HIST_LEN 20
127 #endif
128 
129 /*
130  * +jumplist		Jumplist, CTRL-O and CTRL-I commands.
131  */
132 #ifdef FEAT_SMALL
133 # define FEAT_JUMPLIST
134 #endif
135 
136 #if defined(FEAT_SMALL)
137 # define FEAT_CMDWIN
138 #endif
139 
140 /*
141  * +folding		Fold lines.
142  */
143 #ifdef FEAT_NORMAL
144 # define FEAT_FOLDING
145 #endif
146 
147 /*
148  * +digraphs		Digraphs.
149  *			In insert mode and on the command line you will be
150  *			able to use digraphs. The CTRL-K command will work.
151  *			Define OLD_DIGRAPHS to get digraphs compatible with
152  *			Vim 5.x.  The new ones are from RFC 1345.
153  */
154 #ifdef FEAT_NORMAL
155 # define FEAT_DIGRAPHS
156 // #define OLD_DIGRAPHS
157 #endif
158 
159 /*
160  * +langmap		'langmap' option.  Only useful when you put your
161  *			keyboard in a special language mode, e.g. for typing
162  *			greek.
163  */
164 #ifdef FEAT_BIG
165 # define FEAT_LANGMAP
166 #endif
167 
168 /*
169  * +keymap		'keymap' option.  Allows you to map typed keys in
170  *			Insert mode for a special language.
171  */
172 #ifdef FEAT_BIG
173 # define FEAT_KEYMAP
174 #endif
175 
176 #ifdef FEAT_NORMAL
177 # define VIM_BACKTICK		// internal backtick expansion
178 #endif
179 
180 /*
181  * +cmdline_info	'showcmd' and 'ruler' options.
182  */
183 #ifdef FEAT_NORMAL
184 # define FEAT_CMDL_INFO
185 #endif
186 
187 /*
188  * +linebreak		'showbreak', 'breakat'  and 'linebreak' options.
189  *			Also 'numberwidth'.
190  */
191 #ifdef FEAT_NORMAL
192 # define FEAT_LINEBREAK
193 #endif
194 
195 /*
196  * +extra_search	'hlsearch' and 'incsearch' options.
197  */
198 #ifdef FEAT_NORMAL
199 # define FEAT_SEARCH_EXTRA
200 #endif
201 
202 /*
203  * +quickfix		Quickfix commands.
204  */
205 #ifdef FEAT_NORMAL
206 # define FEAT_QUICKFIX
207 #endif
208 
209 /*
210  * +file_in_path	"gf" and "<cfile>" commands.
211  */
212 #ifdef FEAT_NORMAL
213 # define FEAT_SEARCHPATH
214 #endif
215 
216 /*
217  * +find_in_path	"[I" ":isearch" "^W^I", ":checkpath", etc.
218  */
219 #ifdef FEAT_NORMAL
220 # ifdef FEAT_SEARCHPATH	// FEAT_SEARCHPATH is required
221 #  define FEAT_FIND_ID
222 # endif
223 #endif
224 
225 /*
226  * +path_extra		up/downwards searching in 'path' and 'tags'.
227  */
228 #ifdef FEAT_NORMAL
229 # define FEAT_PATH_EXTRA
230 #endif
231 
232 /*
233  * +rightleft		Right-to-left editing/typing support.
234  *
235  * Disabled for EBCDIC as it requires multibyte.
236  */
237 #if defined(FEAT_BIG) && !defined(DISABLE_RIGHTLEFT) && !defined(EBCDIC)
238 # define FEAT_RIGHTLEFT
239 #endif
240 
241 /*
242  * +arabic		Arabic keymap and shaping support.
243  *			Requires FEAT_RIGHTLEFT
244  *
245  * Disabled for EBCDIC as it requires multibyte.
246  */
247 #if defined(FEAT_BIG) && !defined(DISABLE_ARABIC) && !defined(EBCDIC)
248 # define FEAT_ARABIC
249 #endif
250 #ifdef FEAT_ARABIC
251 # ifndef FEAT_RIGHTLEFT
252 #   define FEAT_RIGHTLEFT
253 # endif
254 #endif
255 
256 /*
257  * +emacs_tags		When FEAT_EMACS_TAGS defined: Include support for
258  *			emacs style TAGS file.
259  */
260 #ifdef FEAT_BIG
261 # define FEAT_EMACS_TAGS
262 #endif
263 
264 /*
265  * +tag_binary		Can use a binary search for the tags file.
266  *
267  * Disabled for EBCDIC:
268  * On z/OS Unix we have the problem that /bin/sort sorts ASCII instead of
269  * EBCDIC.  With this binary search doesn't work, as VIM expects a tag file
270  * sorted by character values.  I'm not sure how to fix this. Should we really
271  * do a EBCDIC to ASCII conversion for this??
272  */
273 #if !defined(EBCDIC)
274 # define FEAT_TAG_BINS
275 #endif
276 
277 /*
278  * +cscope		Unix only: Cscope support.
279  */
280 #if defined(UNIX) && defined(FEAT_BIG) && !defined(FEAT_CSCOPE) && !defined(MACOS_X)
281 # define FEAT_CSCOPE
282 #endif
283 
284 /*
285  * +eval		Built-in script language and expression evaluation,
286  *			":let", ":if", etc.
287  * +float		Floating point variables.
288  */
289 #ifdef FEAT_NORMAL
290 # define FEAT_EVAL
291 # if defined(HAVE_FLOAT_FUNCS) || defined(MSWIN) || defined(MACOS_X)
292 #  define FEAT_FLOAT
293 # endif
294 #endif
295 
296 #ifdef FEAT_EVAL
297 # define HAVE_SANDBOX
298 #endif
299 
300 /*
301  * +profile		Profiling for functions and scripts.
302  */
303 #if defined(FEAT_HUGE) \
304 	&& defined(FEAT_EVAL) \
305 	&& ((defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)) \
306 		|| defined(MSWIN))
307 # define FEAT_PROFILE
308 #endif
309 
310 /*
311  * +reltime		reltime() function
312  */
313 #if defined(FEAT_NORMAL) \
314 	&& defined(FEAT_EVAL) \
315 	&& ((defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)) \
316 		|| defined(MSWIN))
317 # define FEAT_RELTIME
318 #endif
319 
320 /*
321  * +timers		timer_start()
322  */
323 #if defined(FEAT_RELTIME) && (defined(UNIX) || defined(MSWIN) || defined(VMS) )
324 # define FEAT_TIMERS
325 #endif
326 
327 /*
328  * +textobjects		Text objects: "vaw", "das", etc.
329  */
330 #if defined(FEAT_NORMAL) && defined(FEAT_EVAL)
331 # define FEAT_TEXTOBJ
332 #endif
333 
334 /*
335  *			Insert mode completion with 'completefunc'.
336  */
337 #if defined(FEAT_EVAL)
338 # define FEAT_COMPL_FUNC
339 #endif
340 
341 /*
342  * +printer		":hardcopy" command
343  * +postscript		Printing uses PostScript file output.
344  */
345 #if defined(FEAT_NORMAL) && (defined(MSWIN) || defined(FEAT_EVAL)) \
346 	&& !defined(AMIGA)
347 # define FEAT_PRINTER
348 #endif
349 #if defined(FEAT_PRINTER) && ((defined(MSWIN) && defined(MSWINPS)) \
350 	|| (!defined(MSWIN) && defined(FEAT_EVAL)))
351 # define FEAT_POSTSCRIPT
352 #endif
353 
354 /*
355  * +diff		Displaying diffs in a nice way.
356  *			Requires +windows and +autocmd.
357  */
358 #if defined(FEAT_NORMAL)
359 # define FEAT_DIFF
360 #endif
361 
362 /*
363  * +title		'title' and 'icon' options
364  * +statusline		'statusline', 'rulerformat' and special format of
365  *			'titlestring' and 'iconstring' options.
366  * +byte_offset		'%o' in 'statusline' and builtin functions line2byte()
367  *			and byte2line().
368  *			Note: Required for Macintosh.
369  */
370 #if defined(FEAT_NORMAL)
371 # define FEAT_TITLE
372 #endif
373 
374 #ifdef FEAT_NORMAL
375 # define FEAT_STL_OPT
376 # ifndef FEAT_CMDL_INFO
377 #  define FEAT_CMDL_INFO	// 'ruler' is required for 'statusline'
378 # endif
379 #endif
380 
381 #ifdef FEAT_NORMAL
382 # define FEAT_BYTEOFF
383 #endif
384 
385 /*
386  * +wildignore		'wildignore' and 'backupskip' options
387  *			Needed for Unix to make "crontab -e" work.
388  */
389 #if defined(FEAT_NORMAL) || defined(UNIX)
390 # define FEAT_WILDIGN
391 #endif
392 
393 /*
394  * +wildmenu		'wildmenu' option
395  */
396 #if defined(FEAT_NORMAL)
397 # define FEAT_WILDMENU
398 #endif
399 
400 /*
401  * +viminfo		reading/writing the viminfo file. Takes about 8Kbyte
402  *			of code.
403  * VIMINFO_FILE		Location of user .viminfo file (should start with $).
404  * VIMINFO_FILE2	Location of alternate user .viminfo file.
405  */
406 #ifdef FEAT_NORMAL
407 # define FEAT_VIMINFO
408 // #define VIMINFO_FILE	"$HOME/foo/.viminfo"
409 // #define VIMINFO_FILE2 "~/bar/.viminfo"
410 #endif
411 
412 /*
413  * +syntax		syntax highlighting.  When using this, it's a good
414  *			idea to have +autocmd and +eval too.
415  */
416 #if defined(FEAT_NORMAL) || defined(PROTO)
417 # define FEAT_SYN_HL
418 #endif
419 
420 /*
421  * +conceal		'conceal' option.  Needs syntax highlighting
422  *			as this is how the concealed text is defined.
423  */
424 #if defined(FEAT_BIG) && defined(FEAT_SYN_HL)
425 # define FEAT_CONCEAL
426 #endif
427 
428 /*
429  * +spell		spell checking
430  *
431  * Disabled for EBCDIC: * Doesn't work (SIGSEGV).
432  */
433 #if (defined(FEAT_NORMAL) || defined(PROTO)) && !defined(EBCDIC)
434 # define FEAT_SPELL
435 #endif
436 
437 /*
438  * +builtin_terms	Choose one out of the following four:
439  *
440  * NO_BUILTIN_TCAPS	Do not include any builtin termcap entries (used only
441  *			with HAVE_TGETENT defined).
442  *
443  * (nothing)		Machine specific termcap entries will be included.
444  *
445  * SOME_BUILTIN_TCAPS	Include most useful builtin termcap entries (used only
446  *			with NO_BUILTIN_TCAPS not defined).
447  *			This is the default.
448  *
449  * ALL_BUILTIN_TCAPS	Include all builtin termcap entries
450  *			(used only with NO_BUILTIN_TCAPS not defined).
451  */
452 #ifdef HAVE_TGETENT
453 // #define NO_BUILTIN_TCAPS
454 #endif
455 
456 #if !defined(NO_BUILTIN_TCAPS)
457 # ifdef FEAT_BIG
458 #  define ALL_BUILTIN_TCAPS
459 # else
460 #  define SOME_BUILTIN_TCAPS		// default
461 # endif
462 #endif
463 
464 /*
465  * +lispindent		lisp indenting (From Eric Fischer).
466  * +cindent		C code indenting (From Eric Fischer).
467  * +smartindent		smart C code indenting when the 'si' option is set.
468  *
469  * These two need to be defined when making prototypes.
470  */
471 #if defined(FEAT_NORMAL) || defined(PROTO)
472 # define FEAT_LISP
473 #endif
474 
475 #if defined(FEAT_NORMAL) || defined(PROTO)
476 # define FEAT_CINDENT
477 #endif
478 
479 #ifdef FEAT_NORMAL
480 # define FEAT_SMARTINDENT
481 #endif
482 
483 /*
484  * +cryptv		Encryption (by Mohsin Ahmed <[email protected]>).
485  */
486 #if defined(FEAT_NORMAL) && !defined(FEAT_CRYPT) || defined(PROTO)
487 # define FEAT_CRYPT
488 #endif
489 
490 /*
491  * +mksession		":mksession" command.
492  *			fully depends on +eval
493  */
494 #if defined(FEAT_EVAL)
495 # define FEAT_SESSION
496 #endif
497 
498 /*
499  * +multi_lang		Multi language support. ":menutrans", ":language", etc.
500  * +gettext		Message translations (requires +multi_lang)
501  *			(only when "lang" archive unpacked)
502  */
503 #ifdef FEAT_NORMAL
504 # define FEAT_MULTI_LANG
505 #endif
506 #if defined(HAVE_GETTEXT) && defined(FEAT_MULTI_LANG) \
507 	&& (defined(HAVE_LOCALE_H) || defined(X_LOCALE))
508 # define FEAT_GETTEXT
509 #endif
510 
511 /*
512  * +multi_byte_ime	Win32 IME input method.  Only for far-east Windows, so
513  *			IME can be used to input chars.  Not tested much!
514  */
515 #if defined(FEAT_GUI_MSWIN) && !defined(FEAT_MBYTE_IME)
516 // #define FEAT_MBYTE_IME
517 #endif
518 
519 #if defined(FEAT_BIG) && defined(FEAT_GUI_HAIKU) && !defined(FEAT_MBYTE_IME)
520 # define FEAT_MBYTE_IME
521 #endif
522 
523 // Use iconv() when it's available.
524 #if (defined(HAVE_ICONV_H) && defined(HAVE_ICONV)) || defined(DYNAMIC_ICONV)
525 # define USE_ICONV
526 #endif
527 
528 /*
529  * +xim			X Input Method.  For entering special languages like
530  *			chinese and Japanese.
531  *			this is for Unix and VMS only.
532  */
533 #ifndef FEAT_XIM
534 // #define FEAT_XIM
535 #endif
536 
537 #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
538 # define USE_XIM 1		// needed for GTK include files
539 #endif
540 
541 #if defined(FEAT_XIM)
542 // # define X_LOCALE			// for OS with incomplete locale
543 					// support, like old linux versions.
544 #endif
545 
546 /*
547  * +xfontset		X fontset support.  For outputting wide characters.
548  */
549 #ifndef FEAT_XFONTSET
550 # if defined(HAVE_X11) && !defined(FEAT_GUI_GTK)
551 #  define FEAT_XFONTSET
552 # else
553 // #  define FEAT_XFONTSET
554 # endif
555 #endif
556 
557 /*
558  * +libcall		libcall() function
559  */
560 // Using dlopen() also requires dlsym() to be available.
561 #if defined(HAVE_DLOPEN) && defined(HAVE_DLSYM)
562 # define USE_DLOPEN
563 #endif
564 #if defined(FEAT_EVAL) && (defined(MSWIN) || ((defined(UNIX) || defined(VMS)) \
565 	&& (defined(USE_DLOPEN) || defined(HAVE_SHL_LOAD))))
566 # define FEAT_LIBCALL
567 #endif
568 
569 /*
570  * +menu		":menu" command
571  */
572 #ifdef FEAT_NORMAL
573 # define FEAT_MENU
574 # ifdef FEAT_GUI_MSWIN
575 #  define FEAT_TEAROFF
576 # endif
577 #endif
578 
579 /*
580  * popup menu in a terminal
581  */
582 #if defined(FEAT_MENU) && !defined(ALWAYS_USE_GUI)
583 # define FEAT_TERM_POPUP_MENU
584 #endif
585 
586 /*
587  * sound - currently only with libcanberra
588  */
589 #if !defined(FEAT_SOUND) && defined(HAVE_CANBERRA)
590 # define FEAT_SOUND
591 #endif
592 #if defined(FEAT_SOUND) && defined(HAVE_CANBERRA)
593 # define FEAT_SOUND_CANBERRA
594 #endif
595 
596 /*
597  * libsodium - add cryptography support
598  */
599 #if defined(HAVE_SODIUM) && defined(FEAT_BIG)
600 # define FEAT_SODIUM
601 #endif
602 
603 // There are two ways to use XPM.
604 #if (defined(HAVE_XM_XPMP_H) && defined(FEAT_GUI_MOTIF)) \
605 		|| defined(HAVE_X11_XPM_H)
606 # define HAVE_XPM 1
607 #endif
608 
609 /*
610  * +toolbar		Include code for a toolbar (for the Win32 GUI, GTK
611  *			always has it).  But only if menus are enabled.
612  */
613 #if defined(FEAT_NORMAL) && defined(FEAT_MENU) \
614 	&& (defined(FEAT_GUI_GTK) \
615 		|| defined(FEAT_GUI_MSWIN) \
616 		|| ((defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) \
617 			&& defined(HAVE_XPM)) \
618 		|| defined(FEAT_GUI_PHOTON) \
619 		|| defined(FEAT_GUI_HAIKU))
620 
621 # define FEAT_TOOLBAR
622 #endif
623 
624 
625 #if defined(FEAT_TOOLBAR) && !defined(FEAT_MENU)
626 # define FEAT_MENU
627 #endif
628 
629 /*
630  * GUI dark theme variant
631  */
632 #if defined(FEAT_GUI_GTK) && defined(USE_GTK3)
633 # define FEAT_GUI_DARKTHEME
634 #endif
635 
636 /*
637  * GUI tabline
638  */
639 #if defined(FEAT_NORMAL) \
640     && (defined(FEAT_GUI_GTK) \
641 	|| (defined(FEAT_GUI_MOTIF) && defined(HAVE_XM_NOTEBOOK_H)) \
642 	|| defined(FEAT_GUI_HAIKU) \
643 	|| (defined(FEAT_GUI_MSWIN) \
644 	    && (!defined(_MSC_VER) || _MSC_VER > 1020)))
645 # define FEAT_GUI_TABLINE
646 #endif
647 
648 /*
649  * +browse		":browse" command.
650  *			or just the ":browse" command modifier
651  */
652 #if defined(FEAT_NORMAL)
653 # define FEAT_BROWSE_CMD
654 # if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) \
655 	|| defined(FEAT_GUI_GTK) || defined(FEAT_GUI_HAIKU) || defined(FEAT_GUI_PHOTON)
656 #  define FEAT_BROWSE
657 # endif
658 #endif
659 
660 /*
661  * On some systems, when we compile with the GUI, we always use it.  On Mac
662  * there is no terminal version, and on Windows we can't figure out how to
663  * fork one off with :gui.
664  */
665 #if defined(FEAT_GUI_MSWIN) && !defined(VIMDLL)
666 # define ALWAYS_USE_GUI
667 #endif
668 
669 /*
670  * +dialog_gui		Use GUI dialog.
671  * +dialog_con		May use Console dialog.
672  *			When none of these defined there is no dialog support.
673  */
674 #ifdef FEAT_NORMAL
675 # if ((defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MOTIF)) \
676 		&& defined(HAVE_X11_XPM_H)) \
677 	|| defined(FEAT_GUI_GTK) \
678 	|| defined(FEAT_GUI_PHOTON) \
679 	|| defined(FEAT_GUI_HAIKU) \
680 	|| defined(FEAT_GUI_MSWIN)
681 #  define FEAT_CON_DIALOG
682 #  define FEAT_GUI_DIALOG
683 # else
684 #  define FEAT_CON_DIALOG
685 # endif
686 #endif
687 #if !defined(FEAT_GUI_DIALOG) && (defined(FEAT_GUI_MOTIF) \
688 	|| defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) \
689 	|| defined(FEAT_GUI_MSWIN))
690 // need a dialog to show error messages when starting from the desktop
691 # define FEAT_GUI_DIALOG
692 #endif
693 #if defined(FEAT_GUI_DIALOG) && \
694 	(defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) \
695 	 || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MSWIN) \
696 	 || defined(FEAT_GUI_PHOTON) \
697 	 || defined(FEAT_GUI_HAIKU))
698 # define FEAT_GUI_TEXTDIALOG
699 # ifndef ALWAYS_USE_GUI
700 #  define FEAT_CON_DIALOG
701 # endif
702 #endif
703 
704 /*
705  * +termguicolors	'termguicolors' option.
706  */
707 #if (defined(FEAT_BIG) && defined(FEAT_SYN_HL)) && !defined(ALWAYS_USE_GUI)
708 # define FEAT_TERMGUICOLORS
709 #endif
710 
711 /*
712  * +vartabs		'vartabstop' and 'varsofttabstop' options.
713  */
714 #ifdef FEAT_BIG
715 # define FEAT_VARTABS
716 #endif
717 
718 /*
719  * Preferences:
720  * ============
721  */
722 
723 /*
724  * +writebackup		'writebackup' is default on:
725  *			Use a backup file while overwriting a file.  But it's
726  *			deleted again when 'backup' is not set.  Changing this
727  *			is strongly discouraged: You can lose all your
728  *			changes when the computer crashes while writing the
729  *			file.
730  *			VMS note: It does work on VMS as well, but because of
731  *			version handling it does not have any purpose.
732  *			Overwrite will write to the new version.
733  */
734 #ifndef VMS
735 # define FEAT_WRITEBACKUP
736 #endif
737 
738 /*
739  * +xterm_save		The t_ti and t_te entries for the builtin xterm will
740  *			be set to save the screen when starting Vim and
741  *			restoring it when exiting.
742  */
743 // #define FEAT_XTERM_SAVE
744 
745 /*
746  * DEBUG		Output a lot of debugging garbage.
747  */
748 // #define DEBUG
749 
750 /*
751  * STARTUPTIME		Time the startup process.  Writes a file with
752  *			timestamps.
753  */
754 #if defined(FEAT_NORMAL) \
755 	&& ((defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)) \
756 		|| defined(MSWIN))
757 # define STARTUPTIME 1
758 #endif
759 
760 /*
761  * MEM_PROFILE		Debugging of memory allocation and freeing.
762  */
763 // #define MEM_PROFILE
764 
765 /*
766  * VIMRC_FILE		Name of the .vimrc file in current dir.
767  */
768 // #define VIMRC_FILE	".vimrc"
769 
770 /*
771  * EXRC_FILE		Name of the .exrc file in current dir.
772  */
773 // #define EXRC_FILE	".exrc"
774 
775 /*
776  * GVIMRC_FILE		Name of the .gvimrc file in current dir.
777  */
778 // #define GVIMRC_FILE	".gvimrc"
779 
780 /*
781  * SESSION_FILE		Name of the default ":mksession" file.
782  */
783 #define SESSION_FILE	"Session.vim"
784 
785 /*
786  * USR_VIMRC_FILE	Name of the user .vimrc file.
787  * USR_VIMRC_FILE2	Name of alternate user .vimrc file.
788  * USR_VIMRC_FILE3	Name of alternate user .vimrc file.
789  */
790 // #define USR_VIMRC_FILE	"~/foo/.vimrc"
791 // #define USR_VIMRC_FILE2	"~/bar/.vimrc"
792 // #define USR_VIMRC_FILE3	"$VIM/.vimrc"
793 
794 /*
795  * VIM_DEFAULTS_FILE	Name of the defaults.vim script file
796  */
797 // #define VIM_DEFAULTS_FILE	"$VIMRUNTIME/defaults.vim"
798 
799 /*
800  * EVIM_FILE		Name of the evim.vim script file
801  */
802 // #define EVIM_FILE		"$VIMRUNTIME/evim.vim"
803 
804 /*
805  * USR_EXRC_FILE	Name of the user .exrc file.
806  * USR_EXRC_FILE2	Name of the alternate user .exrc file.
807  */
808 // #define USR_EXRC_FILE	"~/foo/.exrc"
809 // #define USR_EXRC_FILE2	"~/bar/.exrc"
810 
811 /*
812  * USR_GVIMRC_FILE	Name of the user .gvimrc file.
813  * USR_GVIMRC_FILE2	Name of the alternate user .gvimrc file.
814  */
815 // #define USR_GVIMRC_FILE	"~/foo/.gvimrc"
816 // #define USR_GVIMRC_FILE2	"~/bar/.gvimrc"
817 // #define USR_GVIMRC_FILE3	"$VIM/.gvimrc"
818 
819 /*
820  * SYS_VIMRC_FILE	Name of the system-wide .vimrc file.
821  */
822 // #define SYS_VIMRC_FILE	"/etc/vimrc"
823 
824 /*
825  * SYS_GVIMRC_FILE	Name of the system-wide .gvimrc file.
826  */
827 // #define SYS_GVIMRC_FILE	"/etc/gvimrc"
828 
829 /*
830  * DFLT_HELPFILE	Name of the help file.
831  */
832 // # define DFLT_HELPFILE	"$VIMRUNTIME/doc/help.txt.gz"
833 
834 /*
835  * File names for:
836  * FILETYPE_FILE	switch on file type detection
837  * FTPLUGIN_FILE	switch on loading filetype plugin files
838  * INDENT_FILE		switch on loading indent files
839  * FTOFF_FILE		switch off file type detection
840  * FTPLUGOF_FILE	switch off loading settings files
841  * INDOFF_FILE		switch off loading indent files
842  */
843 // # define FILETYPE_FILE	"filetype.vim"
844 // # define FTPLUGIN_FILE	"ftplugin.vim"
845 // # define INDENT_FILE		"indent.vim"
846 // # define FTOFF_FILE		"ftoff.vim"
847 // # define FTPLUGOF_FILE	"ftplugof.vim"
848 // # define INDOFF_FILE		"indoff.vim"
849 
850 /*
851  * SYS_MENU_FILE	Name of the default menu.vim file.
852  */
853 // # define SYS_MENU_FILE	"$VIMRUNTIME/menu.vim"
854 
855 /*
856  * SYS_OPTWIN_FILE	Name of the default optwin.vim file.
857  */
858 #ifndef SYS_OPTWIN_FILE
859 # define SYS_OPTWIN_FILE	"$VIMRUNTIME/optwin.vim"
860 #endif
861 
862 /*
863  * SYNTAX_FNAME		Name of a syntax file, where %s is the syntax name.
864  */
865 // #define SYNTAX_FNAME	"/foo/%s.vim"
866 
867 /*
868  * RUNTIME_DIRNAME	Generic name for the directory of the runtime files.
869  */
870 #ifndef RUNTIME_DIRNAME
871 # define RUNTIME_DIRNAME "runtime"
872 #endif
873 
874 /*
875  * RUNTIME_GLOBAL	Comma-separated list of directory names for global Vim
876  *			runtime directories.
877  *			Don't define this if the preprocessor can't handle
878  *			string concatenation.
879  *			Also set by "--with-global-runtime" configure argument.
880  */
881 // #define RUNTIME_GLOBAL "/etc/vim"
882 
883 /*
884  * RUNTIME_GLOBAL_AFTER	Comma-separated list of directory names for global Vim
885  *			runtime after directories.
886  *			Don't define this if the preprocessor can't handle
887  *			string concatenation.
888  *			Also set by "--with-global-runtime" configure argument.
889  */
890 // #define RUNTIME_GLOBAL_AFTER "/etc/vim/after"
891 
892 /*
893  * MODIFIED_BY		Name of who modified Vim.  Required when distributing
894  *			a modified version of Vim.
895  *			Also from the "--with-modified-by" configure argument.
896  */
897 // #define MODIFIED_BY "John Doe"
898 
899 /*
900  * Machine dependent:
901  * ==================
902  */
903 
904 /*
905  * +fork		Unix only: fork() support (detected by configure)
906  * +system		Use system() instead of fork/exec for starting a
907  *			shell.  Doesn't work for the GUI!
908  */
909 // #define USE_SYSTEM
910 
911 /*
912  * +X11			Unix only.  Include code for xterm title saving and X
913  *			clipboard.  Only works if HAVE_X11 is also defined.
914  */
915 #if (defined(FEAT_NORMAL) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA))
916 # define WANT_X11
917 #endif
918 
919 /*
920  * XSMP - X11 Session Management Protocol
921  * It may be preferred to disable this if the GUI supports it (e.g.,
922  * GNOME/KDE) and implement save-yourself etc. through that, but it may also
923  * be cleaner to have all SM-aware vims do the same thing (libSM does not
924  * depend upon X11).
925  * If your GUI wants to support SM itself, change this ifdef.
926  * I'm assuming that any X11 implementation will cope with this for now.
927  */
928 #if defined(HAVE_X11) && defined(WANT_X11) && defined(HAVE_X11_SM_SMLIB_H)
929 # define USE_XSMP
930 #endif
931 #if defined(USE_XSMP_INTERACT) && !defined(USE_XSMP)
932 # undef USE_XSMP_INTERACT
933 #endif
934 
935 /*
936  * +mouse_xterm		Unix only: Include code for xterm mouse handling.
937  * +mouse_dec		idem, for Dec mouse handling.
938  * +mouse_jsbterm	idem, for Jsbterm mouse handling.
939  * +mouse_netterm	idem, for Netterm mouse handling.
940  * (none)		MS-DOS mouse support.
941  * +mouse_gpm		Unix only: Include code for Linux console mouse
942  *			handling.
943  * +mouse_pterm		PTerm mouse support for QNX
944  * +mouse_sgr		Unix only: Include code for for SGR-styled mouse.
945  * +mouse_sysmouse	Unix only: Include code for FreeBSD and DragonFly
946  *			console mouse handling.
947  * +mouse_urxvt		Unix only: Include code for for urxvt mouse handling.
948  * +mouse		Any mouse support (any of the above enabled).
949  *			Always included, since either FEAT_MOUSE_XTERM or
950  *			DOS_MOUSE is defined.
951  */
952 // Amiga console has no mouse support
953 #if defined(UNIX) || defined(VMS)
954 # define FEAT_MOUSE_XTERM
955 # ifdef FEAT_BIG
956 #  define FEAT_MOUSE_NET
957 # endif
958 # ifdef FEAT_BIG
959 #  define FEAT_MOUSE_DEC
960 # endif
961 # ifdef FEAT_BIG
962 #  define FEAT_MOUSE_URXVT
963 # endif
964 #endif
965 #if defined(MSWIN)
966 # define DOS_MOUSE
967 #endif
968 #if defined(__QNX__)
969 # define FEAT_MOUSE_PTERM
970 #endif
971 
972 /*
973  * Note: Only one of the following may be defined:
974  * FEAT_MOUSE_GPM
975  * FEAT_SYSMOUSE
976  * FEAT_MOUSE_JSB
977  * FEAT_MOUSE_PTERM
978  */
979 #if defined(FEAT_NORMAL) && defined(HAVE_GPM)
980 # define FEAT_MOUSE_GPM
981 #endif
982 
983 #if defined(FEAT_NORMAL) && defined(HAVE_SYSMOUSE)
984 # define FEAT_SYSMOUSE
985 #endif
986 
987 // urxvt is a small variation of mouse_xterm, and shares its code
988 #if defined(FEAT_MOUSE_URXVT) && !defined(FEAT_MOUSE_XTERM)
989 # define FEAT_MOUSE_XTERM
990 #endif
991 
992 /*
993  * +clipboard		Clipboard support.  Always used for the GUI.
994  * +xterm_clipboard	Unix only: Include code for handling the clipboard
995  *			in an xterm like in the GUI.
996  */
997 
998 #ifdef FEAT_CYGWIN_WIN32_CLIPBOARD
999 # define FEAT_CLIPBOARD
1000 #endif
1001 
1002 #ifdef FEAT_GUI
1003 # ifndef FEAT_CLIPBOARD
1004 #  define FEAT_CLIPBOARD
1005 # endif
1006 #endif
1007 
1008 #if defined(FEAT_NORMAL) \
1009 	&& (defined(UNIX) || defined(VMS)) \
1010 	&& defined(WANT_X11) && defined(HAVE_X11)
1011 # define FEAT_XCLIPBOARD
1012 # ifndef FEAT_CLIPBOARD
1013 #  define FEAT_CLIPBOARD
1014 # endif
1015 #endif
1016 
1017 /*
1018  * +dnd		Drag'n'drop support.  Always used for the GTK+ GUI.
1019  */
1020 #if defined(FEAT_CLIPBOARD) && defined(FEAT_GUI_GTK)
1021 # define FEAT_DND
1022 #endif
1023 
1024 #if defined(FEAT_GUI_MSWIN) && defined(FEAT_SMALL)
1025 # define MSWIN_FIND_REPLACE	// include code for find/replace dialog
1026 # define MSWIN_FR_BUFSIZE 256
1027 #endif
1028 
1029 #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MOTIF) \
1030 	|| defined(MSWIN_FIND_REPLACE)
1031 # define FIND_REPLACE_DIALOG 1
1032 #endif
1033 
1034 /*
1035  * +clientserver	Remote control via the remote_send() function
1036  *			and the --remote argument
1037  */
1038 #if (defined(MSWIN) || defined(FEAT_XCLIPBOARD)) && defined(FEAT_EVAL)
1039 # define FEAT_CLIENTSERVER
1040 #endif
1041 
1042 /*
1043  * +autoservername	Automatically generate a servername for clientserver
1044  *			when --servername is not passed on the command line.
1045  */
1046 #if defined(FEAT_CLIENTSERVER) && !defined(FEAT_AUTOSERVERNAME)
1047 # ifdef MSWIN
1048     // Always enabled on MS-Windows.
1049 #  define FEAT_AUTOSERVERNAME
1050 # else
1051     // Enable here if you don't use configure.
1052 // # define FEAT_AUTOSERVERNAME
1053 # endif
1054 #endif
1055 
1056 /*
1057  * +termresponse	send t_RV to obtain terminal response.  Used for xterm
1058  *			to check if mouse dragging can be used and if term
1059  *			codes can be obtained.
1060  */
1061 #if defined(HAVE_TGETENT)
1062 # define FEAT_TERMRESPONSE
1063 #endif
1064 
1065 /*
1066  * cursor shape		Adjust the shape of the cursor to the mode.
1067  * mouse shape		Adjust the shape of the mouse pointer to the mode.
1068  */
1069 #ifdef FEAT_NORMAL
1070 // Win32 console can change cursor shape
1071 # if defined(MSWIN) && (!defined(FEAT_GUI_MSWIN) || defined(VIMDLL))
1072 #  define MCH_CURSOR_SHAPE
1073 # endif
1074 # if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \
1075 	|| defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) \
1076 	|| defined(FEAT_GUI_PHOTON)
1077 #  define FEAT_MOUSESHAPE
1078 # endif
1079 #endif
1080 
1081 // GUI and some consoles can change the shape of the cursor.  The code is also
1082 // needed for the 'mouseshape' and 'concealcursor' options.
1083 #if defined(FEAT_GUI) \
1084 	    || defined(MCH_CURSOR_SHAPE) \
1085 	    || defined(FEAT_MOUSESHAPE) \
1086 	    || defined(FEAT_CONCEAL) \
1087 	    || (defined(UNIX) && defined(FEAT_NORMAL))
1088 # define CURSOR_SHAPE
1089 #endif
1090 
1091 #if defined(FEAT_MZSCHEME) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK)    \
1092 	|| defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA))
1093 # define MZSCHEME_GUI_THREADS
1094 #endif
1095 
1096 /*
1097  * +ARP			Amiga only. Use arp.library, DOS 2.0 is not required.
1098  */
1099 #if defined(AMIGA) && !defined(NO_ARP) && !defined(__amigaos4__) \
1100 	&& !defined(__MORPHOS__) && !defined(__AROS__)
1101 # define FEAT_ARP
1102 #endif
1103 
1104 /*
1105  * +ole			Win32 OLE automation: Use Makefile.ovc.
1106  */
1107 
1108 /*
1109  * These features can only be included by using a configure argument.  See the
1110  * Makefile for a line to uncomment.
1111  * +lua			Lua interface: "--enable-luainterp"
1112  * +mzscheme		MzScheme interface: "--enable-mzscheme"
1113  * +perl		Perl interface: "--enable-perlinterp"
1114  * +python		Python interface: "--enable-pythoninterp"
1115  * +tcl			TCL interface: "--enable-tclinterp"
1116  * +netbeans_intg	Netbeans integration
1117  * +channel		Inter process communication
1118  * +GUI_Athena		Athena GUI
1119  * +GUI_Motif		Motif GUI
1120  */
1121 
1122 /*
1123  * These features are automatically detected:
1124  * +terminfo
1125  * +tgetent
1126  */
1127 
1128 /*
1129  * The Netbeans feature requires +eval.
1130  */
1131 #if !defined(FEAT_EVAL) && defined(FEAT_NETBEANS_INTG)
1132 # undef FEAT_NETBEANS_INTG
1133 #endif
1134 
1135 /*
1136  * The +channel feature requires +eval.
1137  */
1138 #if !defined(FEAT_EVAL) && defined(FEAT_JOB_CHANNEL)
1139 # undef FEAT_JOB_CHANNEL
1140 #endif
1141 
1142 /*
1143  * +terminal		":terminal" command.  Runs a terminal in a window.
1144  *			requires +channel
1145  */
1146 #if defined(FEAT_TERMINAL) && !defined(FEAT_JOB_CHANNEL)
1147 # undef FEAT_TERMINAL
1148 #endif
1149 #if defined(FEAT_TERMINAL) && !defined(CURSOR_SHAPE)
1150 # define CURSOR_SHAPE
1151 #endif
1152 #if defined(FEAT_TERMINAL) && !defined(FEAT_SYN_HL)
1153 // simplify the code a bit by enabling +syntax when +terminal is enabled
1154 # define FEAT_SYN_HL
1155 #endif
1156 
1157 /*
1158  * +autoshelldir	    'autoshelldir' option.
1159  */
1160 #if defined(FEAT_TERMINAL)
1161 # define FEAT_AUTOSHELLDIR
1162 #endif
1163 /*
1164  * +textprop and +popupwin	Text PROPerties and POPUP windows
1165  */
1166 #if defined(FEAT_EVAL) && defined(FEAT_SYN_HL)
1167 # define FEAT_PROP_POPUP
1168 #endif
1169 
1170 #if defined(FEAT_SYN_HL) && defined(FEAT_RELTIME)
1171 // Can limit syntax highlight time to 'redrawtime'.
1172 # define SYN_TIME_LIMIT 1
1173 #endif
1174 
1175 
1176 /*
1177  * +signs		Allow signs to be displayed to the left of text lines.
1178  *			Adds the ":sign" command.
1179  */
1180 #if defined(FEAT_BIG) || defined(FEAT_NETBEANS_INTG) || defined(FEAT_PROP_POPUP)
1181 # define FEAT_SIGNS
1182 # if ((defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) \
1183 		&& defined(HAVE_X11_XPM_H)) \
1184 	|| defined(FEAT_GUI_GTK) \
1185 	|| (defined(MSWIN) && defined(FEAT_GUI))
1186 #  define FEAT_SIGN_ICONS
1187 # endif
1188 #endif
1189 
1190 /*
1191  * +balloon_eval	Allow balloon expression evaluation. Used with a
1192  *			debugger and for tooltips.
1193  *			Only for GUIs where it was implemented.
1194  */
1195 #if (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) \
1196 	|| defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MSWIN)) \
1197 	&& (   ((defined(FEAT_TOOLBAR) || defined(FEAT_GUI_TABLINE)) \
1198 		&& !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MSWIN)) \
1199 	    || defined(FEAT_NETBEANS_INTG) || defined(FEAT_EVAL))
1200 # define FEAT_BEVAL_GUI
1201 # if !defined(FEAT_XFONTSET) && !defined(FEAT_GUI_GTK) \
1202 	&& !defined(FEAT_GUI_MSWIN)
1203 #  define FEAT_XFONTSET
1204 # endif
1205 #endif
1206 
1207 #if defined(FEAT_BEVAL_GUI) && (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA))
1208 # define FEAT_BEVAL_TIP		// balloon eval used for toolbar tooltip
1209 #endif
1210 
1211 /*
1212  * +balloon_eval_term	Allow balloon expression evaluation in the terminal.
1213  */
1214 #if defined(FEAT_HUGE) && defined(FEAT_TIMERS) && \
1215 	(defined(UNIX) || defined(VMS) || \
1216 	 (defined(MSWIN) && (!defined(FEAT_GUI_MSWIN) || defined(VIMDLL))))
1217 # define FEAT_BEVAL_TERM
1218 #endif
1219 
1220 #if defined(FEAT_BEVAL_GUI) || defined(FEAT_BEVAL_TERM)
1221 # define FEAT_BEVAL
1222 #endif
1223 
1224 // both Motif and Athena are X11 and share some code
1225 #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)
1226 # define FEAT_GUI_X11
1227 #endif
1228 
1229 #if defined(FEAT_NETBEANS_INTG)
1230 // NetBeans uses menus.
1231 # if !defined(FEAT_MENU)
1232 #  define FEAT_MENU
1233 # endif
1234 #endif
1235 
1236 #if 0
1237 /*
1238  * +footer		Motif only: Add a message area at the bottom of the
1239  *			main window area.
1240  */
1241 # define FEAT_FOOTER
1242 #endif
1243 
1244 /*
1245  * +autochdir		'autochdir' option.
1246  */
1247 #if defined(FEAT_NETBEANS_INTG) || defined(FEAT_BIG)
1248 # define FEAT_AUTOCHDIR
1249 #endif
1250 
1251 /*
1252  * +persistent_undo	'undofile', 'undodir' options, :wundo and :rundo, and
1253  * implementation.
1254  */
1255 #ifdef FEAT_NORMAL
1256 # define FEAT_PERSISTENT_UNDO
1257 #endif
1258 
1259 /*
1260  * +filterpipe
1261  */
1262 #if (defined(UNIX) && !defined(USE_SYSTEM)) \
1263 	    || (defined(MSWIN) && defined(FEAT_GUI_MSWIN))
1264 # define FEAT_FILTERPIPE
1265 #endif
1266 
1267 /*
1268  * +vtp: Win32 virtual console.
1269  */
1270 #if (!defined(FEAT_GUI) || defined(VIMDLL)) && defined(MSWIN)
1271 # define FEAT_VTP
1272 #endif
1273