# Shell configuration options

# Copyright (c) 2014-2015 Wind River Systems, Inc.
# Copyright (c) 2016 Intel Corporation
# Copyright (c) 2018 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

menuconfig SHELL
	bool "Shell"
	imply LOG_RUNTIME_FILTERING
	select POLL

if SHELL

module = SHELL
module-str = Shell
source "subsys/logging/Kconfig.template.log_config"
source "subsys/shell/Kconfig.backends"

config SHELL_STACK_SIZE
	int "Shell thread stack size"
	default 2520 if OPENTHREAD_SHELL
	default 2048 if MULTITHREADING
	default 0 if !MULTITHREADING
	help
	  Stack size for thread created for each instance.

config SHELL_BACKSPACE_MODE_DELETE
	bool "Default escape code for backspace is DELETE (0x7F)"
	default y
	help
	  Terminals have different escape code settings for backspace button.
	  Some terminals send code: 0x08 (backspace) other 0x7F (delete). When
	  this option is set shell will expect 0x7F for backspace key.

config SHELL_CMD_BUFF_SIZE
	int "Shell command buffer size"
	default 256
	help
	  Maximum command size in bytes. One byte is reserved for the string
	  terminator character.

config SHELL_PRINTF_BUFF_SIZE
	int "Shell print buffer size"
	default 30
	help
	  Maximum text buffer size for fprintf function.
	  It is working like stdio buffering in Linux systems
	  to limit number of peripheral access calls.

config SHELL_DEFAULT_TERMINAL_WIDTH
	int "Default terminal width"
	default 80
	help
	  Default terminal width is used to break lines.

config SHELL_DEFAULT_TERMINAL_HEIGHT
	int "Default terminal height"
	default 24

config SHELL_ARGC_MAX
	int "Maximum arguments in shell command"
	range 3 255
	default 12
	help
	  Maximum number of arguments that can build a command.

config SHELL_TAB
	bool "Enable the Tab button supporort in shell"
	default y
	help
	  Enable using the Tab button in the shell. The button
	  can be used for prompting commands, or for autocompletion.
	  This feature has high impact on flash usage.

config SHELL_TAB_AUTOCOMPLETION
	bool "Enable commands autocompletion with the Tab button"
	depends on SHELL_TAB
	default y
	help
	  Enable commands and subcommands autocompletion with the Tab
	  key. This function can be deactivated to save some flash.

config SHELL_WILDCARD
	bool "Enable wildcard support in shell"
	select FNMATCH
	default y
	help
	  Enables using wildcards: * and ? in the shell.

config SHELL_ECHO_STATUS
	bool "Enable echo on shell"
	default y
	help
	  If enabled shell prints back every input byte.

config SHELL_VT100_COLORS
	bool "Enable colors in shell"
	default y
	help
	  If enabled VT100 colors are used in shell (e.g. print errors in red).

config SHELL_METAKEYS
	bool "Enable metakeys"
	default y
	help
	  Enables shell meta keys: Ctrl+a, Ctrl+b, Ctrl+c, Ctrl+d, Ctrl+e,
	  Ctrl+f, Ctrl+k, Ctrl+l, Ctrl+u, Ctrl+w, Alt+b, Alt+f
	  Meta keys will not be active when shell echo is set to off.

config SHELL_HELP
	bool "Enable help message"
	default y
	help
	  Enables formatting help message when requested with '-h' or '--help'.

config SHELL_HELP_ON_WRONG_ARGUMENT_COUNT
	bool "Enable printing help on wrong argument count"
	depends on SHELL_HELP
	default y

config SHELL_HISTORY
	bool "Enable history in shell"
	default y
	select RING_BUFFER
	help
	  Enable commands history. History can be accessed using up and down
	  arrows or Ctrl+n and Ctrl+p meta keys.

config SHELL_HISTORY_BUFFER
	int "History buffer in bytes"
	default 512
	depends on SHELL_HISTORY
	help
	  Number of bytes dedicated for storing executed commands.

config SHELL_STATS
	bool "Enable shell statistics"
	default y

config SHELL_CMDS
	bool "Enable built-in commands"
	default y
	help
	  Enable built-in commands like 'clear', 'history', etc.

config SHELL_CMDS_RESIZE
	bool "Enable resize command"
	depends on SHELL_CMDS
	default y
	help
	  By default shell assumes width of a terminal screen set to 80
	  characters. Each time terminal screen width is changed resize command
	  must be called to ensure correct text display on the terminal screen.
	  The resize command can be turned off to save code memory (~0,5k).

config SHELL_CMDS_SELECT
	bool "Enable select command"
	depends on SHELL_CMDS
	help
	  This option enables select command. It can be used to set new root
	  command. Exit to main command tree is with alt+r.

config SHELL_LOG_BACKEND
	bool "Enable shell log backend"
	depends on !LOG_MINIMAL
	default y if LOG
	help
	  When enabled, backend will use the shell for logging.
	  This option is enabled by default.
	  Disabling this option disables log output to all shell backends.
	  Disabling log output to a specific shell backend can be achieved
	  using the shell backend's LOG_LEVEL option
	  (e.g. CONFIG_SHELL_TELNET_INIT_LOG_LEVEL_NONE=y).

source "subsys/shell/modules/Kconfig"

endif # SHELL
