Ble.sh: [補完]「~.」のような引数を入力すると大量の警告が発生する

Created on 7 Feb 2019  ·  31Comments  ·  Source: akinomyoga/ble.sh

Commit ID: b4fc40c
Bashのバージョン: 5.0.2

コマンドラインにおいて,

$ cat ~.@

ここまで入力した段階で
「-bash: ble-complete/action:tilde/initialize: そのようなファイルやディレクトリはありません」
という警告が際限無く生じます。
Ctrl+Cを押下すると元のコマンドラインに(編集可能な状態で)戻れますが,文字を入力することに関連した操作をしようとすると,再び同じような大量の警告文が表示され,これは非常に厄介です。

私の手元の範囲では,bashやble.shの個人設定に関係なく発生するようです。

bug

Most helpful comment

バージョン番号に関してはセマンティック バージョニング[semver]を採用なさってはいかがでしょうか。もう既に準安定版(v0.1, v0.2)がリリースされているのに,今更それらと非互換なバージョン番号にするのは御法度かもしれないですが。

また,バージョン番号の格納方式については,私はGNU Bashと同様のものにするといいと思います。なぜならble.shを利用しているということは当然GNU Bashを利用しているということで,(もちろん私のように(笑)GNU Bashに不慣れな人間も存在しますが)大抵はGNU Bashの〝作法〟に慣れ親しんでいる筈だからです。

つまり以下のようなものがいいと思います。

$BLE_VERSION
読み込み専用の変数で,ble.shのバージョン情報が文字列として格納されている。 メージャーバージョン,ピリオド,マイナーバージョン,ピリオド,マイナーバージョン(任意で; プラス記号,コミットID)の形式。 現在なら「0.3.1+b4fc40c」(すいません,パッチバージョンが不明なのでここでは1と仮定しています)。
$BLE_VERSINFO
読み込み専用の配列変数で,ble.shのバージョン情報が数値3つと(存在しなくても構わない)コミットID文字列の形式で格納されている。 現在なら;
$ echo $BLE_VERSINFO[0]
0
$ echo $BLE_VERSINFO[1]
3
$ echo $BLE_VERSINFO[2]
1
$ echo $BLE_VERSINFO[3]
b4fc40c

All 31 comments

すみません…実装忘れです…。手元でテストした時に動いているように見えたのは、bash-completion の同様の機能が動いているだけだったみたいです…。

9fafdb3 実装しました。

個人的なことです

その様に仰っていただけるととても幸せです。定期的に報告していただけるだけでも普段から使ってくださっているという事が察せられるので、それだけでも嬉しく思っています。もし使い物になるという判断でしたら、どうぞ他の知人などにもこんなものもあるよという感じで紹介していただけると幸いです。こちらこそ今年もよろしくお願いいたします!

確認いたしました。ありがとうございます。

ありがとうございます! 閉じますね

@cmplstofB ところで関係ないことですみませんが、最近自己アップデート機能を ble-update 関数として提供したのですが、そちらで問題なく動作しているかどうかをお聞かせいただければ幸いです。もし未だお試しになっていない場合には、(既に現在は最新状態になっていると思いますので) 次に何かしら update がある時に試していただければ幸いです。

自己アップデートについて,了解しました(今まで一度も行なっていませんでした)。
今は孰れの環境のble.shも最新の状態にしてしまっていますので,また次の機会に試してみたいと思います!

少し気になったことで,ble.shのバージョンというのはCommit IDやリリース番号で確認するしかないのでしょうか。$BLE_VERSIONのような変数を用意するなどの予定はありますか。もしかして今現在そういったものが無いのはなにか意図がお有りになるのでしょうか($_ble_base/ble-releaseのような内部用のファイルは一時期あったみたいですが……)。不躾な質問で恐縮ですが,よろしければ教えてもらいたいです。

Re: ble.shのバージョン

すみません。version については何も考えていませんでした。特に理由はありませんでした

どのようなものがあると便利そうでしょうか。例えば、

  • リリース番号 と同等の物で問題ないでしょうか。これだと mater ブランチは常に 0.3.alpha なので、細かいバージョンを区別することができません。
  • 或いは、Commit ID を格納した変数で問題ないでしょうか。この場合だと、現在ロードされている ble.sh がどのバージョンかは判別できますが、順序が分からないので「バージョン〇〇以降」のような判定に使うことができません (面倒です)。
  • または、各コミット毎に新しく通し番号 (または日付+番号) などをつけて、順序などが分かるようにした方が良いでしょうか (その場合にはブランチなどに対してどう割り当てるかを考えなければなりませんね…)。

