||<>|| ##(see the SpecSpec for an explanation) {{attachment:bash.jpg}} ## Register at https://launchpad.net/distros/ubuntu/+specs * '''Launchpad entry''': [[https://bugs.launchpad.net/ubuntu/+source/base-files/+bug/103986|Bug #103986]] * '''Packages affected''': [[https://launchpad.net/ubuntu/+source/base-files|base-files]] * '''Blueprint''': [[https://blueprints.launchpad.net/ubuntu/+spec/bashimprovement]] == Summary == Add helpful bash shortcuts that will help users better utilize their system. This will allow the user to see commands they typed, and give a reasonable history setting. Currently page-up and page-down scroll through history, but they don't match partially typed commands. There are other bindings for these, but this is by far the most intuitive system I have seen. Also use some colors that are available to us (this issue is a gnome-terminal type identification issue [[https://bugs.launchpad.net/ubuntu/+source/bash/+bug/103929|Bug #103929]]) == Rationale == Bash gives us features that make it very efficient, and intuitive. == Use cases == User wants to recall a command where they ssh'd into a box. User types ssh then page up to see all the different variations they have used. User then wants to find occurrence of ssh in a file. Runs grep -ni ssh * and it shows the results, with their string ssh highlighted (this is dependent on the grep change which is not a part of the main spec). == Scope == Any bash shell, any user with a color monitor. == Design == === Big Picture === This will allow shells to share history, and to search through that history with ease * Bind pageup to history-search-backward * This will allow page-up to match previously typed commands from partial input * Bind pagedown to history-search-forward * This will allow page-down to match previously typed commands from partial input * Add shopt -s histappend * This will make bash append to the history file instead of overwrite it * Add PROMPT_COMMAND='history -a' * This will append the previous command to history each time a prompt is shown == Implementation == Add the specified commands to /etc/profile, /etc/inputrc, /etc/skel/.bashrc === Code === '''For searching history:''' ''If you want these to be system wide, add those lines to /etc/inputrc instead.'' {{{ echo "\"\e[5~\": history-search-backward" >> ~/.inputrc echo "\"\e[6~\": history-search-forward" >> ~/.inputrc }}} '''Make sure all terminals save history''' {{{ echo "shopt -s histappend" >> ~/.bashrc echo "PROMPT_COMMAND=\"history -a; \$PROMPT_COMMAND\"" >> ~/.bashrc }}} '''More sane command matching:''' ''Put these in /etc/inputrc to be system wide.'' {{{ echo "set match-hidden-files off" >> ~/.inputrc echo "set page-completions off" >> ~/.inputrc echo "set completion-query-items 350" >> ~/.inputrc echo "set show-all-if-ambiguous on" >> ~/.inputrc }}} '''Increase history size:''' ''Save more commands by default'' {{{ echo "export HISTSIZE=1000" >> ~/.bashrc echo "export HISTFILESIZE=1000" >> ~/.bashrc }}} '''''This is optional and not a part of the spec I am pushing for as hard''''' '''Use GREP color features by default:''' ''This will highlight the matched words / regexes'' {{{ echo "export GREP_OPTIONS='--color=auto'" >> ~/.bashrc }}} '''Dash / Bash only:''' ''In input RC we need to check which shell, so our options only get used in bash or dash'' {{{ $if Bash # Search history back and forward using page-up and page-down "\e[5~": history-search-backward "\e[6~": history-search-forward # Completion set match-hidden-files off set page-completions off set completion-query-items 350 set show-all-if-ambiguous on $endif }}} === Data preservation and migration === == Unresolved issues == == BoF agenda and discussion == == References == * [[http://gentoo-wiki.com/TIP_Some_pretty_.bashrc_hints|Gentoo Bashrc Hints]] * [[http://www.ukuug.org/events/linux2003/papers/bash_tips/|Power Shell Usage - Bash Tips and Tricks]] * [[http://www.cs.virginia.edu/~wh5a/blog/Some%20Bash%20Tips.html|Some Bash Tips]] * [[http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x1712.htm|Using the command line history]] * [[http://github.com/simos/tcshrc/|tcshrc set of files, aiming for usability]] * [[http://github.com/simos/bashrc/|bashrc set of files, aiming for usability, porting from tcshrc above]] == TODO == * Create wishlist bug * Create patches to RPM to apply changes, post to bug == Comments == * I propose some unintrusive but IMHO useful tweaks to the '''TAB autocomplete''' feature: * In /etc/bash.bashrc: * ''complete -d cd mkdir rmdir'' (only list directories for cd, mkdir and rmdir) * I think this one is already in ubuntu. -- StevenHarms (6 Apr 2007) * In /etc/inputrc: * ''set match-hidden-files off'' (do not show hidden files in the list: really useful when working in your home directory) * ''set page-completions off'' (removes the annoying "-- more --" prompt for long lists) * ''set completion-query-items 1000'' (show the "Display all 123 possibilities? (y or n)" prompt only for really long lists) * ''set show-all-if-ambiguous on'' (show the list at first TAB, instead of beeping and and waiting for a second TAB to do that) -- RobePisc (14 Nov 2006) * Is there anything which can be done to reduce the amount of time spent processing /etc/bash_completions on startup? This provides lots of useful completions but also takes a loooong time to process. -- Robert Knight (14 Nov 2006) * First of all I really like binding the history search keys but I would bind them to the arrow keys instead. You don't lose any functionality by doing this. Also I'd suggest to enable aliases such as ll, la etc. and color output by default -- Jaap Haitsma (6 Apr 2007) * Since this is already the default in SuSe linux, it is already well established and well known. The page up page down keys just seem to be the most intuitive fit for this. Also, color is already on by default. -- StevenHarms (6 Apr 2007) * Yeah, colors are good. Ie: {{{ PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' }}} (standard colors put in .bashrc but not enabled by default). -- AzraelNightwalker ** It's also good to have an indication of the current command and current directory in the window title bar title, and the name of the machine if it is not a local machine. That can be done by setting the prompt: http://www.cs.pitt.edu/~philip/tech/.prompt . Most terminal emulator windows one opens are on the local machine and so the name should be omitted to save space. --Philip Ganchev (14 Aug 2007) * Looks to me like the issue is gnome-terminal should identify its terminal type as xterm-color and then prompt will happen. Opened bug: https://bugs.launchpad.net/ubuntu/+source/bash/+bug/103929 -- someone please confirm it - StevenHarms (6 Apr 2007) * You might want to add ''export HISTCONTROL=ignoredups'' to .bashrc to only save unique history entries. -- Mh21 (20 Apr 2007) * I believe this is already enabled by default? StevenHarms (20 Apr 2007) * Why not use the Friendly Interactive Shell (http://fishshell.org) instead? It has many unique features, like completion descriptions, syntax highlighting, multi-line editing, per-word history search and sensible defaults. Or use Zsh; it shows completions underneath the cursor which I think cleanly separates them from the output above; and it can iterate through possible completions, highlighting the current one and printing it at the cursor. --Philip Ganchev (14 Aug 2007) * You can also improve the default prompt of "less": {{{ export LESS="-P ?c<- .?f%f:Standard input. ?n:?eEND:?p%pj\%.. .?c%ccol . ?mFile %i of %m .?xNext\ %x.%t Press h for help" }}} --Philip Ganchev (14 Aug 2007) * {{{shopt -s cdspell}}} -- minor errors in the spelling of a directory component in a cd command will be corrected * {{{shopt -s lithist}}} -- if the {{{cmdhist}}} option is enabled, multi-line commands are saved to the history with embedded newlines rather than using semicolon separators where possible * {{{shopt -s nocaseglob}}} -- match filenames in a case-insensitive fashion when performing pathname expansion * {{{set completion-ignore-case on}}} -- readline performs filename matching and completion in a case-insensitive fashion * Just want to say I've been using most of these defaults for years, which you can see in my settings files: * http://www.pixelbeat.org/settings/.inputrc * http://www.pixelbeat.org/settings/.bashrc -- Pádraig Brady (29 Aug 2007) * AFAIK in hardy bash completion scripts have been split to a separate package: bash-completion. -- AzraelNightwalker <> ---- CategorySpec