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

menu "Editors"

INSERT

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

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

config CMP
	bool "cmp"
	default y
	help
	  cmp is used to compare two files and returns the result
	  to standard output.

config DIFF
	bool "diff"
	default y
	help
	  diff compares two files or directories and outputs the
	  differences between them in a form that can be given to
	  the patch command.

config FEATURE_DIFF_LONG_OPTIONS
	bool "Enable long options"
	default y
	depends on DIFF && LONG_OPTS
	help
	  Enable use of long options.

config FEATURE_DIFF_DIR
	bool "Enable directory support"
	default y
	depends on DIFF
	help
	  This option enables support for directory and subdirectory
	  comparison.

config ED
	bool "ed"
	default y
	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 SED
	bool "sed"
	default y
	help
	  sed is used to perform text transformations on a file
	  or input from a pipeline.

config VI
	bool "vi"
	default y
	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 FEATURE_VI_MAX_LEN
	int "Maximum screen width in vi"
	range 256 16384
	default 4096
	depends on VI
	help
	  Contrary to what you may think, this is not eating much.
	  Make it smaller than 4k only if you are very limited on memory.

config FEATURE_VI_8BIT
	bool "Allow vi to display 8-bit chars (otherwise shows dots)"
	default n
	depends on VI
	help
	  If your terminal can display characters with high bit set,
	  you may want to enable this. Note: vi is not Unicode-capable.
	  If your terminal combines several 8-bit bytes into one character
	  (as in Unicode mode), this will not work properly.

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

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

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

config FEATURE_VI_USE_SIGNALS
	bool "Catch signals"
	default y
	depends on 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 FEATURE_VI_DOT_CMD
	bool "Remember previous cmd and \".\" cmd"
	default y
	depends on VI
	help
	  Make busybox vi remember the last command and be able to repeat it.

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

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

config FEATURE_VI_SET
	bool "Support for :set"
	default y
	depends on VI
	help
	  Support for ":set".

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

config FEATURE_VI_ASK_TERMINAL
	bool "Use 'tell me cursor position' ESC sequence to measure window"
	default y
	depends on VI
	help
	  If terminal size can't be retrieved and $LINES/$COLUMNS are not set,
	  this option makes vi perform a last-ditch effort to find it:
	  vi positions cursor to 999,999 and asks terminal to report real
	  cursor position using "ESC [ 6 n" escape sequence, then reads stdin.

	  This is not clean but helps a lot on serial lines and such.

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

config FEATURE_ALLOW_EXEC
	bool "Allow vi and awk to execute shell commands"
	default y
	depends on VI || AWK
	help
	  Enables vi and awk features which allows user to execute
	  shell commands (using system() C call).

endmenu
