[ Languages: **English** | [日本語](README-ja_JP.md) (Japanese) ]

ble.sh (/blɛʃ/) ―Bash Line Editor―

[ README | Manual | Q&A | contrib | Recipes ]

*Bash Line Editor* (`ble.sh`) is a command line editor written in pure Bash which replaces the default GNU Readline. Current devel version is 0.4. This script supports Bash 3.0 or higher although we recommend to use `ble.sh` with release versions of Bash 4.0 or higher. Currently, only `UTF-8` encoding is supported for non-ASCII characters. This script is provided under the [**BSD License**](LICENSE.md) (3-clause BSD license). Disclaimer: The core part of the line editor is written in **pure Bash**, but `ble.sh` relies on POSIX `stty` to set up TTY states before and after the execution of user commands. It also uses other POSIX utilities for acceleration in some part of initialization and cleanup code, processing of large data in completions, paste of large data, etc. Pronunciation: The easiest pronunciation of `ble.sh` that users use is /blɛʃ/, but you can actually pronounce it as you like. I do not specify the canonical way of pronoucing `ble.sh`. In fact, I personally read it verbosely as /biːɛliː dɑt ɛseɪtʃ/ in my head. ## Quick instructions Installation requires the commands `git`, `make` (GNU make), and `gawk` (in addition to `bash` and POSIX standard utilities). For detailed descriptions, see [Sec 1.1](#get-from-source) and [Sec 1.2](#get-from-tarball) for trial/installation, [Sec 1.3](#set-up-bashrc) for the setup of your `~/.bashrc`. Please replace `make` with `gmake` if your system provides GNU make as `gmake` (such as in BSD). ```bash # TRIAL without installation git clone --recursive https://github.com/akinomyoga/ble.sh.git make -C ble.sh source ble.sh/out/ble.sh # Quick INSTALL to BASHRC (If this doesn't work, please follow Sec 1.3) git clone --recursive https://github.com/akinomyoga/ble.sh.git make -C ble.sh install PREFIX=~/.local echo 'source ~/.local/share/blesh/ble.sh' >> ~/.bashrc # UPDATE (in a ble.sh session) ble-update # UPDATE (outside ble.sh sessions) bash /path/to/ble.sh --update # PACKAGE (for package maintainers) git clone --recursive https://github.com/akinomyoga/ble.sh.git make -C ble.sh install DESTDIR=/tmp/blesh-package PREFIX=/usr/local ``` You may also install `ble.sh` through package-management systems (currently only AUR): - [AUR (Arch Linux)](https://github.com/akinomyoga/ble.sh/wiki/Manual-A1-Installation#user-content-AUR) `blesh-git` (devel), `blesh` (stable 0.3.3) ## Features - **Syntax highlighting**: Highlight command lines input by users as in `fish` and `zsh-syntax-highlighting`. Unlike the simple highlighting in `zsh-syntax-highlighting`, `ble.sh` performs syntactic analysis to enable the correct highlighting of complex structures such as nested command substitutions, multiple here documents, etc. Highlighting colors and styles are [fully configurable](https://github.com/akinomyoga/ble.sh/wiki/Manual-%C2%A72-Graphics). - **Enhanced completion**: Extend [completion](https://github.com/akinomyoga/ble.sh/wiki/Manual-%C2%A77-Completion) by **syntax-aware completion**, completion with quotes and parameter expansions in prefix texts, **ambiguous candidate generation**, etc. Also, [**menu-complete**](https://github.com/akinomyoga/ble.sh/wiki/Manual-%C2%A77-Completion#user-content-sec-menu-complete) supports selection of candidates in menu (candidate list) by cursor keys, TAB and S-TAB. The feature [**auto-complete**](https://github.com/akinomyoga/ble.sh/wiki/Manual-%C2%A77-Completion#user-content-sec-auto-complete) supports the automatic suggestion of completed texts as in `fish` and `zsh-autosuggestions` (with Bash 4.0+). The feature [**menu-filter**](https://github.com/akinomyoga/ble.sh/wiki/Manual-%C2%A77-Completion#user-content-sec-menu-filter) integrates automatic filtering of candidates into menu completion (with Bash 4.0+). There are other functionalities such as [**dabbrev**](https://github.com/akinomyoga/ble.sh/wiki/Manual-%C2%A77-Completion#user-content-sec-dabbrev) and [**sabbrev**](https://github.com/akinomyoga/ble.sh/wiki/Manual-%C2%A77-Completion#user-content-sec-sabbrev) like [*zsh abbreviations*](https://unix.stackexchange.com/questions/6152/zsh-alias-expansion) or [`zsh-abbr`](https://github.com/olets/zsh-abbr). - **Vim editing mode**: Enhance `readline`'s vi editing mode available with `set -o vi`. Vim editing mode supports various vim modes such as char/line/block visual/select mode, replace mode, command mode, operator pending mode as well as insert mode and normal mode. Vim editing mode supports various operators, text objects, registers, keyboard macros, marks, etc. It also provides `vim-surround` as an option. - Other interesting features include [**status line**](https://github.com/akinomyoga/ble.sh/wiki/Manual-%C2%A74-Editing#user-content-bleopt-prompt_status_line), [**history share**](https://github.com/akinomyoga/ble.sh/wiki/Manual-%C2%A74-Editing#user-content-bleopt-history_share), [**right prompt**](https://github.com/akinomyoga/ble.sh/wiki/Manual-%C2%A74-Editing#user-content-bleopt-prompt_rps1), [**transient prompt**](https://github.com/akinomyoga/ble.sh/wiki/Manual-%C2%A74-Editing#user-content-bleopt-prompt_ps1_transient), [**xterm title**](https://github.com/akinomyoga/ble.sh/wiki/Manual-%C2%A74-Editing#user-content-bleopt-prompt_xterm_title), etc. Note: ble.sh does not provide specific settings of the prompt, aliases, functions, etc. ble.sh provides a more fundamental infrastructure so that users can set up their own prompt, aliases, functions, etc. Of course ble.sh can be used in combination with other Bash configurations such as [`bash-it`](https://github.com/Bash-it/bash-it) and [`oh-my-bash`](https://github.com/ohmybash/oh-my-bash). > Demo (version 0.2) > > ![ble.sh demo gif](https://github.com/akinomyoga/ble.sh/wiki/images/trial1.gif) ## History and roadmap My little experiment has took place in one corner of my `bashrc` in the end of May, 2013 after I enjoyed some article on `zsh-syntax-highlighting`. I initially thought something can be achieved by writing a few hundred of lines of codes but soon realized that everything needs to be re-implemented for the authentic support of syntax highlighting in Bash. I decided to make it as an independent script `ble.sh`. The name stemmed from that of Zsh's line editor, *ZLE* (*Zsh Line Editor*), but suffixed with `.sh` for the implication of being written in shell script. I'm occasinally asked about the pronunciation of `ble.sh`, but you can actually pronounce it as you like. After the two-week experiment, I was satisfied with my conclusion that it is *possible* to implement a full-featured line editor in Bash that satisfies the actual daily uses. The real efforts of improving the prototype implementation for the real uses was started in Feburuary, 2015. I released the initial version in the next December. Until then, the basic part of the line editor was completed. The implementation of vim mode has been started in September, 2017 and completed in the next March. I started working on the enhancement of the completion in August, 2018 and released it in the next February. - 2013-06 v0.0 -- prototype - 2015-12 v0.1 -- Syntax highlighting [[v0.1.14](https://github.com/akinomyoga/ble.sh/releases/tag/v0.1.14)] - 2018-03 v0.2 -- Vim mode [[v0.2.6](https://github.com/akinomyoga/ble.sh/releases/tag/v0.2.6)] - 2019-02 v0.3 -- Enhanced completion [[v0.3.3](https://github.com/akinomyoga/ble.sh/releases/tag/v0.3.3)] - 20xx-xx v0.4 (plan) -- programmable highlighting [`master`] - 20xx-xx v0.5 (plan) -- TUI configuration - 20xx-xx v0.6 (plan) -- error diagnostics? # 1 Usage ## 1.1 Try `ble.sh` generated from source (version ble-0.4 devel) ### Generate To generate `ble.sh`, `gawk` (GNU awk) and `gmake` (GNU make) (in addition to Bash and POSIX standard utilities) is required. The file `ble.sh` can be generated using the following commands. If you have GNU make installed on `gmake`, please use `gmake` instead of `make`. ```bash git clone --recursive https://github.com/akinomyoga/ble.sh.git cd ble.sh make ``` A script file `ble.sh` will be generated in the directory `ble.sh/out`. ### Try Then, you can load `ble.sh` in the Bash session using the `source` command: ```bash source out/ble.sh ``` ### Install To install `ble.sh` in a specified directory, use `make install`. ```bash # INSTALL to ~/.local/share/blesh make install # INSTALL to a specified directory make install INSDIR=/path/to/blesh # PACKAGE (for package maintainers) make install DESTDIR=/tmp/blesh-package PREFIX=/usr/local ``` If either the make variables `DESTDIR` or `PREFIX` is supplied, `ble.sh` will be copied to `$DESTDIR/$PREFIX/share/blesh`. Otherwise, if the make variables `INSDIR` is specified, it will be installed directly on `$INSDIR`. Otherwise, if the environment variable `$XDG_DATA_HOME` is defined, the install location will be `$XDG_DATA_HOME/blesh`. If none of these variables are specified, the default install location is `~/.local/share/blesh`. To set up `.bashrc` see [Sec. 1.3](#set-up-bashrc). ## 1.2 Or, use a tar ball of `ble.sh` obtained from GitHub releases For download, trial and install, see the description at each release page. The stable versions are significantly old compared to the devel version, so many features are unavailable. - Devel [v0.4.0-devel2](https://github.com/akinomyoga/ble.sh/releases/tag/v0.4.0-devel2) (2020-12) - Stable [v0.3.3](https://github.com/akinomyoga/ble.sh/releases/tag/v0.3.3) (2019-02 fork) Enhanced completions - Stable [v0.2.6](https://github.com/akinomyoga/ble.sh/releases/tag/v0.2.6) (2018-03 fork) Vim mode - Stable [v0.1.14](https://github.com/akinomyoga/ble.sh/releases/tag/v0.1.14) (2015-12 fork) Syntax highlighting ## 1.3 Set up `.bashrc` If you want to load `ble.sh` by default in interactive sessions of `bash`, usually one can just source `ble.sh` in `~/.bashrc`, but more reliable way is to add the following codes to your `.bashrc` file: ```bash # bashrc # Add this lines at the top of .bashrc: [[ $- == *i* ]] && source /path/to/blesh/ble.sh --noattach # your bashrc settings come here... # Add this line at the end of .bashrc: [[ ${BLE_VERSION-} ]] && ble-attach ``` ## 1.4 User settings `~/.blerc` User settings can be placed in the init script `~/.blerc` (or `${XDG_CONFIG_HOME:-$HOME/.config}/blesh/init.sh` if `~/.blerc` is not available) whose template is available as the file [`blerc`](https://github.com/akinomyoga/ble.sh/blob/master/blerc) in the repository. The init script is a Bash script which will be sourced during the load of `ble.sh`, so any shell commands can be used in `~/.blerc`. If you want to change the default path of the init script, you can add the option `--rcfile INITFILE` to `source ble.sh` as the following example: ```bash # in bashrc # Example 1: ~/.blerc will be used by default [[ $- == *i* ]] && source /path/to/blesh/ble.sh --noattach # Example 2: /path/to/your/blerc will be used [[ $- == *i* ]] && source /path/to/blesh/ble.sh --noattach --rcfile /path/to/your/blerc ``` ## 1.5 Update You need Git (`git`), GNU awk (`gawk`) and GNU make (`make`). For `ble-0.3+`, you can run `ble-update` in the session with `ble.sh` loaded: ```bash $ ble-update ``` For `ble.0.4+`, you can also update it outside the `ble.sh` session using ```bash $ bash /path/to/ble.sh --update ``` You can instead download the latest version by `git pull` and install it: ```bash cd ble.sh # <-- enter the git repository you already have git pull git submodule update --recursive --remote make make INSDIR="$HOME/.local/share/blesh" install ``` ## 1.6 Uninstall Basically you can simply delete the installed directory and the settings that user added. - Close all the `ble.sh` sessions (the Bash interactive sessions with `ble.sh`) - Remove the added lines in `.bashrc`. - Remove `blerc` files (`~/.blerc` or `~/.config/blesh/init.sh`) if any. - Remove the installed directory. - Remove the cache directory `~/.cache/blesh` if any. - Remove the temporary directory `/tmp/blesh` if any [ Only needed when your system does not automatically clears `/tmp` ]. # 2 Basic settings Here some of the settings for `~/.blerc` are picked up. You can find useful settings also in [Q\&A](https://github.com/akinomyoga/ble.sh/wiki/Q&A), [Recipes](https://github.com/akinomyoga/ble.sh/wiki/Recipes) and [`contrib` repository](https://github.com/akinomyoga/blesh-contrib). The complete list of setting items can be found in the template [`blerc`](https://github.com/akinomyoga/ble.sh/blob/master/blerc). For detailed explanations please refer to [Manual](https://github.com/akinomyoga/ble.sh/wiki). ## 2.1 Vim mode For the vi/vim mode, check [the wiki page](https://github.com/akinomyoga/ble.sh/wiki/Vi-(Vim)-editing-mode). ## 2.2 Disable features One of frequently asked questions is the way to disable a specific feature that `ble.sh` adds. Here the settings for disabling features are summarized. ```bash # Disable syntax highlighting bleopt highlight_syntax= # Disable highlighting based on filenames bleopt highlight_filename= # Disable highlighting based on variable types bleopt highlight_variable= # Disable auto-complete (Note: auto-complete is enabled by default in bash-4.0+) bleopt complete_auto_complete= # Tip: you may instead specify the delay of auto-complete in millisecond bleopt complete_auto_delay=300 # Disable auto-complete based on the command history bleopt complete_auto_history= # Disable ambiguous completion bleopt complete_ambiguous= # Disable menu-complete by TAB bleopt complete_menu_complete= # Disable menu filtering (Note: auto-complete is enabled by default in bash-4.0+) bleopt complete_menu_filter= # Disable EOF marker like "[ble: EOF]" bleopt prompt_eol_mark='' # Tip: you may instead specify another string: bleopt prompt_eol_mark='⏎' # Disable error exit marker like "[ble: exit %d]" bleopt exec_errexit_mark= # Tip: you may instead specify another string: bleopt exec_errexit_mark=$'\e[91m[error %d]\e[m' # Disable elapsed-time marker like "[ble: elapsed 1.203s (CPU 0.4%)]" bleopt exec_elapsed_mark= # Tip: you may instead specify another string bleopt exec_elapsed_mark=$'\e[94m[%ss (%s %%)]\e[m' # Tip: you may instead change the threshold of showing the mark bleopt exec_elapsed_enabled='sys+usr>=10*60*1000' # e.g. ten minutes for total CPU usage ``` ## 2.3 CJK Width The option `char_width_mode` controls the width of the Unicode characters with `East_Asian_Width=A` (Ambiguous characters). Currently four values `emacs`, `west`, `east`, and `auto` are supported. With the value `emacs`, the default width in emacs is used. With `west` all the ambiguous characters have width 1 (Hankaku). With `east` all the ambiguous characters have width 2 (Zenkaku). With `auto` the width mode `west` or `east` is automatically chosen based on the terminal behavior. The default value is `auto`. Appropriate value should be chosen in accordance with your terminal behavior. For example, the value can be changed to `west` as: ```bash bleopt char_width_mode='west' ``` ## 2.4 Input Encoding The option `input_encoding` controls the encoding scheme used in the decode of input. Currently `UTF-8` and `C` are available. With the value `C`, byte values are directly interpreted as character codes. The default value is `UTF-8`. For example, the value can be changed to `C` as: ```bash bleopt input_encoding='C' ``` ## 2.5 Bell The options `edit_abell` and `edit_vbell` control the behavior of the edit function `bell`. If `edit_abell` is a non-empty string, audible bell is enabled, i.e. ASCII Control Character `BEL` (0x07) will be written to `stderr`. If `edit_vbell` is a non-empty string, visual bell is enabled. By default, the audible bell is enabled while the visual bell is disabled. The option `vbell_default_message` specifies the message shown as the visual bell. The default value is `' Wuff, -- Wuff!! '`. The option `vbell_duration` specifies the display duration of the visual-bell message. The unit is millisecond. The default value is `2000`. For example, the visual bell can be enabled as: ``` bleopt edit_vbell=1 vbell_default_message=' BEL ' vbell_duration=3000 ``` For another instance, the audible bell is disabled as: ``` bleopt edit_abell= ``` ## 2.6 Highlight Colors The colors and attributes used in the syntax highlighting are controlled by `ble-face` function. The following code reproduces the default configuration: ```bash # highlighting related to editing ble-face -s region bg=60,fg=white ble-face -s region_target bg=153,fg=black ble-face -s region_match bg=55,fg=white ble-face -s region_insert fg=12,bg=252 ble-face -s disabled fg=242 ble-face -s overwrite_mode fg=black,bg=51 ble-face -s auto_complete fg=238,bg=254 ble-face -s menu_filter_fixed bold ble-face -s menu_filter_input fg=16,bg=229 ble-face -s vbell reverse ble-face -s vbell_erase bg=252 ble-face -s vbell_flash fg=green,reverse ble-face -s prompt_status_line fg=231,bg=240 # syntax highlighting ble-face -s syntax_default none ble-face -s syntax_command fg=brown ble-face -s syntax_quoted fg=green ble-face -s syntax_quotation fg=green,bold ble-face -s syntax_escape fg=magenta ble-face -s syntax_expr fg=26 ble-face -s syntax_error bg=203,fg=231 ble-face -s syntax_varname fg=202 ble-face -s syntax_delimiter bold ble-face -s syntax_param_expansion fg=purple ble-face -s syntax_history_expansion bg=94,fg=231 ble-face -s syntax_function_name fg=92,bold ble-face -s syntax_comment fg=242 ble-face -s syntax_glob fg=198,bold ble-face -s syntax_brace fg=37,bold ble-face -s syntax_tilde fg=navy,bold ble-face -s syntax_document fg=94 ble-face -s syntax_document_begin fg=94,bold ble-face -s command_builtin_dot fg=red,bold ble-face -s command_builtin fg=red ble-face -s command_alias fg=teal ble-face -s command_function fg=92 ble-face -s command_file fg=green ble-face -s command_keyword fg=blue ble-face -s command_jobs fg=red ble-face -s command_directory fg=26,underline ble-face -s filename_directory underline,fg=26 ble-face -s filename_directory_sticky underline,fg=white,bg=26 ble-face -s filename_link underline,fg=teal ble-face -s filename_orphan underline,fg=teal,bg=224 ble-face -s filename_executable underline,fg=green ble-face -s filename_setuid underline,fg=black,bg=220 ble-face -s filename_setgid underline,fg=black,bg=191 ble-face -s filename_other underline ble-face -s filename_socket underline,fg=cyan,bg=black ble-face -s filename_pipe underline,fg=lime,bg=black ble-face -s filename_character underline,fg=white,bg=black ble-face -s filename_block underline,fg=yellow,bg=black ble-face -s filename_warning underline,fg=red ble-face -s filename_url underline,fg=blue ble-face -s filename_ls_colors underline ble-face -s varname_array fg=orange,bold ble-face -s varname_empty fg=31 ble-face -s varname_export fg=200,bold ble-face -s varname_expr fg=92,bold ble-face -s varname_hash fg=70,bold ble-face -s varname_number fg=64 ble-face -s varname_readonly fg=200 ble-face -s varname_transform fg=29,bold ble-face -s varname_unset fg=124 ble-face -s argument_option fg=teal ble-face -s argument_error fg=black,bg=225 ``` The current list of faces can be obtained by the following command (`ble-face` without arguments): ```console $ ble-face ``` The color codes can be checked in output of the function `ble-color-show` (defined in `ble.sh`): ```console $ ble-color-show ``` ## 2.7 Key Bindings Key bindings can be controlled with the shell function, `ble-bind`. For example, with the following setting, "Hello, world!" will be inserted on typing C-x h ```bash ble-bind -f 'C-x h' 'insert-string "Hello, world!"' ``` For another example, if you want to invoke a command on typing M-c, you can write as follows: ```bash ble-bind -c 'M-c' 'my-command' ``` Or, if you want to invoke a edit function (designed for Bash `bind -x`) on typing C-r, you can write as follows: ```bash ble-bind -x 'C-r' 'my-edit-function' ``` The existing key bindings are shown by the following command: ```console $ ble-bind -P ``` The list of widgets is shown by the following command: ```console $ ble-bind -L ``` If you want to run multiple widgets with a key, you can define your own widget by creating a function of the name `ble/widget/YOUR_WIDGET_NAME` as illustrated in the following example. It is highly recommended to prefix the widget name with `YOUR_NAME/`, `my/`, `blerc/`, `dotfiles/`, etc. in order not to conflict with the names of the existing standard widgets. ```bash # Example of calling multiple widgets with the key C-t function ble/widget/my/example1 { ble/widget/beginning-of-logical-line ble/widget/insert-string 'echo $(' ble/widget/end-of-logical-line ble/widget/insert-string ')' } ble-bind -f C-t my/example1 ``` # 3 Tips ## 3.1 Use multiline mode When the command line string contains a newline character, `ble.sh` enters the MULTILINE mode. By typing C-v C-j or C-q C-j, you can insert a newline character in the command line string. In the MULTILINE mode, RET (C-m) causes insertion of a new newline character. In the MULTILINE mode, the command can be executed by typing C-j. When the shell option `shopt -s cmdhist` is set (which is the default), RET (C-m) inserts a newline if the current command line string is syntactically incomplete. ## 3.2 Use vim editing mode If `set -o vi` is specified in `.bashrc` or `set editing-mode vi` is specified in `.inputrc`, the vim mode is enabled. For details, please check [the wiki page](https://github.com/akinomyoga/ble.sh/wiki/Vi-(Vim)-editing-mode). ## 3.3 Use `auto-complete` The feature `auto-complete` is available in Bash 4.0 or later. `auto-complete` automatically suggests a possible completion on user input. The suggested contents can be inserted by typing S-RET (when the cursor is at the end of the command line, you can also use right, C-f or end to insert the suggestion). If you want to insert only first word of the suggested contents, you can use M-right or M-f. If you want to accept the suggestion and immediately run the command, you can use C-RET (if your terminal supports this special key combination). ## 3.4 Use `sabbrev` (static abbrev expansions) By registering words to `sabbrev`, the words can be expanded to predefined strings. When the cursor is just after a registered word, typing SP causes `sabbrev` expansion. For example, with the following settings, when you type SP after the string `command L`, the command line will be expanded to `command | less`. ```bash # blerc ble-sabbrev L='| less' ``` The sabbrev names that starts from `\` are also recommended since it is unlikely to conflict with the real words that is a part of the executed command. ```bash # blerc ble-sabbrev '\L'='| less' ``` # 4 Contributors I received many feedbacks from many people in GitHub Issues/PRs. I thank all such people for supporting the project. Among them, the following people have made particularly significant contributions. - [`@cmplstofB`](https://github.com/cmplstofB) helped me implementing vim-mode by testing it and giving me a lot of suggestions. - [`@dylankb`](https://github.com/dylankb) reported many issues for fzf-integration, initialization, etc. - [`@rux616`](https://github.com/rux616) reported several issues and created a PR for fixing the default path of `.blerc` - [`@timjrd`](https://github.com/timjrd) suggested and contributed to performance improvements in completion. - [`@3ximus`](https://github.com/3ximus) reported many issues for a wide variety of problems.