バージョン番号に関してはセマンティック バージョニング[semver]を採用なさってはいかがでしょうか。もう既に準安定版(v0.1, v0.2)がリリースされているのに,今更それらと非互換なバージョン番号にするのは御法度かもしれないですが。

また,バージョン番号の格納方式については,私はGNU Bashと同様のものにするといいと思います。なぜならble.shを利用しているということは当然GNU Bashを利用しているということで,(もちろん私のように(笑)GNU Bashに不慣れな人間も存在しますが)大抵はGNU Bashの〝作法〟に慣れ親しんでいる筈だからです。

つまり以下のようなものがいいと思います。

$BLE_VERSION
読み込み専用の変数で,ble.shのバージョン情報が文字列として格納されている。 メージャーバージョン,ピリオド,マイナーバージョン,ピリオド,マイナーバージョン(任意で; プラス記号,コミットID)の形式。 現在なら「0.3.1+b4fc40c」(すいません,パッチバージョンが不明なのでここでは1と仮定しています)。
$BLE_VERSINFO
読み込み専用の配列変数で,ble.shのバージョン情報が数値3つと(存在しなくても構わない)コミットID文字列の形式で格納されている。 現在なら;
$ echo $BLE_VERSINFO[0]
0
$ echo $BLE_VERSINFO[1]
3
$ echo $BLE_VERSINFO[2]
1
$ echo $BLE_VERSINFO[3]
b4fc40c

ありがとうございます。semver 知りませんでした。情報ありがとうございます。確認してみましたが、まあ標準的なバージョンの付け方ですね。一応 ble.sh でも概ねこれに従っていますが、厳密に従うのは 1.0.0 以降にしようと思います (…と思ったら SemVer 第4項にも 0.y.z について書かれていました)。

変数名・内容についてはその方針で実装することにします。

f27a100 確認していただけますか。丁度 ble-update もお試しいただけると幸いです

確認いたしました。実装ありがとうございます!

ble-updateできないですね……。「ble-update: git repository not found」と言われます。
私のble.shの管理方法は,gitを用いてble.sh一式を専用の場所に取得し,「$ make install」とすることで$XDG_DATA_HOME/blesh以下に導入している,という具合です(普通の方法だと思いますが……)。

どうも$_ble_base_repositoryという変数がないようです。
私が考えつく原因としては,非常に古くからgit pull && make installという形でアップデートし続けていたせいかな,とも思います(その際はまだgitリポジトリを変数に格納していなかったので,当然見付からない)。

確認ありがとうございます!

ble-updateできないですね……。「ble-update: git repository not found」と言われます。

其処で引っかかってしまうのですね…

どうも$_ble_base_repositoryという変数がないようです。

