akinomyoga / ble.sh

Bash Line Editor―a line editor written in pure Bash with syntax highlighting, auto suggestions, vim modes, etc. for Bash interactive sessions.
BSD 3-Clause "New" or "Revised" License
2.6k stars 82 forks source link

Support vi-mode #2

Closed akinomyoga closed 6 years ago

akinomyoga commented 7 years ago

set -o vi 対応を行う (参照: #1)。

akinomyoga commented 7 years ago

support-vi-mode ブランチで作業する。 取り敢えず keymap を切り替える機能は整備した daee0b8...f82cbc4

akinomyoga commented 7 years ago

f82cbc4...449dd70 基本的なところは実装した気がする。

挿入モードからノーマルモードへは ESC C-[ C-c で移行する。ノーマルモードでは以下に対応した。


未だ対応していないが優先順位の高いものは以下の通り

akinomyoga commented 7 years ago

449dd70...14223ec 取り敢えずここまで。後は相談の上で実装の予定

新しく対応したもの:

実装仕様:

引用:

akinomyoga commented 7 years ago

@cmplstofB (B-bar) さま。ble.sh における vi-mode の基本的なところはできたように思いますので、改めてテストユーザになっていただくこと、お願いしてもよろしいでしょうか。

もし引き受けて下さる場合は、追って以下についてご説明します。

何卒、よろしくお願い致します。

cmplstofB commented 7 years ago

@akinomyoga 様 貴重な時間を割いていただいて申し訳無いです。テストユーザの件ですが、よろこんで引き受けます。 早速ですが、素の urxvt 及び「urxvt 上の tmux で起動した Vim 上の :sh (Zsh の Vim-mode はここでのバグがあります)」とで確認しました。 素晴しいです! 一通り試しましたが、readline 本来の set -o vi と遜色ないです。 ただ、ちょっと気になった点がありました。これは support-vi-mode ブランチでは再現しませんが、そもそも support-vi-mode ブランチでは C 等の操作が出来ませんでした。

akinomyoga commented 7 years ago

@cmplstofB (B-bar) さま。早速のご報告ありがとうございます! 取り敢えずご報告の点について確認させていただいて宜しいでしょうか。


追ってテストについてご説明いたします。

akinomyoga commented 7 years ago

@cmplstofB (B-bar) さま。特にみていただきたいことは 複数行編集での動作欠けている使用頻度の高いコマンド です。以下、長くなってしまいましたが、気が向いた時に見て頂ければ幸いです。

1. 動作確認: 複数行編集と各コマンド

ble.sh では編集文字列に改行 LF (\n) が含まれているときを複数行編集とし、そうでないときを単一行編集としています。

特に複数行編集のときも含めて、ノーマルモードの各コマンドが動作するか確認して頂きたく思います。

2. 提案など

当然 vi/vim の機能を完全に実装するわけには参りませんので、要望の出たものから順に実装していこうと考えています。そのため "このコマンドは自分はよく使うので実装した便利である" というようなものがありましたら、幾つか提案して頂きたいなと考えています。

3. bashrc の設定について

簡単に使用していただいてもし実用に耐えうると判断できる場合には、もしよろしければで問題ないのですが しばらく使用をしていただいて vi mode の動作に問題がないか検証していただきたいなとも考えております。その場合には

もし使っている内に vi mode の動作について何か提案などが出てきましたらどうぞお気軽にお知らせ下さい (もちろん vi mode 以外の ble.sh の機能についてでも問題ありません)。

4. 質問

私は普段 vi/vim は使わないので以下のページでどのようなコマンドがあるか調べて、実際に vim でどのように動作するのか調べて、それを模倣して実装するという原始的なことをしています。

ところで、そのようにしても動作が良くわからないものというのが存在します。以下についてお聞きしてよいでしょうか。

たぶん、何か勘違いしているのだと思いますが、もし何かご存知のことがありましたら教えて頂けると幸いにございます。

cmplstofB commented 7 years ago

@akinomyoga 様

長くなってしまいました。すいません。

バグだと思ったのは私の認識不足でした。また、「vi-mode で再現」云々はその stty sane について述べているので既に自己解決しています。

動作確認

bashrcの設定

については ble.sh を vi-mode で常用させていただく形で使用します。 しかし失礼ながら学校でサーバ等に対する操作として使うには今の段階で少し怖い面もあるので、基本的に家の Debian 9 のみで使わせてください。 その結果、報告のペースが @akinomyoga 様の想定より遅れることと思います。申し訳無いです。

いまの所、不具合らしきものとして、

しかしその孰れもその正確な再現がまだ出来ない(上手くいくときもある)ので、ある程度使って場数を踏んでから詳細を報告します。

質問

仮想置換モードのことですね。 私の環境 Vim 8.0 1-992 (多分最新版) では特に問題はなかったです。

念の為仮想端末(urxvt)及び端末多重化ソフトウェア(tmux)、Vim が解釈する文字幅を変えてみましたが全ての場合において問題なかったです。

提案

Bash の vi-mode にはないのですが、テキストオブジェクトを実装して欲しいです。Zsh の vim-mode では実装されています。 というかそもそもテキストオブジェクトは Vim の機能ですので vi-mode に実装するというのは少し不自然ですが、個人的には非常に重宝しているので是非とも欲しいです。

テキストオブジェクトについて以下に簡単に説明します。

テキストオブジェクト

テキストオブジェクトというのは簡単に言うと、「マウスの単語上でのダブルクリックのキーコマンド版」です。 例えば次の文がメモ帳などのテキストエディタにあったとして、(ブラウザやコンソールでも同じです)

Lore ipsu dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

"ipsum" という単語の上でダブルクリックするとその位置に拘わらず "ipsum" という単語全体が選択されると思います。これは Bash の Emacs モードだと \eb(選択開始)\ef(選択終了) という動作で模倣できると思います。

テキストオブジェクトはそうした範囲に対して一定の操作を施すという概念です。めちゃ便利です。 実際私は ble.sh に移行する前に似非テキストオブジェクトとして、カーソル位置の単語全体を引用符で囲む \xq\xQ というコマンドを

# ~/.inputrc
"\eq": "\eb\"\ef\""
"\eQ": "\eb\'\ef\'"

という感じで実現していました。めちゃ便利です(しつこい)

Vim におけるテキストオブジェクトはノーマルモードにおいて {operation}iw に割り当てられています。{operation} には c``d``y があります。 例えばノーマルモードでカーソル以下の単語を別の単語にしたい時は ciw と打った後新しい単語を入力します。 本当はもっと沢山種類があるのですが、とりあえずこの {operation}iw だけでも欲しいです。

尚、上述した \xq は Vim では ysiw" です。ややこしくてすいません。(ysが「範囲の両端に操作を施す」、iwが「単語全体に」、"が「"を入力せよ」と分解できます)

cmplstofB commented 7 years ago

@akinomyoga 様 ble.sh における vi-insert モードでの C-o は "accept-and-next" となっていますが、vi/Vim の標準では「次に入力される「一回」のキー[^1]をノーマルモードに対するキーとして解釈し実行した後、再び挿入モードに移る。[^2]」という設定になっています。 Bash 及び Zsh, Fish では実装されていません。私個人としては欲しいことは欲しいですが、この機能はあまりにエディタ的で、シェルの機能を逸脱しているようにも思うというのもあります。 とりあえずの希望としては C-o を未定義(この「未定義」は ble.sh(ble-bind) における nop です)にしていただくと嬉しいです。

私が悪いのですが、何気無く C-o を入力したところプロンプトの行が実行されてしまい驚いたので。

[^1]: 「一回」のというのは「一度のキー入力」という意味ではなく、3l(3回右に進む)や、zz(画面中央に)を含み、例えば 3l という入力の 3 の段階では挿入モードに入らないです。 [^2]: このときのカーソル位置はカーソル移動系のコマンドの時はその移動先、そうでない場合(画面全体に対する操作等)は元のカーソル位置を可能な限り維持という規則です(:help i_CTRL-O)

akinomyoga commented 7 years ago

@cmplstofB (B-bar) 様

早速、ありがとうございます!

その結果、報告のペースが @akinomyoga 様の想定より遅れることと思います。申し訳無いです。

いえお気になさらないで下さい。先の返信にて大量に文章を書いてしまったせいで圧力をかけているようになってしまって申し訳ないです。こちらの想定では、ble.sh を使っているということを余り意識せずに暫く使っていただいて、もし気になることが自然に出てきたらその時点で報告して頂ければと思っておりました。また、やはり ble.sh は駄目だという気になったらいつでも見放しで頂いて問題ありません。

いまの所、不具合らしきものとして、

  • ノーマルモードから挿入モードに移った直後くらいに C-c、C-m 等及び通常のキー入力が「そのようなキーは設定されていない」という警告とともに無視される時がある。
  • 複数行編集において、最初の行を削除した後に移動モードが機能しない。

いまのところ、こちらでは再現しませんね…。暫く様子を見てみます。

質問

仮想置換モードのことですね。 私の環境 Vim 8.0 1-992 (多分最新版) では特に問題はなかったです。

なるほど! ご説明を読みますに私が想像した機能のようで間違いないようですね…と思って改めて調べてみましたら vi で起動すると有効にならないのですね (@ Fedora 25)。vim で起動したところ確認できました。ありがとうございます! vim 素人なので、勝手に vi/vim のどちらで起動しても機能的に同じなのかと勘違いしておりまして、お騒がせしました。

Bash の vi-mode にはないのですが、テキストオブジェクトを実装して欲しいです。Zsh の vim-mode では実装されています。

これば便利そうですね。テキストオブジェクトについて承知しました。vimindex を見るといろいろありますね。振る舞いを色々調べてから実装することにします。

ble.sh における vi-insert モードでの C-o は "accept-and-next" となっていますが、vi/Vim の標準では「次に入力される「一回」のキー[^1]をノーマルモードに対するキーとして解釈し実行した後、再び挿入モードに移る。[^2]」という設定になっています。

これは実装することにします。

実は挿入モードは emacs mode をベースにして未だ余り弄っていないので、気になることは他にもあるのではないかと思います。Vim の動作の中にシェルとしての機能 (コマンド実行、履歴検索など) を織り込まなければならないので、どの程度残すのが良いのかというのも意見を伺いたい点の一つです。

因みにシェルの機能としての C-o は過去に連続して実行したコマンドを同じ順序で連続して実行するときに使うものですね。例えば

$ gcc a.c
$ ./a.out

の後に up up としてコマンド履歴から gcc の行を取り出したあと、C-o を連打するだけで gcc a.c./a.out を繰り返し交互に実行するということができたりします。

cmplstofB commented 7 years ago

@akinomyoga 様 色々実装していただくことになり感謝しています。お手を煩わせて申し訳無いです……。

emacs-mode の C-o も使い慣れると便利ですね。 Vim で言うとインサートモードでの C-@ にに似ている印象があります (:help i_CTRL-@)。 といっても C-@ には「以前の入力を再度入力した後ノーマルモードへ戻る」程度の機能しかなく、 「確定する」という動作はやはり不自然かもしれませんが……。


報告していた以下の二つの挙動ですが、

  • ノーマルモードから挿入モードに移った直後くらいに C-cC-m 等及び通常のキー入力が「そのようなキーは設定されていない」という警告とともに無視される時がある。

  • 複数行編集において、最初の行を削除した後に移動モードが機能しない。

どうも私の端末の問題でした。 Vim で Esc キーを多用するので Esc キーが押下された時 "Meta-" に続く文字をなるべく待たないようにしているのですが、その設定を無効にすると発生しなくなりました。 厳密な再現条件は未だ不明ですが、一応の解決を見たので取り下げます。

提案/質問 --- モードの判定

Vim の最大の利点にして最大の難点はモードの存在ですが、今どんなモードかが一目で分かればその難点は緩和されると思います。

私は

let &t_ti = "\<Esc>[2 q"
let &t_te = "\<Esc>[2 q"
let &t_SI = "\<Esc>[5 q"
let &t_SR = "\<Esc>[4 q"
let &t_EI = "\<Esc>[2 q"

のような記述を ~/.vimrc にすることで、モード毎にカーソルの形状を変えています。(:help terminal-output-codes) (これは端末多重化ソフトウェアによる CS の奪取を考慮していません。ですので実際はもっと複雑な設定になっています。)

bash の vi-mode の場合、inputrc に以下を記述することで実現できました。

set editing-mode vi
$if mode=vi
    set show-mode-in-prompt on
    set vi-ins-mode-string "\1\e[5 q\2"
    set vi-cmd-mode-string "\1\e[2 q\2"
$endif

しかしこれは (GNU) readline の設定ですので、ble.sh では当然有効ではありません。

そこで例えば $KEYMAP という変数に emacs、vi-ins、vi-cmd といった値を格納するようにしてくださると、 プロンプトの最後にカーソル形状を制御する CS を配置し、その値を $KEYMAP に応じて分岐させるといったことが可能になり、 個人的に助かります。 因みに $KEYMAP という変数は Zsh で実際に用いられているものを挙げただけで、名前に意味はないです。

もし $KEYMAP を実装せずとも、現在の段階でなにかモードの判定ができる方法があるのなら、そちらの方法を教えてくださると泣いて喜びます。

akinomyoga commented 7 years ago

14223ec...c2cd318 現時点の様子 (前回からの変更)

少しずつ対応しているところで、一区切りしたら更新しようと思っていたのですが、モードの判定についての提案・質問がありましたのでこの時点で取り敢えず push します。というのも、自分でも現在のモードがわからないのが不便に思ったので、モードを表示する機能を既に加えたからでした。

新しく対応したもの

対応予定 (現在中途半端なところですが)

akinomyoga commented 7 years ago

@cmplstofB (B-bar) 様

ご報告ありがとうございます!

Vim で言うとインサートモードでの C-@ にに似ている印象があります (:help i_CTRL-@)。

上の報告の通り vi の C-o には対応しました。現在 C-o は一時的にコマンドを受け付けるものになっております。C-@ については考えてみます。ただ、これはユーザの皆様に任せて各自の好みに合わせて

ble-bind -m vi_insert -f  C-@ 'vi-insert/@norepeat accept-and-next'

と書いてもらうということにするのが良いかもしれませんね。

どうも私の端末の問題でした。Vim で Esc キーを多用するので Esc キーが押下された時 "Meta-" に続く文字をなるべく待たないようにしているのですが、その設定を無効にすると発生しなくなりました。

この説明を見て思い出しました。実は、今回の vi-mode の実装の過程で ee5c82c291bbd83730a91dbb81f516a0f72b2078 でバグ (複数のキー入力が溜まっているときに2つ目以降の文字が処理されない) を埋め込んでしまいまして、それは 12f332975270112cbbf69395efcbffadaf507905 にて既に修正されました。もしこれに関連しているとすれば、最新版では上記の設定を無効にしなくても動く可能性があります。もしお時間がありましたら簡単に確認して頂けますと幸いです。

Vim の最大の利点にして最大の難点はモードの存在ですが、今どんなモードかが一目で分かればその難点は緩和されると思います。

実は上の報告にも書きましたように、こちらでも独自に気になっていたので既に対応しました。実はノーマルモードに入った直後に C-m などが効かないというご報告の原因を独自に考えまして、もしかして C-l でノーマルモードに戻る設定にしているのが混乱の元かもしれないと考えて、以下の2点の変更を行いました。

そこで例えば $KEYMAP という変数に emacs、vi-ins、vi-cmd といった値を格納するようにしてくださると、

ble.sh の内部的な変数で $_ble_decode_key__kmap がこれに対応しますね…。ただ、これは内部的な変数なので将来的に名前が変わる可能性もあります。公開用のコピー (例えば $BLE_KEYMAP) を作成しても良いのですが、実はそうしたとしても以下の2つの理由により、現状では動きません

もし、今回の変更によるモード表示にご満足いただけた場合にはそれで良いのですが、そうでなければどのように機能を提供するのかもう少し相談が必要になりますね…。

cmplstofB commented 7 years ago

@akinomyoga 様

対応ありがとうございます。


この説明を見て思い出しました。実は、今回の vi-mode の実装の過程で ee5c82c でバグ (複数のキー入力が溜まっているときに2つ目以降の文字が処理されない) を埋め込んでしまいまして、それは 12f3329 にて既に修正されました。

この件ですが、すいません、設定を元に戻すとやはり発生しました。


プロンプトの内容は制御シーケンスも含めて ble.sh で全て解析しています 現状ではカーソルの形状指定 CSI q は捨ててしまうようになっていたはずです。

とのことですが、私の Bash のコマンドプロンプトは

PS1="\w\$\[\033[00m\]\$\[\033[5 q\] "
           ^^^^^^^^^^^^^^^^^^^^^^

となっており、カーソルの形状に関する CS が含まれています。 そしてこの CS はきちんとカーソルの形を変えています。

これだけ見ると、ble.sh がカーソル形状に係る CS を無視していないように思うのですが、これはまた違うのでしょうか。


~ の実装

Vim のノーマルモードにおいて、~ は「カーソル下の英単語の大/小文字をトグルする」という機能です。(:help ~) 私はこの機能をよく使うので、是非実装して欲しいです。

テキストオブジェクト (iw/W 及び aw/W の違い)

テキストオブジェクト、非常に使い易いです! sorround.vim も盛り込んでくださって嬉しいです。 一点、iw/W 及び aw\W の挙動が i a で同じに見えます。 Vim の挙動は iw なら inner word、つまり空白文字を含まない単語を範囲に指定し、aw なら a word、つまり空白文字を範囲に含むのですが、 ble.sh の vi-mode ではどちらも同じ挙動をするように思います。

補完時のカーソルの位置がずれる

$ cat /usr/share

等という文の / の位置で補完しようとすると、補完すべき候補が一行に収まる時は良いのですが、 そうでない場合にカーソルの位置が補完候補の最後から二番目の行(5行に亘るなら4行目)に移動してしまい、以後の入力に支障を来します。

ヒアストリングの補完

vi-mode と直接関係なく、差し出がましいのですが、ヒアストリングの補完について少し気になるところがありました。 例えば

$ python3 <<< 'imp

という文の時、補完に割り当てられたキー(CTRL-I)を押下すると、現在のディレクトリ配下の内容が補完されます。 ちょうど $ cat .// の位置で補完した時の様な挙動です。


カーソルの形状についてですが、今回加えていただいた "--INSERT--" の表示で大満足です。ありがとうございます。

akinomyoga commented 7 years ago

これだけ見ると、ble.sh がカーソル形状に係る CS を無視していないように思うのですが、これはまた違うのでしょうか。

本当ですね。コードを改めてよく見てみたところ、解釈をしてカーソルの位置と SGR の状態遷移の計算はしているけれども、翻訳・プロンプト内容の変更はしていませんでした…。大分前に実装した所なのでうろおぼえて書いてしまいました。なので、この点に関しては大丈夫ですね

(あと提示された PS1 を見て気付いたのですが、さきにお見せ下さった readline の設定を読み違えて CSI q と書きましたが、CSI ... SP q (DECSCUSR) ですね。この点も訂正しておきます。)

cmplstofB commented 7 years ago

解釈をしてカーソルの位置と SGR の状態遷移の計算はしているけれども、翻訳・プロンプト内容の変更はしていません

す、すいません。何をおっしゃっているのか理解できません……。 とりあえず「読み込み初期はカーソル変形の CS は有効だが、モードの変更を監視できる頻度では、カーソル変形の CS は解釈されない。」という理解でよろしいでしょうか。 違っていたらわざわざ解説せず、一言「違います」と言っていただければいいです。

akinomyoga commented 7 years ago

すみません。もしかしてお気づきになったかもしれませんが、部分的な返信になってしまったのは、編集の途中で誤って投稿してしまっていました。今、全体に対する返信を編集しているのですが、先に上記の点についてだけ。

「読み込み初期はカーソル変形の CS は有効だが、モードの変更を監視できる頻度では、カーソル変形の CS は解釈されない。」という理解でよろしいでしょうか。

すみません。舌足らずでした。言いたかったことは違いますね。「ble.sh がカーソル形状に係る CS を無視していない」に関する話で、頻度の話ではありませんでした

akinomyoga commented 7 years ago

@cmplstofB (B-bar) 様

改めて

Re: 続きを待たず ESC を送信するときの不具合について

この件ですが、すいません、設定を元に戻すとやはり発生しました。

確認していただきましてありがとうございます。手間をかけさせてしまったようで恐縮です。タイミングの問題でうまく動作しないというのは、ble.sh のどこかでミスしている可能性があるので、また暫く様子を見てみます。

Re: ~ の実装

これは実装しますね。実は実装候補には入っていたのですが、いろいろの提案を下さった段階で優先順位を下げていました。

Re: テキストオブジェクト (iw/W 及び aw/W の違い)

Vim の挙動は iw なら inner word、つまり空白文字を含まない単語を範囲に指定し、aw なら a word、つまり空白文字を範囲に含むのですが、ble.sh の vi-mode ではどちらも同じ挙動をするように思います。

これはミスですね…。引数をしたときのカウント (2yaw vs 2yiw) しか対応できていませんでした。後で改めます。

Re: 補完時のカーソルの位置がずれる

すみません。これは -- INSERT -- に対応する時に配置計算のコードを整理したのですが、そのときに埋め込んだバグで、 df4685891ad069f74aa67a6cc22a94c37d638fed で直したつもりだったのですがいかがでしょうか。現在こちらでは再現しないのですが、これで直っていなければまた調べます。(今まで意識していなかったのですが、どの commit id で試しているのかも報告のたびに教えて頂けると確認の二度手間を防げて良いかもしれませんね…)

Re: ヒアストリングの補完

vi-mode と直接関係なく、差し出がましいのですが、ヒアストリングの補完について少し気になるところがありました。

いえ、気になることがあれば是非教えて頂ければと思います。こちらの件について、何も候補がなければデフォルトではファイル名を補完候補にすることにしています。ヒアストリングとして何か適切な候補生成の案があれば教えて頂けると助かります。現状では、他に候補も思い浮かばないので、(標準入力にファイル名を入れたいと思うことがないとも限らず) ファイル名を補完するのはまあ妥当かなというように考えておりました。

Re: モード表示に関して

カーソルの形状についてですが、今回加えていただいた "--INSERT--" の表示で大満足です。ありがとうございます。

ありがとうございます! 余り確認する時間もなく push してしまったので、まだ不十分な点が出てくるかもしれませんが、その時はまた教えて頂ければ幸いです。

akinomyoga commented 7 years ago

c2cd318...32f1e67 更新

修正したもの

新しく対応したもの

未対応のもの

akinomyoga commented 7 years ago

@cmplstofB (B-bar) 様

お世話になっております。以下については修正しました。

surround.vim 対応について

先に要望のありました ysiw" についてですが、素の vim で動かなかったので調べた所 surround.vim というものを入れると使えるようになるらしいということが分かったので、その前提で実装することにしました。取り敢えず、surround.vim の機能の中でも ysyss だけ対応することにしました。

元の vim で拡張のようなので、ble.sh でも拡張として実装することにしました。使う場合には、~/.bashrcble.sh の設定で以下のように記述して下さい。

if [[ $- == *i* ]]; then
  source /path/to/blesh/ble.sh noattach

  # 以下の行を追加
  source "$_ble_base/lib/vim-surround.sh"
fi

注意点

特に要望があれば以下も実装できます

Re: 続きを待たず ESC を送信するときの不具合について

関連するか分かりませんが、ノーマルモードで ESC を正しく処理できていなかった (Meta 修飾として扱ったままになっていた) のを修正しました。またハズレかもしれないので恐縮ですが、もし興味があるようでしたらまた試していただくことも可能です。

未決着項目

今までにご報告いただいたものについて、一旦この時点での未決着項目を整理します。

cmplstofB commented 7 years ago

@akinomyoga 様

どの commit id で試しているのかも報告のたびに教えて頂けると確認の二度手間を防げて良いかもしれませんね…

すいません、思慮不足でした。これからはそうします。 私は Git 作業には全くの初心者ですので、他に注意すべき点(報告の形式等)があれば是非教えてくださると助かります。


Re: テキストオブジェクト iw/Waw/W の挙動

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

vim-surrond.sh 拡張

すいません。今見直したらテキストオブジェクトを紹介する際、surrond.vim が必要だという旨の注釈を付け忘れていました。 手間を掛けさせることとなり申し訳無いです。

Re: vim-sorround.sh 拡張への要望

できたら dscs を加えていただけないでしょうか。お願いします。

また、surround_45 変数に相当する機能というより寧ろ ble.sh 謹製の vim-sorround.sh 独自の機能といった方がいいですが、 コマンド展開及び行内演算のマーカを簡単に挿入できると嬉しいです。 具体的には、適当なプレフィクスで $(/)$((/)) を入力したいということです。 個人的に yss-$( line )ysiW=$(( 4+6 )) といった操作が理想です。 (つまり -$(/) に、=$((/)) に対応しているといった感じです)

Re:Re: 複数行の補完候補

1b9e2a4 にて、 複数行に亘る補完候補がある時の不具合が修正されていることを確認しました。ありがとうございます。

Re:Re: ヒアストリング補完

言われてみると、ヒアストリングでの補完は現在ディレクトリ下のファイル/ディレクトリ補完しかないですね……。

行内前後方跳達で検索失敗した時の単語の保存 (:help f)

多分この題を見ても分からないと思います。具体例で示します。 ^ はカーソル位置です。

現在ノーマルモードです。 次のような行において、fs という入力をします。

$ cat ~/doc/a.csv | sort -r | uniq
                               ^  

当然前方に "s" は無いので検索は失敗し、カーソルは不動です。

$ cat ~/doc/a.csv | sort -r | uniq
                               ^  

ここで、本当は後方を検索するのだったと思い直し、Fs とする代わりに fs で "s" が検索されたものと見做して , を入力します。 そうした時に、現状 (1b9e2a4) ではカーソルは不動、もしくは前回成功した捜達で検索された単語に移動してしまいます。

これは Vim の挙動と似わないので、できれば 「検索が失敗してもその単語を記憶し、;/, が入力された時はその単語を前方/後方に再検索する」 という機能にして欲しいです。

% の実装

Vim のノーマルモードにおいて % は「対応する括弧(もしくはそれに準ずるもの)の対に飛ぶ」という機能が割り当てられています。(:help %) 実装していただくととても嬉しいです。 なお、Vim ではこの「対応する括弧」の文字を matchpairs を変更することで設定できますが、シェルのラインエディタとしては標準の ()、{}、[] で十分な気がします。 (下手に <> の組などに対応するとリダイレクトの演算子に反応して面倒なことになりそうですし)

範囲選択

emacs-mode での操作動画 を見てみると、"'select, copy, and paste'" という 句を選択し、貼り付けていますが、vi-mode では不可能なのでしょうか。 理想としてはノーマルモードで v で選択開始、cdy 等の操作を受け付け、^C/^[ で選択を解除、といったものがいいです。

undo

bash 標準 (set -o emacs) では CTRL-_ に「変更を破棄」という機能が割り当てられていますが、これは ble.sh による Readline にはないのでしょうか。 もしあれば、ノーマルモードでの u に割り当てて欲しいです。

Re: 未決着項目

  • ヒアストリングの補完候補 → より良い候補として何が考えられるか?
  • 挿入モード C-@ に accept-and-next を割り当てる可能性 → 後でこちらで考察
  • Esc キーが押下された時 "Meta-" に続く文字を待たずに送信するとキーが認識されないときがある
  • 複数行編集において、最初の行を削除した後に移動モードが機能しないことがある

ヒアストリングの補完候補 → より良い候補として何が考えられるか?

上述しましたが良い補完候補は思い付きませんでした。

挿入モード C-@ に accept-and-next を割り当てる可能性 → 後でこちらで考察

私は既に ~/.bashrc

ble-bind -m vi_insert -f  C-@ 'vi-insert/@norepeat accept-and-next'

という割り当てを行なっていますが、確定を伴なう動作なので標準にしないほうが良いと感じました。 というか正直 Vim での CTRL-@ の挙動とは少々違うので……。

Esc キーが押下された時 "Meta-" に続く文字を待たずに送信するとキーが認識されないときがある

すいません。まだ発生します。@akinomyoga 様の手元で発生しないということは確実に私の端末側の問題ですので、こちらで対処します。 どうかお気になさらないでください。

複数行編集において、最初の行を削除した後に移動モードが機能しないことがある

これは 1b9e2a4 において発生しませんでした。ありがとうございます。


蛇足気味ですが,vim を一々開いて :help するのが鬱陶しい場合は いつでもどこでも \:help する というサイトがありますので,オンラインで手引きが閲覧できます。

cmplstofB commented 7 years ago

すいません。あまりに多機能を望みすぎました。面倒な案件は遠慮なく放置してください。

akinomyoga commented 7 years ago

@cmplstofB (B-bar) 様

ありがとうございます。

Commit id

commit id の記述ありがとうございます!

どの commit id で試しているのかも報告のたびに教えて頂けると確認の二度手間を防げて良いかもしれま せんね…

すいません、思慮不足でした。これからはそうします。

いえ。これに関しては私も意識していなくて、先の返信を書いているときに想到したことですので思慮不足ということは決してありません (考えてみれば GitHub の他のプロジェクトでも Issue を報告するときに commit id を記述しているのを余りみたことがありませんしね…)。

それでも、やはり今回のご報告を読んで commit id があると分かりやすいと感じますね。そうしていただけると助かります。

私は Git 作業には全くの初心者ですので、他に注意すべき点(報告の形式等)があれば是非教えてくださると助かります。

Re: vim-sorround.sh 拡張への要望

ds cs 対応しますね。$( \r )$(( \r )) も対応します。

Re:Re: ヒアストリング補完

言われてみると、ヒアストリングでの補完は現在ディレクトリ下のファイル/ディレクトリ補完しかないですね……。

そうなのですよね…。

先の返信後にいろいろ考えていたのは (例えば先の例では) python3 に対して import を補完できたら嬉しいということなので、"ヒアストリング用の補完関数" をユーザで設定できるようにするという手もあるなあ、ということでした。ただ、個人的に現状の補完の枠組みを大幅に整理したいので、もし対応するにしても vi mode の実装が終わってからにします。

Re: 行内前後方跳達で検索失敗した時の単語の保存 (:help f)

なるほど。これは気づきませんでした。対応します。やはり自分だとこういったことには気づけないので、vim をお使いの方に試していただけて心強いです。

Re: % の実装

これは実装しますね。

Re: 範囲選択

ビジュアルモード・選択モードというもののことで良いでしょうか。実は使ったことが全くなかったので怖がって実装していませんでした…。多分、"雰囲気実装" になってしまいますが取り敢えず実装を試してみます。

Re: undo

すみません。やはりこれは欲しい機能ですよね。ble.sh では未実装 (emacs mode でも使えない) です。

実は昔考察 (memo.txt#L1571-L1591) をしたのですが、自分自身が余り使わないものですから仕様確定できずに終わったのでした。少し議論させて頂ければ、仕様確定して実装できると思います。以下のそれぞれについて主観で構いませんのでどちらの方が自然に思われるか率直な意見を頂ければと思います。

個人的には Zsh よりも Bash の動作のほうが概ね分かりやすいと考えているのですがいかがでしょうか。

ところで vimindex の U の箇所に

U 2 1行中の最近の変更をすべて取り消す。

と書かれているのですが「すべて」というところを量りかねています。実際に試してみると、すべて取り消すという雰囲気ではなく、最近の変更 (U 自身も含む) を取り消すだけのように見えます。何かご存知でしょうか。また u に関しても注意点などあれば教えて頂ければ幸いです。

Re: 未決着項目

確定を伴なう動作なので標準にしないほうが良いと感じました。というか正直 Vim での CTRL-@ の挙動とは少々違うので……。

やはり標準で実装するのは分かりにくいのですね。vi mode ユーザからの視点ありがとうございます!

こちらで対処します。どうかお気になさらないでください。

毎度試して頂きありがとうございます。この問題は取り敢えず保留として、頭の片隅にでも置いておくことにします。

これは 1b9e2a4 において発生しませんでした。ありがとうございます。

承知しました。また何か問題がありましたらお知らせ下さい。

「いつでもどこでも :help する」サイト

蛇足気味ですが,vim を一々開いて :help するのが鬱陶しい場合はいつでもどこでも :help する というサイトがありますので,オンラインで手引きが閲覧できます。

ありがとうございます! 便利ですね! (と思って徐に surround と打ってみたらありませんと言われてしまいましたが…surround は標準機能ではありませんからね)


ほか、以下についての確認ありがとうございます!

cmplstofB commented 7 years ago

すいません、追加で報告があります。 テキストオブジェクトに対する c (削除後挿入モードに移行) が、 d と同じ振舞いになります。 Ver: 1b9e2a4

また、>/< 及び大文字小文字系統の動作の確認報告を忘れていました。全て完璧に動作しました。ありがとうございます。

akinomyoga commented 7 years ago

@cmplstofB 様

アカウント名を統一されたのですね。今後とも宜しくお願い致します。

Re: テキストオブジェクトに対する c

テキストオブジェクトに対する c (削除後挿入モードに移行) が、 d と同じ振舞いになります。

ご報告、ありがとうございます。修正しました。これは大ミスなので今 push しました 3958c51842df0b474877349f4c94966de9578fe6 (修正してから気付いたのですが、もしかして c が軒並み動かなくなっていたかもしれません)。

機能を拡張していく上で内部構造を大幅に変更することがしばしば出てくるので、このように以前動いていたものがバグで動かなくなってしまうということがあるということは、申し訳ありませんがご承知下さいませ。今回は vi_command キーマップを vi_commandvi_omap (それぞれ Vim の nmap, omap に対応) に分割した時のバグでした。

追記:

また、>/< 及び大文字小文字系統の動作の確認報告を忘れていました。全て完璧に動作しました。

一つ一つ確認いただきまして本当にありがとうございます!

cmplstofB commented 7 years ago

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

アカウント名を統一されたのですね。今後とも宜しくお願い致します。

こちらこそお世話になります。

Commit ID: 3958c51

cmplstofB commented 7 years ago

何度もすいません。しかしこれは今言うべきだと思ったので報告します。

ルートユーザになる為に、su - を実行し、パスワードを打ち込むとおかしなことになります。 最初の文字は、入力がエコーされないという尋常の挙動ですが、直後に改行(LF/CR とかは分からないです)されて、パスワードの文字列が丸見えになります。 そのまま入力して決定すると、(恐らく)最初の一文字しかパスワードとして判定されず、認識に失敗します。 また、丸見えになっていた文字列は「実行」され、「そのようなコマンドはない」というエラーも出ます。 個人的にこれはシステム上危険すぎると思ったので、修正して欲しいです。

Readline が全滅なので例えば ble.sh を読み込んだ状態で Dash を起動して、su - を実行しても同様の結果になりますが、 もちろん ble.sh を読み込まなければ正常なパスワード認証ができます。

Commit ID: 3958c51

akinomyoga commented 7 years ago

@cmplstofB 様

ご報告ありがとうございます! cbab20b1b90e9998394e1e2a81b06553d6c1e6e3 stty の設定を直しました。いかがでしょうか。

(あー…これは ble.sh が犯人だったのですね。自分のところでも同じ現象になるということは認識していたのですが、余り root にならないこと・検索しても似た症状の人が出てこないということから放置していました。ble.sh が原因だったとは、道理で検索しても出てこない訳です…お恥ずかしい限りです)

cmplstofB commented 7 years ago

ありがとうございます!正常な挙動になりました。 私も普段は sudo でパスワード無しの認証ばかりだったので今迄気が付きませんでした。

Commit ID: cbab20b

cmplstofB commented 7 years ago

vim-operator-surround と vim-plug

釈迦に説法のようで失礼ですが、Twitter の方で紹介したプラグインについて説明します。

まず、Vim のプラグインマネージャとして vim-plug をお勧めします。 新しく、合理的な体系ですので。

vim-operator-surround は vim-operator-user に依存するので、vim-plug 式だとこんな感じの設定が必要です。

call plug#begin(~/.vim/plugged)
" プラグインの読み込み
Plug 'kana/vim-operator-user'
Plug 'rhysd/vim-operator-surround'
call plug#end()
" Surround.vim にコマンド体系を合わせる
nmap <silent> ys <Plug>(operator-surround-append)
nmap <silent> ds <Plug>(operator-surround-delete)
nmap <silent> cs <Plug>(operator-surround-replace)
let g:operator#surround#blocks = {}
let g:operator#surround#blocks['-'] = [
            \ { 'block' : ["'", "'"], 'motionwise' : ['char', 'line', 'block'], 'keys' : ['q'] },
            \ { 'block' : ['"', '"'], 'motionwise' : ['char', 'line', 'block'], 'keys' : ['Q'] },
            \ { 'block' : ['(', ')'], 'motionwise' : ['char', 'line', 'block'], 'keys' : ['p'] },
            \ { 'block' : ['[', ']'], 'motionwise' : ['char', 'line', 'block'], 'keys' : ['b'] },
            \ { 'block' : ['{', '}'], 'motionwise' : ['char', 'line', 'block'], 'keys' : ['B'] },
            \ ]

これを読み込んだら (:source $MYVIMRC)、:PlugUpdateを実行してプラグインを導入して下さい。 この設定ですと、適当な単語上で ysiw とすると下部に block: と表示され、例えば q と入力すると単語が '/' で囲まれます。

Surround.vim の方が情報が見つけやすいかと要らぬ思案をして、結果梃摺らせてしまったことをお詫びします。

akinomyoga commented 7 years ago

@cmplstofB 様

ありがとうございます! 実はもう既に surround.vim 式の実装が進んでしまっているので、一通り終わってから確認いたしますね。(追記: 実は ds は一通り終わって cs に入るところです)

cmplstofB commented 7 years ago

本当にすいません……。

cmplstofB commented 7 years ago

@akinomyoga 様、返信が遅れていたものです。

Re: Git 管理

git pull 知らなかったです。git は間抜けでも操作できるということで "git" という名前らしいのですが、それさえも扱えないとは……。

Re2: undo

undo に関しては基本的に Bash のそれに合わせて欲しいです。

Re: U コマンドの挙動

これ、私もよく分からないです。ただ、u/CTRL-R 等と違い、U それ自身が一つの編集コマンドになっているので、u/CTRL-R で「U による操作自体を」 undo/redo できます。 実際問題 Vim の手引きでも「この動作はわかりにくいかもしれません」とあるので、余程分かりにくい挙動なんだとおもいます。 なお、U で「元に戻される」区切りは、挿入コマンドからの移行等です。(:help undo-blocks/:help i_CTRL-G) 個人的に、undo-block などは実装しない方が良いと思います。 これらが有用なのはかなり複雑な undo/redo が要求された後の作業であり、Bash の行編集ではそう頻繁には起らないだろうからです。 akinomyoga 様もおっしゃっていましたが、これを実装するとかなり重くなりそうなので。

質問

ble.sh/lib/vim-surround.sh の 81 行目から始まるキーと挿入される語句を編集し、p(/)b[/]B{/} が対応するように編集しました。

  case "$ins" in
  (['<t'])
    ble/widget/vi-command/bell
    return ;;
  ('p') prefix='( ' suffix=' )' ;;
  ('b') prefix='[ ' suffix=' ]' ;;
  ('B') prefix='{ ' suffix=' }' ;;
  (後略)

ところが、ysiwp と入力しても何も起きず、ysiwb と入力しても ( word ) が入力されます。

最新版を使ったところ上述の問題に関しては上手く行きました。

またできれば q'/'Q"/" が入力できるようにしたいのですが、

  # in 'ble.sh/lib/vim-surround.sh`
  ('q') prefix="'" suffix="'" ;;
  ('Q') prefix='"' suffix='"' ;;

のように設定しても(当然といえば当然ですが)上手く行かないです。 引用符の入力を q/Q を用いて行なう設定はどのように記述すればよいでしょうか。

ダイグラフ

Vim 挿入モードでは本来 CTRL-K はキートップに印字されていないような文字の入力に使われますが(:help i_CTRL-K)、 寧ろコマンドラインにおいてそのような文字が混入することは危険な気がするので、ble.sh の vi-mode における CTRL-K は kill-line のままでお願いします。

Commit ID: 9afa3fa

akinomyoga commented 7 years ago

@cmplstofB 様

Re3: undo

undo に関しては基本的に Bash のそれに合わせて欲しいです。

ありがとうございます! 承知しました。ただ emacs mode の方とも一緒に実装したいので今すぐ実装するかは分かりません (merge してから実装した方が良い気がするけれども、気がついたら実装しているかも…)。

Re2: U コマンドの挙動

実際問題 Vim の手引きでも「この動作はわかりにくいかもしれません」とあるので、

そうなのですね。

統計があるわけではないので定かな事は言えませんが、みなさんの Vim の設定ファイルを見ると、U に undo、つまり CTRL-R を割り当てている

なるほど。その方向も検討してみます。これも、"お好みで設定ファイルに書いて下さい" という説明をどこかに書いておくのが良さそうでしょうか。

Re: 質問 (テキストオブジェクト q で '/'、Q で "/" の設定方法)

上にお書きになった設定で正しいような気がします。ただ、([a-zA-Z]) の行よりも上に書かないといけませんね。また現在その辺りは激しい書き換えの対象であることと、さきの $(), $(()) の件の対応と同時に外部から拡張できる仕組み (let g:surround_45 的な) を与える予定ですので、そのときにご説明いたします。

Re: ダイグラフ

ble.sh の vi-mode における CTRL-K は kill-line のままでお願いします。

はい。同じ考えです! 実は一瞬 C-k はダイグラフだったのですが、戻しました。Bash の C-k が既定で kill-line であることと、自分で使ってみてこれは混乱の元だなと思ったためです。折角実装したので、敢えてダイグラフを使いたい人のために以下の Wiki ページに設定方法は書きましたが、今後既定で C-k がダイグラフになる予定はありませんのでご安心下さいませ!

akinomyoga commented 7 years ago

32f1e67...795ceca 更新

すみません。バグを色々出していました…。

新機能

動作変更

バグ修正

未対応


@cmplstofB 様

Re2: 質問 (テキストオブジェクト q で '/'、Q で "/" の設定方法)

引用符の入力を q/Q を用いて行なう設定はどのように記述すればよいでしょうか。

これは既に dotfiles に追加なされたもので問題ありません。

akinomyoga commented 7 years ago

795ceca...5f95282 更新

新機能

バグ修正

動作の変更

未対応

cmplstofB commented 6 years ago

@akinomyoga 様

追加の様々な実装ありがとうございます。返信遅れました。 疑問と要望が追加であります。何度も何度も本当にすいません……。

: コマンドの役割

非常な失礼を承知で聞きます。これは一体何をするコマンドなのでしょうか。 Vim の ex モードのようなものだと勝手に解釈し,

$ sudo atp install emacs
-- NORMAL --

というような状態で : を押下し,

$ sudo atp install emacs
:s/atp/apt

のような入力を行なったのち,

$ sudo apt install emacs
-- NORMAL --

のような状態になることを勝手に予期したのですが,何も起こりませんでした。

カーソルの形状

しつこくてすいません。しかしながら,やはりカーソルの形状をモード間で変更したいです。 ほんの少しですが私の端末制御への理解も進み,カーソル周りの CS をモード変更毎に送信したりすることが無謀な要望だとは重々に承知しています。そこをどうにか……。 尊大な言い草になってしまいますが,不可能,もしくは手間の多さで無理ならばもう二度とカーソルの形状に係る要望はしません。


「ble.sh」という名称 (完全にオフトピです)

More Than Human---Wikipedia によると,『More Than Human』という SF 小説の中で,「blesh」という造語が,「(6人の能力者が) 力を合わせる」というような意味で用いられているそうです。

Blesh!

ちょっと無理矢理な解釈ですが,widget の組合せで強力な編集能力を発揮する ble.sh に類推できますし,『More Than Human』という題名も More Than Bash な ble.sh に似合ってる気がしました。 ロゴとかに使えると面白いかもです。

akinomyoga commented 6 years ago

@cmplstofB 様

ご要望などありがとうございます!

Re: : コマンドの役割

すみません。これは : を通して別の色々のコマンドを呼び出せるようにするために枠組みを追加しただけで、実際のコマンドは未だ整備していません (物凄く沢山ありますし…)。試験的に :q (シェル終了) などがあるのみです。検索 (/, ?) を実装するために cmap を定義する必要があって、そのために初めに : を実装したということなのでした。

今のところ、要望が出ない限りはそれぞれのコマンドの対応をする予定はありません。要望が出たとしても一旦 master にマージしてからにしますね。

因みに、ble/widget/vi-command:名前 という関数を定義していただければ、:名前 引数... に対してその関数が呼び出されるようになります (ただ、widget の実装方法についての説明がないので意味のない情報かもしれませんが。すみません…)。

Re: カーソルの形状

これの対応は実は簡単です。モードを切り替えるときに制御シーケンスを吐けば良いので。実のところ、既に、上書きモードの時には SM/RM(?25) (\e[?25h, \e[?25l) によってカーソルを非表示にするような制御を行っております。

どのように対応するのが良さそうかについてご意見をいただけませんか。ご意見がなければ勝手に実装します

実のところ TERM に依存してユーザが場合分けで設定を書かなければならないような設定項目ではなくて、ble.sh の中で解決 (TERM 依存の切り替えは tput を用いて内部的に解決) できるような設定項目にしたいというのはあります。因みに設定の $'\e[1m-- NORMAL --\e[m'\e[1m などは ble.sh 内部で ANSI に基づき解釈し tput の結果に応じて適切なものに置き換えて出力しています (以前、勘違いだったと書きましたが改めてコードを読むとやはり置き換えはしていました…)。その意味で DECSCUSRble.sh で読み取るという手もありますが、その辺りは分かりやすさとの兼ね合いです。

Re: 「ble.sh」という名称 (完全にオフトピです)

情報ありがとうございます!

blesh という単語の意味は確認したりはしていたのですが、映画については知りませんでした。色々と名前で関連を調べるのは楽しいですよね。自分もやります。(ただまあ、相当説得力がない限りは余り後付けは、"公式では" やりたくないなというのはあります。ユーザの方で色々考えていただくのは嬉しいです)

ロゴもあった方が良いですかね。実のところ ble.sh は余り個性を発揮したものではなくて空気のように存在を意識しなくても使えるものにしたいなあなどと考えていたりします (vim の細かい動作に拘っているのもそういうことにあります)。なので、ロゴを作るとしたら、ミニマリズムというのでしょうか、なにか淡白なものがいいなあと考えていました。

追記 カーソル制御の資料

akinomyoga commented 6 years ago

5f95282...af62754 更新

今週末は進められないのでもう push します。レジスタ "x とマーク mx の対応で根幹を弄ったあと、余りテストしていないので不安定かもしれませんがご容赦下さい

新機能

バグ修正

動作変更

他の変更

未実装

ごめんなさい、ビジュアルモードのテキストオブジェクトは面倒になりました。後回しです

cmplstofB commented 6 years ago

@akinomyoga 様

# 誤操作でフォークしてたと思います。すいません。

Re: : コマンドの役割

早とちりしていました。widget の作り方はソースを見て勉強させて頂きます。

Re: カーソルの形状

ありがとうございます! 是非おねがいします。

指定方法

@akinomyoga 様に託したいです。

しかし (釈迦に説法ですが) 提案するとするなら,


ヒアドキュメント出来ない?

すいません説明を省略します。

$ cat <<. > tmp/bbbb.ttt
-bash: 警告: ヒアドキュメントの 3 行目でファイル終了 (EOF) に達しました (`.' が必要)

Esc でノーマルモードに移行しない件

結論から言うと,いまだ解決していません。また,今のところ,とりあえず確実に綴りを送信できるキー (具体的には C-c を潰してます) を vi-insert/normal-mode に割り当てています。 前にも述べましたが,これは自機の問題だと思うので,解決はこちらで頑張りますが,一応報告をしておきます。


Commit ID: af62754

akinomyoga commented 6 years ago

@cmplstofB 様

Re: ヒアドキュメント出来ない?

すみません。現状では C-q RET または C-v RET などとして複数行編集にして全て入力していただいてから、C-j で実行していただかなければなりません。

「文法的に続きがあるということが明らかな時に RET が入力された場合、実行せずに改行を挿入する」というのは前々から考えていたのですが、ble.sh の文法解析に誤りがあると「実行できるはずのコマンドが実行できない」ということになり兼ねないので慎重になっていたのでした。この辺りはマージ後に対応します。

Re: Esc でノーマルモードに移行しない件

これは丁度気になっていたところでした。もし解決しないようでしたら ble.sh にキーロガー (ble.sh が実際に見ているバイト列・文字の列・キーの列を記録する機構) を組み込んで実行してもらうことを考えていました。

その前に、どのような動作を期待するのか行き違いがあるような気がしたので、確認させていただいてよいでしょうか:

あと、ご報告頂いた動作について、0.4 sec 以上経過するとそれぞれどのように動作するのでしょうか。またどのように動作することを本来期待するのでしょうか。よろしくおねがいいたします。

cmplstofB commented 6 years ago

@akinomyoga 様

Re: ヒアドキュメント

分かりました。ぶっちゃけインタラクティブシェルではあまりヒアドキュメントを使わないと思うので,別に問題ないと言えばないのですが……。

Re: Esc キー

あーこれは完全に私の認識が間違っていました。

もしかして ESC が来たら (次の文字を待たずに) その場でノーマルモードに移行することを想定していますか。

はい,そう想定していました。すいません……。

0.4 sec 以上経過するとそれぞれどのように動作するのでしょうか。

akinomyoga commented 6 years ago

@cmplstofB 様

Re: Esc キー

はい,そう想定していました。すいません……。

承知しました。そのように実装してみます。

0.4 sec 以上経過するとそれぞれどのように動作するのでしょうか。

  • 英数字キーを押下した場合: その英数字がコマンドラインに挿入されます。つまり挿入モードで入力したのと同じような挙動です。
  • Esc キー連打の場合: 何も起きず,ずっと挿入モードのままです。

あら、それは不思議ですね…。やはり次でキーロガーを入れることにします

cmplstofB commented 6 years ago

確認いたしました。 Esc キーへの対応ありがとうございます!

akinomyoga commented 6 years ago

@cmplstofB 様 あら、書き込む前に返事が来てしまいました。確認ありがとうございます!

ESC のタイムアウトに関しては、端末から Bash までの経路にある全ての timeout が累積することにご注意下さい。各々の設定 (stty, tmux, screen, bash, etc.) は Wiki に書きましたので御覧ください …と書いて Wiki を今編集していたのですが、未だ書き途中です。概要(設定の例)を書くと、

# stty (bashrc)
stty time 0 # 単位: 1/10秒

# bash-4.3 以上 (bashrc)
bind 'set keyseq-timeout 1' # 単位: ミリ秒

# tmux (tmux.conf)
set -sg escape-time 1 # 単位: ミリ秒

# screen (screenrc)
maptimeout 1 # 単位: ミリ秒

追記: Wiki 更新しました: Vi (Vim) editing mode · akinomyoga/ble.sh Wiki

akinomyoga commented 6 years ago

af62754...2310b18 更新

★今回の修正には破壊的変更が含まれているので注意して下さい★

破壊的変更

新しい機能

バグ修正

動作変更

ToDo

ToDo (マージ後)

akinomyoga commented 6 years ago

@cmplstofB さま

お誕生日おめでとうございます! こちらは . をちんたら実装していたために急に失速して余り進んでいませんが、現状で push しますね。あと、今回の変更には破壊的な変更が含まれているために、bashrc における設定を書き換えねばなりません。後で dotfiles に伺います。

よろしくお願いいたします!

cmplstofB commented 6 years ago

お誕生日おめでとうございます!

ありがとうございます。

後で dotfiles に伺います。

すみませんが,commit するまで少々時間を頂きたいです。

akinomyoga commented 6 years ago

すみませんが,commit するまで少々時間を頂きたいです。

承知です。一行ずつコメントしてそちらで修正して頂く方が良いでしょうか。 或いは、こちらで PR を作りましょうか (実はこちらとしては PR の方が楽です)。

cmplstofB commented 6 years ago

或いは、こちらで PR を作りましょうか (実はこちらとしては PR の方が楽です)。

分かりました。PR して下さい。只今 push しましたが,非常に半端な設定になっていると思います。お手間お掛けします……。