#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#

menu "Editors"

config CONFIG_AWK
	bool "awk"
	default n
	help
	  Awk is used as a pattern scanning and processing language.  This is
	  the BusyBox implementation of that programming language.

config CONFIG_FEATURE_AWK_MATH
	bool "Enable math functions (requires libm)"
	default y
	depends on CONFIG_AWK
	help
	  Enable math functions of the Awk programming language.
	  NOTE: This will require libm to be present for linking.

config CONFIG_ED
	bool "ed"
	default n
	help
	  The original 1970's Unix text editor, from the days of teletypes.
	  Small, simple, evil.  Part of SUSv3.  If you're not already using
	  this, you don't need it.

config CONFIG_PATCH
	bool "patch"
	default n
	help
	  Apply a unified diff formatted patch.

config CONFIG_SED
	bool "sed"
	default n
	help
	  sed is used to perform text transformations on a file
	  or input from a pipeline.

config CONFIG_VI
	bool "vi"
	default n
	help
	  'vi' is a text editor.  More specifically, it is the One True
	  text editor <grin>.  It does, however, have a rather steep
	  learning curve.  If you are not already comfortable with 'vi'
	  you may wish to use something else.

config CONFIG_FEATURE_VI_COLON
	bool "Enable \":\" colon commands (no \"ex\" mode)"
	default y
	depends on CONFIG_VI
	help
	  Enable a limited set of colon commands for vi.  This does not
	  provide an "ex" mode.

config CONFIG_FEATURE_VI_YANKMARK
	bool "Enable yank/put commands and mark cmds"
	default y
	depends on CONFIG_VI
	help
	  This will enable you to use yank and put, as well as mark in
	  busybox vi.

config CONFIG_FEATURE_VI_SEARCH
	bool "Enable search and replace cmds"
	default y
	depends on CONFIG_VI
	help
	  Select this if you wish to be able to do search and replace in
	  busybox vi.

config CONFIG_FEATURE_VI_USE_SIGNALS
	bool "Catch signals"
	default y
	depends on CONFIG_VI
	help
	  Selecting this option will make busybox vi signal aware.  This will
	  make busybox vi support SIGWINCH to deal with Window Changes, catch
	  Ctrl-Z and Ctrl-C and alarms.

config CONFIG_FEATURE_VI_DOT_CMD
	bool "Remember previous cmd and \".\" cmd"
	default y
	depends on CONFIG_VI
	help
	  Make busybox vi remember the last command and be able to repeat it.

config CONFIG_FEATURE_VI_READONLY
	bool "Enable -R option and \"view\" mode"
	default y
	depends on CONFIG_VI
	help
	  Enable the read-only command line option, which allows the user to
	  open a file in read-only mode.

config CONFIG_FEATURE_VI_SETOPTS
	bool "Enable set-able options, ai ic showmatch"
	default y
	depends on CONFIG_VI
	help
	  Enable the editor to set some (ai, ic, showmatch) options.

config CONFIG_FEATURE_VI_SET
	bool "Support for :set"
	default y
	depends on CONFIG_VI
	help
	  Support for ":set".

config CONFIG_FEATURE_VI_WIN_RESIZE
	bool "Handle window resize"
	default y
	depends on CONFIG_VI
	help
	  Make busybox vi behave nicely with terminals that get resized.

config CONFIG_FEATURE_VI_OPTIMIZE_CURSOR
	bool "Optimize cursor movement"
	default y
	depends on CONFIG_VI
	help
	  This will make the cursor movement faster, but requires more memory
	  and it makes the applet a tiny bit larger.

endmenu

