[ Languages: English | 日本語 (Japanese) ]
[ 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 (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.
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 and Sec 1.2 for trial/installation,
Sec 1.3 for the setup of your ~/.bashrc
.
# 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)
blesh-git
(devel),blesh
(stable 0.3.3) maintained by@oc1024
- Syntax highlighting: Highlight command lines input by users as in
fish
andzsh-syntax-highlighting
. Unlike the simple highlighting inzsh-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. - Enhanced completion:
Extend completion
by syntax-aware completion, completion with quotes and parameter expansions in prefix texts, ambiguous candidate generation, etc.
Also, menu-complete
supports selection of candidates in menu (candidate list) by cursor keys, TAB and S-TAB.
The feature auto-complete
supports the automatic suggestion of completed texts as in
fish
andzsh-autosuggestions
(with Bash 4.0+). The feature menu-filter integrates automatic filtering of candidates into menu completion (with Bash 4.0+). There are other functionalities such as dabbrev and sabbrev likezsh-abbreviations
. - Vim editing mode: Enhance
readline
's vi editing mode available withset -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 providesvim-surround
as an option. - Other interesting features include status line, history share, right prompt, transient 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
and oh-my-bash
.
Demo (version 0.2)
1.1 Try ble.sh
generated from source (version ble-0.4 devel)†
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
.
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
.
Then, you can load ble.sh
in the Bash session using the source
command:
source out/ble.sh
To install ble.sh
in a specified directory, use make install
.
# 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.
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 (2020-12)
- Stable v0.3.3 (2019-02 fork) +Enhanced completions
- Stable v0.2.6 (2018-03 fork) +Vim mode
- Stable 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:
# 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
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
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:
# 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
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:
$ ble-update
For ble.0.4+
, you can also update it outside the ble.sh
session using
$ bash /path/to/ble.sh --update
You can instead download the latest version by git pull
and install it:
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
Basically you can simply delete the installed directory and the settings that user added.
- Close all the
ble.sh
sessions (the Bash interactive sessions withble.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
].
Here some of the settings for ~/.blerc
are picked up.
You can find useful settings also in Q&A,
Recipes
and contrib
repository.
The complete list of setting items can be found in the template blerc
.
For detailed explanations please refer to Manual.
For the vi/vim mode, check the Wiki page.
The feature auto-complete
is available for Bash 4.0+ and enabled by default.
If you want to turn off auto-complete
, please put the following line in your ~/.blerc
.
bleopt complete_auto_complete=
Instead of completely turning off auto-complete
, you can set a delay for auto-complete
.
# Set the delay of the auto-complete to 300 milliseconds
bleopt complete_auto_delay=300
auto-complete
candidates based on the bash command history can be turned off by the following line.
bleopt complete_auto_history=
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:
bleopt char_width_mode='west'
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:
bleopt input_encoding='C'
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=
The colors and attributes used in the syntax highlighting are controlled by ble-face
function. The following code reproduces the default configuration:
# 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
The current list of faces can be obtained by the following command (ble-face
without arguments):
$ ble-face
The color codes can be checked in output of the function ble-color-show
(defined in ble.sh
):
$ ble-color-show
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
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:
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:
ble-bind -x 'C-r' 'my-edit-function'
The existing key bindings are shown by the following command:
$ ble-bind -P
The list of widgets is shown by the following command:
$ ble-bind -L
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.
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.
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).
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 command line command L
, the command line will be expanded to command | less
.
# blerc
ble-sabbrev L='| less'
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
helped me implementing vim-mode by testing it and giving me a lot of suggestions.@dylankb
reported many issues for fzf-integration, initialization, etc.@rux616
reported several issues and created a PR for fixing the default path of.blerc
@timjrd
suggested and contributed to performance improvements in completion.@3ximus
reported many issues for a wide variety of problems.