# 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/backends/Kconfig.backends"

config SHELL_MINIMAL
	bool "Default config to reduce flash and memory requirements"
	help
	  This is a meta-configuration option to significantly reduce the flash
	  and memory requirements of the shell.  Enabling it will choose Kconfig
	  defaults which favor reduced flash or memory requirements over extra
	  features.

config SHELL_THREAD_PRIORITY_OVERRIDE
	bool "Override default shell thread priority"
	help
	  Option to change the default value of shell thread priority.

if SHELL_THREAD_PRIORITY_OVERRIDE
config SHELL_THREAD_PRIORITY
	int "Shell thread priority"
	default 0
	help
	  Set thread priority of the shell
endif

config SHELL_STACK_SIZE
	int "Shell thread stack size"
	default 3168 if OPENTHREAD_SHELL
	default 3072 if 64BIT
	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 128 if SHELL_MINIMAL
	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 20
	help
	  Maximum number of arguments that can build a command.

config SHELL_TAB
	bool "The Tab button support in shell"
	default y if !SHELL_MINIMAL && !SHELL_BACKEND_RTT
	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 "Commands autocompletion with the Tab button"
	depends on SHELL_TAB
	default y if !SHELL_MINIMAL
	help
	  Enable commands and subcommands autocompletion with the Tab
	  key. This function can be deactivated to save some flash.

config SHELL_ASCII_FILTER
	bool "Filter incoming ASCII characters"
	default y
	help
	  Shell will not collect characters that are not in
	  ASCII range: <0, 127>. As a result filtered characters will not be
	  printed on the terminal and passed to the command handler.

config SHELL_WILDCARD
	bool "Wildcard support in shell"
	select FNMATCH
	default y if !SHELL_MINIMAL
	help
	  Enables using wildcards: * and ? in the shell.

config SHELL_MSG_CMD_NOT_FOUND
	bool "': command not found' message in the shell"
	default y
	help
	  If enabled, the shell prints out this message.

config SHELL_MSG_SPECIFY_SUBCOMMAND
	bool "'Please specify a subcommand.' message in the shell"
	default y
	help
	  If enabled, the shell prints out this message.

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

config SHELL_START_OBSCURED
	bool "Display asterisk when echoing"
	help
	  If enabled, don't echo actual character, but echo * instead.
	  This is used for login prompts.

config SHELL_VT100_COMMANDS
	bool "VT100 commands in shell"
	default y if !SHELL_BACKEND_RTT
	help
	  Enables VT100 commands in shell (e.g. cursor position, clear screen etc.).

config SHELL_VT100_COLORS
	bool "Colors in shell"
	depends on SHELL_VT100_COMMANDS
	default y if !SHELL_MINIMAL
	help
	  If enabled VT100 colors are used in shell (e.g. print errors in red).

config SHELL_GETOPT
	bool "Threadsafe getopt support in shell"
	select GETOPT
	help
	  This config creates a separate getopt_state for the shell instance.
	  It ensures that using getopt with shell is thread safe.
	  When more threads are using getopt please call getopt_state_get to
	  get getopt state of the shell thread.

config SHELL_METAKEYS
	bool "Metakeys"
	default y if !SHELL_MINIMAL
	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 "Help message"
	default y if !SHELL_MINIMAL
	help
	  Enables shell functions for printing formatted help message.

config SHELL_HELP_OPT_PARSE
	bool "Parse -h and --help options"
	depends on SHELL_HELP
	depends on !SHELL_GETOPT
	default y
	help
	  Shell parses command to find '-h' or '--help' string. If the shell
	  finds the string, it will automatically print a help message
	  for a command.

config SHELL_HELP_ON_WRONG_ARGUMENT_COUNT
	bool "Printing help on wrong argument count"
	depends on SHELL_HELP
	default y if !SHELL_MINIMAL

config SHELL_HISTORY
	bool "History in shell"
	default y if !SHELL_MINIMAL
	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 128 if SHELL_MINIMAL
	default 512
	depends on SHELL_HISTORY
	help
	  Number of bytes dedicated for storing executed commands.

config SHELL_STATS
	bool "Shell statistics"
	default y if !SHELL_MINIMAL

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

config SHELL_CMDS_RESIZE
	bool "Resize command"
	depends on SHELL_CMDS
	depends on SHELL_VT100_COMMANDS
	default y if !SHELL_MINIMAL
	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 "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_CMD_ROOT
	string "Set a root command at init"
	help
	  This option sets a root command at shell init,
	  and when exiting to main command tree with alt+r.

config SHELL_LOG_BACKEND
	bool "Shell log backend"
	depends on LOG && !LOG_MODE_MINIMAL
	select MPSC_PBUF
	select LOG_OUTPUT
	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).

config SHELL_LOG_FORMAT_TIMESTAMP
	bool "Format timestamp"
	default y
	depends on SHELL_LOG_BACKEND
	help
	  Enable timestamp formatting.

config SHELL_AUTOSTART
	bool "Auto-start shell at boot"
	default y
	help
	  If enabled, shell will be automatically started.

config SHELL_CMDS_RETURN_VALUE
	bool "Retval command"
	depends on SHELL_CMDS
	default y
	help
	  This option enables the retval command. It is used to retrieve
	  the return value from the most recently executed command.

source "subsys/shell/modules/Kconfig"

endif # SHELL
