Skip to content

説明書 §1 基本

Koichi Murase edited this page Mar 1, 2023 · 24 revisions

[ 日本語 | English ] ≫ 説明書 [§1 基本 | §2 描画 | §3 束縛 | §4 編集 | §5 Emacs | §6 Vim | §7 補完 | §8 他]

1. ble.sh 概要

ble.sh - Bash Line Editor (version 0.4)

ble.sh.bashrc から読み込める GNU Bash の設定として、Bash スクリプトで書かれたラインエディタです。 Bash に付属のラインエディタ GNU Readline を置き換えて動作することにより、Readline にはない様々な機能を提供します。

  • 構文着色: fishzsh-syntax-highlighting のような文法構造に従った着色を行います。 zsh-syntax-highlighting のような単純な着色ではなく、構文の入れ子構造や複数のヒアドキュメントなども正しく解析して着色します。
  • 補完増強: 補完を大幅に増強します。 文法構造に応じた補完、クォートやパラメータ展開を展開した上でのプログラム補完、曖昧補完に対応しています。 また、候補をカーソルキーや TAB, S-TAB で選択できるメニュー補完fishzsh-autosuggestions のような自動補完 (Bash 4.0 以上) の機能もあります。 更に、従来 pecofzf を呼び出さなければならなかった補完候補の絞り込みもメニュー絞り込み (Bash 4.0 以上) として自然な形で組み込んでいます。 他に、動的略語展開や、zsh-abbreviations のような静的略語展開にも対応しています。
  • Vim編集モード: set -o vi による編集モードを増強します。 挿入・ノーマルモードの他に(行・矩形)ビジュアルモード、置換モードなどの各種モードに対応しています。 テキストオブジェクト・各種レジスタ・オペレータ・キーボードマクロなどにも対応しています。 拡張として vim-surround も提供しています。

1.1 入手方法

GitHub のリポジトリ から利用できます。ライセンスは 3条項BSD です。以下において $HOME/.local/share/blesh の部分は好きなインストール先に置き換えて実行してください。 Arch Linux では AUR からインストールして頂く事も可能です。

選択肢1: GitHub のアカウントがない場合、またはSSH鍵を登録していない場合

※ git, GNU make, GNU awk が必要 になります

git clone --recursive https://github.com/akinomyoga/ble.sh.git
cd ble.sh
make
make INSDIR="$HOME/.local/share/blesh" install

選択肢2: GitHub 上にSSH鍵を登録している場合

※ git, GNU make, GNU awk が必要 になります

git clone --recursive git@github.com:akinomyoga/ble.sh.git
cd ble.sh
make
make INSDIR="$HOME/.local/share/blesh" install

選択肢3: curl を使って生成済み ble.sh v0.3 (前バージョン・機能制限あり) を入手する場合

※ curl, xz, GNU tar が必要 になります

curl -LO https://github.com/akinomyoga/ble.sh/releases/download/v0.3.2/ble-0.3.1.tar.xz
tar xJf ble-0.3.1.tar.xz
cp -r ble-0.3.1 "$HOME/.local/share/blesh"

選択肢4: wget を使って生成済み ble.sh v0.3 (前バージョン・機能制限あり) を入手する場合

※ wget, xz, GNU tar が必要 になります

wget https://github.com/akinomyoga/ble.sh/releases/download/v0.3.2/ble-0.3.1.tar.xz
tar xJf ble-0.3.1.tar.xz
cp -r ble-0.3.1 "$HOME/.local/share/blesh"

アップデート方法

※ git, GNU make, GNU awk が必要 になります

ble.sh をロードした状態で ble-update コマンドを実行して下さい (ble-0.3 以降)。

ble-update   # ble-0.3+

または、既に ble.sh の git リポジトリをお持ちの場合は以下のようにしてアップデートできます。

cd ble.sh   # ※既に持っている git リポジトリに入る
git pull
git submodule update --recursive --remote
make
make INSDIR="$HOME/.local/share/blesh" install

1.2 設定方法

設定の一例です。~/.bashrc に以下のように記述します。

# bashrc