不思議ですね…。ble-update 関数が定義されている時点で _ble_base_repository という変数は存在しているはずなのです…。echo $_ble_base_repository としても空になっているでしょうか。また、インストールされている ble.shfunction update { function ble-update { という行の周囲の内容はどうなっているでしょうか。

インストールされている ble.shfunction update { function ble-update { という行の周囲の内容

このような感じです。

# (第302行)
function ble-update {
  if ! type git make gawk &>/dev/null; then
    local command
    for command in git make gawk; do
      type "$command" ||
        echo "ble-update: '$command' command is not available." >&2
    done
    return 1
  fi
  if [[ $_ble_base_repository == release:* ]]; then
    local branch=${_ble_base_repository#*:}
    ( mkdir -p "$_ble_base/src" && cd "$_ble_base/src" &&
        git clone https://github.com/akinomyoga/ble.sh "$_ble_base/src/ble.sh" -b "$branch" &&
        cd ble.sh && make all && make INSDIR="$_ble_base" install ) &&
      source "$_ble_base/ble.sh"
    return
  fi
  if [[ $_ble_base_repository && -d $_ble_base_repository/.git ]]; then
    ( echo "cd into $_ble_base_repository..." >&2 &&
        cd "$_ble_base_repository" &&
        git pull && ! make -q && make all &&
        if [[ $_ble_base != "$_ble_base_repository"/out ]]; then
          make INSDIR="$_ble_base" install
        fi ) &&
      source "$_ble_base/ble.sh"
    return
  fi
  echo 'ble-update: git repository not found' >&2
  return 1
}

話が逸れる上に,偉そうで申し分けないのですが,ble-updateは利用者がコマンドラインにおいて利用するコマンドですので,できれば(ble-bindコマンドのように)--helpという引数などを受け取って簡単な説明などを表示したほうがいいのではないかと思います。

すみません。function ble-update { の上の行はどうなっていますか。

このような感じです。

if ! ble/base/initialize-cache-directory; then
  echo "ble.sh: failed to initialize \$_ble_base_cache." 1>&2
  return 1
fi

なるほど。。本来は _ble_base_reporitory=... という行が生成されて

if ! ble/base/initialize-cache-directory; then
  echo "ble.sh: failed to initialize \$_ble_base_cache." 1>&2
  return 1
fi
_ble_base_repository='/home/murase/.local/share/blesh'
function ble-update {
  if ! type git make gawk &>/dev/null; then
    local command
    for command in git make gawk; do

の様になっている筈なのでした。これは行の生成に失敗していますね…。BLE_VERSION に関しても同様に行を生成しているのですが、そちらは正しく動いているということですよね。BLE_VERSION は以下の様に挿入されます。

if [[ $_ble_base ]]; then
  if ! ble/base/unload-for-reload &>/dev/null; then
    echo "ble.sh: ble.sh seems to be already loaded." >&2
    return 1
  fi
fi
BLE_VERSION=0.3.0-alpha+f27a100
function ble/base/initialize-version-information {
  local version=$BLE_VERSION
  local hash=
  if [[ $version == *+* ]]; then

versionに関する行の周辺はそちらのコードと全く同じでした。

あの,_ble_base_repositoryという変数は,「ble.shをインストールした場所」ではなく「ble.shをWeb上からローカルに降ろした場所」を表わしているんですよね。

versionに関する行の周辺はそちらのコードと全く同じでした。

うーん。システムによって gawk の振る舞いが異なるという事なのかもしれません…。以下のコマンドの結果を教えていただけないでしょうか。

$ a=b gawk 'BEGIN { c="echo 1:$a:"; while ((c|getline l)>0) print l; exit; }'
$ gawk 'BEGIN { c="a=b; echo 2:$a:"; while ((c|getline l)>0) print l; exit; }'

あの,_ble_base_repositoryという変数は,「ble.shをインストールした場所」ではなく「ble.shをWeb上からローカルに降ろした場所」を表わしているんですよね。

Webから .tar.xz を落とした時は release:ブランチ名 で、git で入手した場合には make を実行したリポジトリの場所を表しています。

Re: $_ble_base_repository変数

gitで入手したble.shをその同じ場所で$ make installしているのですが,多分akinomyoga様の想定の範囲内ですよね……。

Re: GNU AWKの実行結果

$ a=b gawk 'BEGIN { c="echo 1:$a:"; while ((c|getline l)>0) print l; exit; }'
1:b:
$ gawk 'BEGIN { c="a=b; echo 2:$a:"; while ((c|getline l)>0) print l; exit; }'
2:b:
$ gawk --version | head -n 1
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)

Re: $_ble_base_repository変数

はいそうです。。

申し訳ありませんが、一回 ${makeしているディレクトリ}/out/ble.sh を削除してから再度 make install しても _ble_base_repository が存在しないのか、という事を確かめていただくことは可能でしょうか。

Re: GNU AWKの実行結果

ありがとうございます…。ちゃんと期待通りの動作ですね…。

Re: GNU AWKの実行結果

度々すみません。以下の実行結果はどうでしょう

```console
$ cd ${makeしているディレクトリ}
$ gawk '{ while (($0|getline l)>0) print l; }' < pwd=\$(pwd) q=\' Q="'\''"; echo "_ble_base_repository='\${pwd//\$q/\$Q}'"
EOF

生成されませんね……。
ところで,今$ make installした際の出力を見ると,コマンドが失敗している(結局無視されて終了番号0で終わってはいる)ようです。

$ make clean
rm -rf out/ble.sh out/keymap/emacs.sh out/keymap/vi.sh out/keymap/vi_digraph.sh out/keymap/vi_digraph.txt out/keymap/vi_test.sh out/lib/init-term.sh out/lib/init-bind.sh out/lib/core-complete.sh out/lib/core-syntax.sh out/lib/core-edit.ignoreeof-messages.txt out/lib/init-cmap.sh out/lib/vim-surround.sh out/ble.dep
$ make install
DEPENDENCIES_PHONY=1 DEPENDENCIES_OUTPUT=out/ble.dep DEPENDENCIES_TARGET=out/ble.sh \
  /usr/bin/gawk -f ext/mwg_pp.awk ble.pp >/dev/null
sh: 1: Bad substitution
bash make_command.sh install "out/ble.sh" "/home/rentaro/share/blesh/ble.sh"
cp -p keymap/emacs.sh out/keymap/emacs.sh
cp -p keymap/vi.sh out/keymap/vi.sh
cp -p keymap/vi_digraph.sh out/keymap/vi_digraph.sh
cp -p keymap/vi_digraph.txt out/keymap/vi_digraph.txt
cp -p keymap/vi_test.sh out/keymap/vi_test.sh
cp -p lib/init-term.sh out/lib/init-term.sh
cp -p lib/init-bind.sh out/lib/init-bind.sh
cp -p lib/core-complete.sh out/lib/core-complete.sh
/usr/bin/gawk -f ext/mwg_pp.awk lib/core-syntax.sh > out/lib/core-syntax.sh
bash make_command.sh install "out/lib/core-syntax.sh" "/home/rentaro/share/blesh/lib/core-syntax.sh"
cp -p lib/core-edit.ignoreeof-messages.txt out/lib/core-edit.ignoreeof-messages.txt
cp -p lib/init-cmap.sh out/lib/init-cmap.sh
cp -p lib/vim-surround.sh out/lib/vim-surround.sh
~/srv/git/github.com/akinomyoga/ble.sh$ 

Re: GNU AWKの実行結果

$ pwd
/home/XXX/srv/git/github.com/akinomyoga/ble.sh
$ gawk '{ while (($0|getline l)>0) print l; }' <<EOF
pwd=\$(pwd) q=\' Q="'\''"; echo "_ble_base_repository='\${pwd//\$q/\$Q}'"
EOF
sh: 1: Bad substitution

ちなみに直に実行すると↓成功します。

$ pwd=$(pwd) q=\' Q="'\''"; echo "_ble_base_repository='${pwd//\$q/\$Q}'"
_ble_base_repository='/home/rentaro/srv/git/github.com/akinomyoga/ble.sh'

出力を見て思ったのは,GNU Bashでなくsh(僕の環境ではdash)で実行されているのかもしれないですね。

これですね…。${a//b/c} は使えないのでした…。Ubuntu は /bin/sh は dash です。

$ dash -c 'echo ${a//b/c}'
dash: 1: Bad substitution

なるほど……。ちなみに,UbuntuじゃなくてDebian sidを使っています(まあどっちでも殆ど一緒ですが)。

  • 4743c00 直しました
  • 77d459d 形ばかりですが一応 --help 対応

ble-sabbrev に修正があります。そちらで git pull && make install して頂いてから、push 致します。その後に ble-update を試していただきたいと考えています。

ble-update,成功しました!(Already up to date.と表示され終了コード1で終了しました)ありがとうございます。

しかし細かいことですが,リポジトリのディレクトリにcd(1)する際,GNU Bash組込みのcd(1)($ builtin cd)でなく利用者が上書き定義したcd(という名前のalias・函数)が使われるのが気になりました。(僕はcdコマンドに色々機能を持たせたものをインタラクティブシェルで使っているのですが,その色々な機能がble-updateを行なうと実行されてしまいます。まあ然程問題ではないのですが,その処理というのがgitリポジトリに関連する処理なので,少し不安なのです)

リポジトリのディレクトリにcd(1)する際,GNU Bash組込みのcd(1)($ builtin cd)でなく利用者が上書き定義したcd(という名前のalias・函数)が使われるのが気になりました。

ありがとうございます! 確かにそうですね…

  • f4d03f6 --help 対応で壊れた ble-sabbrev 修正しました
  • 2dc3a3f builtin cd を使うようにしました

更新がある時の ble-update 確認お願いいたしますね。

ありがとうございます。ble-updateによるアップデートも無事実行できました。

ありがとうございます!

Was this page helpful?
0 / 5 - 0 ratings