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

menu "Editors"

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 FEATURE_AWK_LIBM
	bool "Enable math functions (requires libm)"
	default n
	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 n
	help
	  cmp is used to compare two files and returns the result
	  to standard output.

config DIFF
	bool "diff"
	default n
	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_BINARY
	bool "Enable checks for binary files"
	default y
	depends on DIFF
	help
	  This option enables support for checking for binary files
	  before a comparison is carried out.

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

config FEATURE_DIFF_MINIMAL
	bool "Enable -d option to find smaller sets of changes"
	default n
	depends on DIFF
	help
	  Enabling this option allows the use of -d to make diff
	  try hard to find the smallest possible set of changes.

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 PATCH
	bool "patch"
	default n
	help
	  Apply a unified diff formatted patch.

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

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 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 y
	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_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