# .bashrc の先頭近くに以下を記述します
[[ $- == *i* ]] &&
  source "$HOME/.local/share/blesh/ble.sh" --noattach --rcfile "$HOME/.blerc"

# 通常の設定は間に書きます。

# .bashrc の末端近くに以下を記述します。
[[ ${BLE_VERSION-} ]] && ble-attach

# Note: ble-0.2 以前では代わりに以下を記述して下さい。
#((_ble_bash)) && ble-attach

~/.blerc または ~/.config/blesh/init.shble.sh 専用の設定を記述します。 例えば以下のようにして設定コマンドを並べます。 ~/.blerc は Bash スクリプトとして source されるので、 通常のコマンドや if, while などの制御構文を使うことができます。

# blerc (例)

bleopt char_width_mode=east
bleopt input_encoding=UTF-8
bleopt edit_abell=1
bleopt edit_vbell= vbell_default_message=' Wuff, -- Wuff!! ' vbell_duration=2000

1.2.1 関数 bleopt [name[=value|:=value]...] ―設定変数の設定―

現在の設定を表示、または設定を変更するのに使う関数です。 引数無しで呼び出すと、全ての設定変数について現在の設定を出力します。 name=value の形式の引数を指定すると、既存の設定変数 name に値 value を設定します。 設定変数 name が存在しない場合はエラーとなります。 value に無効な値を指定した場合はエラーとなります。 name:=value の形式の引数を指定すると、設定変数 name がなければ新しく作成し、値 value を設定します。 name の形式の引数を指定すると、その設定変数の現在の値を出力します。 設定変数 name が存在しない場合はエラーとなります。

次節1.3で中でも基本的な設定変数について説明します。 それ以外の設定変数は関連する各記述の場所において説明します。

1.2.2 関数 blehook [hook_name+=shell-command] (v0.4) ―フックの設定―

指定した名前のフックに対してハンドラを追加します。 引数を何も指定しなかった場合は現在登録されているフックとハンドラの一覧を出力します。

# ハンドラの登録
blehook hook_name+=shell-command

# ハンドラの削除
blehook hook_name-=shell-command

# 未登録の場合、ハンドラを登録
blehook hook_name!=shell-command

# 既存の重複を削除し、末尾にハンドラを追加
blehook hook_name-+=shell-command

# 既存の重複を削除し、先頭にハンドラを追加
blehook hook_name+-=shell-command

# ハンドラの設定 (既存のハンドラは破棄)
blehook hook_name=shell-command

# フックとハンドラの一覧
blehook

基本的なフック名として以下のものが用意されています。

フック名 引数 説明
PRECMD なし プロンプト更新時 (PROMPT_COMMAND の直前)
ADDHISTORY コマンド コマンド履歴に行を追加する時 (終了ステータスが失敗の時、履歴追加がキャンセルされます)
PREEXEC コマンド コマンド実行直前
POSTEXEC コマンド コマンド実行直後
ERREXIT コマンド コマンド実行直後、終了ステータスが非零の時
CHPWD なし コマンド実行終了後にカレントディレクトリ $PWD が変化していた時
EXIT なし Bash が終了する時
ATTACH なし ble.sh が attach した直後
DETACH なし ble.sh が detach する直前

PRECMD, PREEXEC, POSTEXEC, ERREXIT フックでは、前のコマンドの PIPESTATUS が格納された配列変数 BLE_PIPESTATUS を参照できます。

[ Note: 開発中に存在した ERR フックは ble-0.4-devel3 (2022-08-22) にて ERREXEC に改名されました。 ]

例えば、現在のコマンドがコマンド履歴に登録されるのをキャンセルするには、ADDHISTORY フックを用いて以下のように設定します。

# blerc

function my/addhistory.hook {
  local command=$1 pattern='<パターン>'     # <-- <パターン> に登録をキャンセルするコマンドのパターンを指定します
  [[ $command != $pattern ]]
}
blehook ADDHISTORY=my/addhistory.hook

或いは、実際に実行されたコマンドを変換・調整してコマンド履歴に登録するには、自動的な履歴の登録をキャンセルし代わりに手動で履歴項目を追加します。 If one wants to register a transformed command instead of the real command that has been executed, one can cancel the addition and instead manually add a history entry:

# blerc

function my/addhistory.hook {
  local command=$1
  history -s "$(transform "$command")"      # <-- 手動で履歴に文字列を登録します (transform は変換・調整を行う仮のコマンド名です)
  return 1                                  # <-- 常に ble.sh による履歴登録はキャンセル
}
blehook ADDHISTORY=my/addhistory.hook

1.3 基本設定

1.3.1 設定変数 char_width_mode (曖昧文字幅)

# 既定値

bleopt char_width_mode=auto # ble-0.3以降
bleopt char_width_mode=east # ble-0.2以前

設定 char_width_mode を用いて、曖昧文字幅を持つ文字 (Unicode 参考特性 East_Asian_WidthA (Ambiguous) の文字) の幅を制御できます。 現在は 4 つの選択肢 emacs, west, east, 'auto' が用意されています。 設定値 west を指定した場合、全ての曖昧文字幅を 1 (半角) と解釈します。 設定値 east を指定した場合、全ての曖昧文字幅を 2 (全角) と解釈します。 設定値 emacs を指定した場合、GNU Emacs における既定の文字幅と同じ物を使います。 設定値 musl を指定した場合、2014年時点の musl C 標準ライブラリの wcwidth に等価な表を用います (最近の musl はより Unicode に近いので west または east を使用してください)。 設定値 auto を指定した場合、モードを端末とのやり取りに基づいて自動判定します。 既定値は auto です。この設定変数は、利用している端末の振る舞いに応じて適切に設定する必要があります。 例えば west に設定する場合は以下の様にします:

bleopt char_width_mode='west'

1.3.2 設定変数 input_encoding (文字コード)

設定 input_encoding は入力の文字コードを制御するのに使います。現在 UTF-8C のみに対応しています。 設定値 C を指定した場合は、受信したバイト値が直接文字コードであると解釈されます。 既定値は UTF-8 です。C に設定を変更する場合には以下の様にします:

bleopt input_encoding='C'

1.3.3 設定変数 pager (v0.2)

# 既定値
bleopt pager=

ble.sh が情報を表示するに使用するページャを指定します。 この値が空文字列の時、シェル変数 $PAGER の値が使用されます。 シェル変数 $PAGER も空文字列の時、 less, pager, more, cat の順にコマンドが試されます。

1.3.4 設定変数 editor (v0.4)

# 既定値
bleopt editor=

この設定は編集関数 edit-and-execute (C-x C-e) または 設定 bleopt line_limit_type=editor で用いるエディタを指定します。 例えば、emacs -nw, vim, nano などの値が考えられます。 この設定が空文字列の時、代わりにシェル変数 VISUAL の設定が使われます。 VISUAL も空の時はシェル変数 EDITOR が使われ、 それも空の場合は emacs -nw, vim, nano の中から使用可能なコマンドが選択されます。 使用可能なコマンドもない場合は、vi が試みられます。

1.4 ヒント

1.4.1 複数行モードについて

コマンドラインに改行が含まれている場合、複数行モード (MULTILINE モード) になります。

C-v C-j または C-q C-j または (Emacs 編集モードで) M-RET とすると改行をコマンドラインの一部として入力できます。 複数行モードでは、RET (C-m) はコマンドの実行ではなく新しい改行の挿入になります。 複数行モードでは、C-j を用いてコマンドを実行して下さい。

shopt -s cmdhist が設定されているとき (既定)、もし RET (C-m) を押した時にコマンドラインが構文的に閉じていなければ、コマンドの実行ではなく改行の挿入を行います。

1.4.2 Vim 編集モード

ble.sh には Bash 既定の Readline と同様に Emacs 編集モード (既定) と Vim 編集モードがあります。 .bashrc (もしくは .blerc) に set -o vi が設定されているとき、または .inputrcset editing-mode vi が設定されているとき、Vim 編集モードが有効になります。 Vim モードの簡単な設定については Vimモードの導入 を御覧ください。


[ 日本語 | English ] ≫ 説明書 [§1 基本 | §2 描画 | §3 束縛 | §4 編集 | §5 Emacs | §6 Vim | §7 補完 | §8 他]

Clone this wiki locally