Closed akinomyoga closed 6 years ago
support-vi-mode
ブランチで作業する。
取り敢えず keymap を切り替える機能は整備した daee0b8...f82cbc4
f82cbc4...449dd70
基本的なところは実装した気がする。
挿入モードからノーマルモードへは ESC
C-[
C-c
で移行する。ノーマルモードでは以下に対応した。
i
I
a
A
R
x
X
p
P
yy
dd
cc
Y
D
C
[ydc]?[hjkl]
[ydc]?[0$^+-]
未だ対応していないが優先順位の高いものは以下の通り
C-h
DEL
SP
|
G
w
W
b
B
e
E
r
449dd70...14223ec
取り敢えずここまで。後は相談の上で実装の予定
新しく対応したもの:
o
O
gR
gI
[ydc]?C-h
, [ydc]?DEL
, [ydc]?SP
, [ydc]?[wWbBeE]
, [ydc]?[fFtT;,]
s
, S
, J
, gJ
[ydc]?|
, [ydc]?[HL]
, G
, gg
K
RET
, C-m
, I
, [ydk]?[-+jk]
など実装仕様:
H
と L
は現在の編集文字列内の移動で、G
と gg
はコマンド履歴の移動とした。K
は現在のコマンドラインに含まれるコマンド名で cmd --help
または man cmd
を実行した結果を返す。j
, k
, +
, -
は現在の編集文字列の最下行・最上行を踏み越えると、コマンド履歴を移動する。gR
および gr
の実装は [1] の記述を元にしたが怪しい。vim で試したができなかった(?)ESC
で始まるものを削除したこと以外は) emacs mode から殆ど変えていないa
A
i
I
gI
o
O
R
gR
の引数には未対応である引用:
@cmplstofB (B-bar) さま。ble.sh
における vi-mode の基本的なところはできたように思いますので、改めてテストユーザになっていただくこと、お願いしてもよろしいでしょうか。
もし引き受けて下さる場合は、追って以下についてご説明します。
ble.sh
における複数行編集の方法について何卒、よろしくお願い致します。
@akinomyoga 様
貴重な時間を割いていただいて申し訳無いです。テストユーザの件ですが、よろこんで引き受けます。
早速ですが、素の urxvt 及び「urxvt 上の tmux で起動した Vim 上の :sh
(Zsh の Vim-mode はここでのバグがあります)」とで確認しました。
素晴しいです! 一通り試しましたが、readline 本来の set -o vi
と遜色ないです。
ただ、ちょっと気になった点がありました。これは support-vi-mode ブランチでは再現しませんが、そもそも support-vi-mode ブランチでは C
等の操作が出来ませんでした。
ble.sh
を読み込んだ後に set -o vi
等として vi-mode に移行した場合、vi-mode は実装されていないという旨の警告が表示された後、コマンドラインに stty sane
という文字列が入力された状態になります。 行を確定してみると stty sane
が実行されたので描画の残り滓という訳ではなさそうです。@cmplstofB (B-bar) さま。早速のご報告ありがとうございます! 取り敢えずご報告の点について確認させていただいて宜しいでしょうか。
これは support-vi-mode ブランチでは再現しませんが、
再現しないのはどのような動作か詳しく教えて頂けますか。
そもそも support-vi-mode ブランチでは C 等の操作が出来ませんでした。
確認しました。これはとんだミスです…。 ab6bd163b9239739462076dfd137c03c40fa8319 で C
と D
を修正しました。突貫の修正なので、動作について問題がないか確認して頂けると幸いです。
ble.sh を読み込んだ後に
set -o vi
等として vi-mode に移行した場合、vi-mode は実装されていないという旨の警告が表示された後、コマンドラインに stty sane という文字列が入力された状態になります。 行を確定してみると stty sane が実行されたので描画の残り滓という訳ではなさそうです。
master ブランチの話ということで良いでしょうか。分かりにくくてすみませんが、これは仕様です。
現状の ble.sh
では set -o vi されたときに元の readline
に戻るようにしています (この動作は一時的なもので support-vi-mode ブランチがマージされた後には新しく実装した vi mode に移行するようにします)。ただし readline
に移行する前に仮想端末の状態を元に戻さなければなりません。実は技術的な問題により ble.sh
の中からはこの設定を戻すことができないので、ble.sh
を抜けた後にユーザに手で stty sane
を実行して頂く必要があります。そのために ble.sh
はコマンドライン文字列に stty sane
を設定して抜けるのです。
もし master ブランチではなく support-vi-mode ブランチでこれが再現する場合は、何らかのミスなのでその時の状況が分かれば教えて頂けると幸いです。
追ってテストについてご説明いたします。
@cmplstofB (B-bar) さま。特にみていただきたいことは 複数行編集での動作 と 欠けている使用頻度の高いコマンド です。以下、長くなってしまいましたが、気が向いた時に見て頂ければ幸いです。
ble.sh
では編集文字列に改行 LF (\n
) が含まれているときを複数行編集とし、そうでないときを単一行編集としています。
C-v C-j
と入力して下さい (emacs mode では M-RET
(C-M-m
) でもいけます)。RET
(C-m
) は "コマンド実行" ではなく、エディタと同様の動作 ("改行の挿入/次の非空白行頭") としてはたらきます。コマンド実行をするには C-j
を入力して下さい。特に複数行編集のときも含めて、ノーマルモードの各コマンドが動作するか確認して頂きたく思います。
C
の件のように (下らない間違いで) 変な動作をするものがないか、当然 vi/vim の機能を完全に実装するわけには参りませんので、要望の出たものから順に実装していこうと考えています。そのため "このコマンドは自分はよく使うので実装した便利である" というようなものがありましたら、幾つか提案して頂きたいなと考えています。
簡単に使用していただいてもし実用に耐えうると判断できる場合には、もしよろしければで問題ないのですが しばらく使用をしていただいて vi mode の動作に問題がないか検証していただきたいなとも考えております。その場合には
~/.bashrc
の設定をして下さい。~/.inputrc
にあるキーバインディングの設定や ~/.bashrc
にある bind
コマンドの設定がある場合は ble.sh
では反映されません。ble.sh
用の ble-bind
シェル関数によって設定を追加する必要があります。ble-bind -d
を実行して頂ければ ble-bind
の使い方は大体分かるのではないかと思いますが、質問があればどうぞ遠慮なく申し付け下さい。もし使っている内に vi mode の動作について何か提案などが出てきましたらどうぞお気軽にお知らせ下さい (もちろん vi mode 以外の ble.sh
の機能についてでも問題ありません)。
私は普段 vi/vim は使わないので以下のページでどのようなコマンドがあるか調べて、実際に vim でどのように動作するのか調べて、それを模倣して実装するという原始的なことをしています。
ところで、そのようにしても動作が良くわからないものというのが存在します。以下についてお聞きしてよいでしょうか。
gr
で全角・半角の幅も考慮して1文字上書きすると上記ページには書かれていますが、手許の vim (VIM - Vi IMproved 8.0) で再現しません (エラーになる?)gR
で全角・半角の幅を考慮した上書きモードになるとありますが、これも同様に再現しませんたぶん、何か勘違いしているのだと思いますが、もし何かご存知のことがありましたら教えて頂けると幸いにございます。
@akinomyoga 様
長くなってしまいました。すいません。
バグだと思ったのは私の認識不足でした。また、「vi-mode で再現」云々はその stty sane
について述べているので既に自己解決しています。
動作確認
と
bashrcの設定
については ble.sh を vi-mode で常用させていただく形で使用します。 しかし失礼ながら学校でサーバ等に対する操作として使うには今の段階で少し怖い面もあるので、基本的に家の Debian 9 のみで使わせてください。 その結果、報告のペースが @akinomyoga 様の想定より遅れることと思います。申し訳無いです。
いまの所、不具合らしきものとして、
ノーマルモードから挿入モードに移った直後くらいに C-c
、C-m
等及び通常のキー入力が「そのようなキーは設定されていない」という警告とともに無視される時がある。
複数行編集において、最初の行を削除した後に移動モードが機能しない。
しかしその孰れもその正確な再現がまだ出来ない(上手くいくときもある)ので、ある程度使って場数を踏んでから詳細を報告します。
質問
仮想置換モードのことですね。 私の環境 Vim 8.0 1-992 (多分最新版) では特に問題はなかったです。
「あ
」の上で gra
と打つと、文字「あ
」の幅が考慮され、「a
」となります。(従って、文字数は変動しますが画面上では「あ」以降の文字はずれません)
また「あ
」の上で ra
と打つと、文字「あ
」は一文字なので、「a
」となります。(「あ」以降の文字は画面上ではずれますが、その行の文字数は変化しません。)
念の為仮想端末(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
が「単語全体に」、"
が「"を入力せよ」と分解できます)
@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
)
@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
を繰り返し交互に実行するということができたりします。
@akinomyoga 様 色々実装していただくことになり感謝しています。お手を煩わせて申し訳無いです……。
emacs-mode の C-o
も使い慣れると便利ですね。
Vim で言うとインサートモードでの C-@
にに似ている印象があります (:help i_CTRL-@
)。
といっても C-@
には「以前の入力を再度入力した後ノーマルモードへ戻る」程度の機能しかなく、
「確定する」という動作はやはり不自然かもしれませんが……。
報告していた以下の二つの挙動ですが、
ノーマルモードから挿入モードに移った直後くらいに
C-c
、C-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
を実装せずとも、現在の段階でなにかモードの判定ができる方法があるのなら、そちらの方法を教えてくださると泣いて喜びます。
14223ec...c2cd318
現時点の様子 (前回からの変更)
少しずつ対応しているところで、一区切りしたら更新しようと思っていたのですが、モードの判定についての提案・質問がありましたのでこの時点で取り敢えず push
します。というのも、自分でも現在のモードがわからないのが不便に思ったので、モードを表示する機能を既に加えたからでした。
新しく対応したもの
C-o
[ia][][b()B{}<>wW`'"]
g~
gu
gU
g?
対応予定 (現在中途半端なところですが)
[ia][pst]
g<
g>
<
>
だった)guu
gUU
g??
(追記 (2017-09-16 11:24): g~~
も)surround.vim
の ys
, yss
, etc.@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点の変更を行いました。
C-l
は Zsh に倣って clear-screen
とする。そこで例えば $KEYMAP という変数に emacs、vi-ins、vi-cmd といった値を格納するようにしてくださると、
ble.sh
の内部的な変数で $_ble_decode_key__kmap
がこれに対応しますね…。ただ、これは内部的な変数なので将来的に名前が変わる可能性もあります。公開用のコピー (例えば $BLE_KEYMAP
) を作成しても良いのですが、実はそうしたとしても以下の2つの理由により、現状では動きません
プロンプト内容はキーの入力を行うたびに再計算されるのではなく、コマンドを実行するたびに再計算されます。
というのもキー入力のたびにプロンプトの計算をすると、毎回全体を再描画する必要がありちらつきの原因になるためです。これは、既存の readline
でも同じ動作です。ただし readline
で show-mode-in-prompt
のときには (キー入力のたびにではなく) モードの変更が行われた時に限って 特別にプロンプトを再計算するのではないかと思われます。従って、もし ble.sh
でも実装する場合は同様に show-mode-in-prompt
的な設定を提供するのが適切かと考えます。ただ、取ってつけたような設定項目なので今のところ実装するかは分かりません。
プロンプトの内容は制御シーケンスも含めて ble.sh
で全て解析しています (制御シーケンスによるカーソル移動なども全て追跡しないと描画位置がずれてしまうので…。余談ですが、このために ble.sh
では大体の場合でシーケンスを \[\]
で囲む必要はなかったりします)。
更に、制御シーケンスの翻訳 (ECMA-48 から terminfo
(tput
) によるシーケンスへ; 特に SGR) もしています。その際に、ble.sh
が解釈(翻訳)できない CSI sequence は現状で捨ててしまっています。つまり現状ではカーソルの形状指定 CSI q
は捨ててしまうようになっていたはずです。これをプロンプトに埋め込むには、解釈できない制御シーケンスを透過させるようにするか、CSI q
に対応するかの対処が必要になりますね…。
もし、今回の変更によるモード表示にご満足いただけた場合にはそれで良いのですが、そうでなければどのように機能を提供するのかもう少し相談が必要になりますね…。
@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--
" の表示で大満足です。ありがとうございます。
これだけ見ると、ble.sh がカーソル形状に係る CS を無視していないように思うのですが、これはまた違うのでしょうか。
本当ですね。コードを改めてよく見てみたところ、解釈をしてカーソルの位置と SGR の状態遷移の計算はしているけれども、翻訳・プロンプト内容の変更はしていませんでした…。大分前に実装した所なのでうろおぼえて書いてしまいました。なので、この点に関しては大丈夫ですね
(あと提示された PS1
を見て気付いたのですが、さきにお見せ下さった readline
の設定を読み違えて CSI q
と書きましたが、CSI ... SP q
(DECSCUSR
) ですね。この点も訂正しておきます。)
解釈をしてカーソルの位置と SGR の状態遷移の計算はしているけれども、翻訳・プロンプト内容の変更はしていません
す、すいません。何をおっしゃっているのか理解できません……。 とりあえず「読み込み初期はカーソル変形の CS は有効だが、モードの変更を監視できる頻度では、カーソル変形の CS は解釈されない。」という理解でよろしいでしょうか。 違っていたらわざわざ解説せず、一言「違います」と言っていただければいいです。
すみません。もしかしてお気づきになったかもしれませんが、部分的な返信になってしまったのは、編集の途中で誤って投稿してしまっていました。今、全体に対する返信を編集しているのですが、先に上記の点についてだけ。
「読み込み初期はカーソル変形の CS は有効だが、モードの変更を監視できる頻度では、カーソル変形の CS は解釈されない。」という理解でよろしいでしょうか。
すみません。舌足らずでした。言いたかったことは違いますね。「ble.sh がカーソル形状に係る CS を無視していない」に関する話で、頻度の話ではありませんでした
@cmplstofB (B-bar) 様
改めて
この件ですが、すいません、設定を元に戻すとやはり発生しました。
確認していただきましてありがとうございます。手間をかけさせてしまったようで恐縮です。タイミングの問題でうまく動作しないというのは、ble.sh
のどこかでミスしている可能性があるので、また暫く様子を見てみます。
これは実装しますね。実は実装候補には入っていたのですが、いろいろの提案を下さった段階で優先順位を下げていました。
Vim の挙動は iw なら inner word、つまり空白文字を含まない単語を範囲に指定し、aw なら a word、つまり空白文字を範囲に含むのですが、ble.sh の vi-mode ではどちらも同じ挙動をするように思います。
これはミスですね…。引数をしたときのカウント (2yaw
vs 2yiw
) しか対応できていませんでした。後で改めます。
すみません。これは -- INSERT --
に対応する時に配置計算のコードを整理したのですが、そのときに埋め込んだバグで、 df4685891ad069f74aa67a6cc22a94c37d638fed で直したつもりだったのですがいかがでしょうか。現在こちらでは再現しないのですが、これで直っていなければまた調べます。(今まで意識していなかったのですが、どの commit id で試しているのかも報告のたびに教えて頂けると確認の二度手間を防げて良いかもしれませんね…)
vi-mode と直接関係なく、差し出がましいのですが、ヒアストリングの補完について少し気になるところがありました。
いえ、気になることがあれば是非教えて頂ければと思います。こちらの件について、何も候補がなければデフォルトではファイル名を補完候補にすることにしています。ヒアストリングとして何か適切な候補生成の案があれば教えて頂けると助かります。現状では、他に候補も思い浮かばないので、(標準入力にファイル名を入れたいと思うことがないとも限らず) ファイル名を補完するのはまあ妥当かなというように考えておりました。
カーソルの形状についてですが、今回加えていただいた "--INSERT--" の表示で大満足です。ありがとうございます。
ありがとうございます! 余り確認する時間もなく push
してしまったので、まだ不十分な点が出てくるかもしれませんが、その時はまた教えて頂ければ幸いです。
修正したもの
M-?
を ESC
?
と解釈し、ESC
は beep。aw
の振る舞い。現在の文字が空白以外のとき単語に続く空白を含める。現在の文字が空白のとき単語に先立つ空白を含める。新しく対応したもの
surround.vim
の ys{move}{foo}
と yss{foo}
({foo}
= <...
や t...
には未対応 )~
<
>
>>
<<
g~~
guu
gUU
g??
未対応のもの
[ia][pst]
@cmplstofB (B-bar) 様
お世話になっております。以下については修正しました。
surround.vim
対応について先に要望のありました ysiw"
についてですが、素の vim
で動かなかったので調べた所 surround.vim
というものを入れると使えるようになるらしいということが分かったので、その前提で実装することにしました。取り敢えず、surround.vim
の機能の中でも ys
と yss
だけ対応することにしました。
元の vim で拡張のようなので、ble.sh
でも拡張として実装することにしました。使う場合には、~/.bashrc
の ble.sh
の設定で以下のように記述して下さい。
if [[ $- == *i* ]]; then
source /path/to/blesh/ble.sh noattach
# 以下の行を追加
source "$_ble_base/lib/vim-surround.sh"
fi
注意点
<tag>...</tag>
の形のもの) には未対応です。surround.vim
では ys3iw"
などのように引数を指定したときの動作が分からなかったのですが、現状で ble.sh
では y3iw
などと指定した時と同様の範囲を括るようになっています。もし、より良い動作がありましたらご教示下さい。yss
に関しては g~3~
などと違って ys3s
のような指定方法は使えません。これは元の surround.vim
と同じ制限です。特に要望があれば以下も実装できます
<tag>...</tag>
の形のタグds
cs
yS
ySS
など surround.vim
に含まれる他の機能let g:surround_45 = "<% \r %>"
などに対応する設定方法関連するか分かりませんが、ノーマルモードで ESC を正しく処理できていなかった (Meta 修飾として扱ったままになっていた) のを修正しました。またハズレかもしれないので恐縮ですが、もし興味があるようでしたらまた試していただくことも可能です。
今までにご報告いただいたものについて、一旦この時点での未決着項目を整理します。
C-@
に accept-and-next
を割り当てる可能性 → 後でこちらで考察@akinomyoga 様
どの commit id で試しているのかも報告のたびに教えて頂けると確認の二度手間を防げて良いかもしれませんね…
すいません、思慮不足でした。これからはそうします。 私は Git 作業には全くの初心者ですので、他に注意すべき点(報告の形式等)があれば是非教えてくださると助かります。
iw/W
、aw/W
の挙動1b9e2a4
で確認しました。ありがとうございます。
すいません。今見直したらテキストオブジェクトを紹介する際、surrond.vim が必要だという旨の注釈を付け忘れていました。 手間を掛けさせることとなり申し訳無いです。
できたら ds
、cs
を加えていただけないでしょうか。お願いします。
また、surround_45
変数に相当する機能というより寧ろ ble.sh 謹製の vim-sorround.sh 独自の機能といった方がいいですが、
コマンド展開及び行内演算のマーカを簡単に挿入できると嬉しいです。
具体的には、適当なプレフィクスで $(
/)
や $((
/))
を入力したいということです。
個人的に yss-
で $( line )
、ysiW=
で $(( 4+6 ))
といった操作が理想です。
(つまり -
が $(
/)
に、=
が $((
/))
に対応しているといった感じです)
1b9e2a4
にて、
複数行に亘る補完候補がある時の不具合が修正されていることを確認しました。ありがとうございます。
言われてみると、ヒアストリングでの補完は現在ディレクトリ下のファイル/ディレクトリ補完しかないですね……。
: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
で選択開始、c
、d
、y
等の操作を受け付け、^C
/^[
で選択を解除、といったものがいいです。
bash 標準 (set -o emacs
) では CTRL-_
に「変更を破棄」という機能が割り当てられていますが、これは ble.sh による Readline にはないのでしょうか。
もしあれば、ノーマルモードでの u
に割り当てて欲しいです。
- ヒアストリングの補完候補 → より良い候補として何が考えられるか?
- 挿入モード
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 (B-bar) 様
ありがとうございます。
commit id の記述ありがとうございます!
どの commit id で試しているのかも報告のたびに教えて頂けると確認の二度手間を防げて良いかもしれま せんね…
すいません、思慮不足でした。これからはそうします。
いえ。これに関しては私も意識していなくて、先の返信を書いているときに想到したことですので思慮不足ということは決してありません (考えてみれば GitHub の他のプロジェクトでも Issue を報告するときに commit id を記述しているのを余りみたことがありませんしね…)。
それでも、やはり今回のご報告を読んで commit id があると分かりやすいと感じますね。そうしていただけると助かります。
私は Git 作業には全くの初心者ですので、他に注意すべき点(報告の形式等)があれば是非教えてくださると助かります。
git pull
はお使いですか。ble.sh
を最新版に更新するときは git pull & make (& make install)
で済みます。ds
cs
対応しますね。$( \r )
と $(( \r ))
も対応します。
言われてみると、ヒアストリングでの補完は現在ディレクトリ下のファイル/ディレクトリ補完しかないですね……。
そうなのですよね…。
先の返信後にいろいろ考えていたのは (例えば先の例では) python3
に対して import
を補完できたら嬉しいということなので、"ヒアストリング用の補完関数" をユーザで設定できるようにするという手もあるなあ、ということでした。ただ、個人的に現状の補完の枠組みを大幅に整理したいので、もし対応するにしても vi mode の実装が終わってからにします。
:help f
)なるほど。これは気づきませんでした。対応します。やはり自分だとこういったことには気づけないので、vim をお使いの方に試していただけて心強いです。
これは実装しますね。
ビジュアルモード・選択モードというもののことで良いでしょうか。実は使ったことが全くなかったので怖がって実装していませんでした…。多分、"雰囲気実装" になってしまいますが取り敢えず実装を試してみます。
すみません。やはりこれは欲しい機能ですよね。ble.sh
では未実装 (emacs mode でも使えない) です。
実は昔考察 (memo.txt#L1571-L1591) をしたのですが、自分自身が余り使わないものですから仕様確定できずに終わったのでした。少し議論させて頂ければ、仕様確定して実装できると思います。以下のそれぞれについて主観で構いませんのでどちらの方が自然に思われるか率直な意見を頂ければと思います。
履歴項目 (過去に実行したコマンドの1つ1つ) の移動も redo/undo
の対象に含めるか否か?
参考: Zsh は含めている。Bash は含めていない。
履歴項目毎に編集履歴を記録するか、全体に対して編集履歴を記録するか
参考: Bash は項目ごと。Zsh は全体に対して (もしかすると項目ごとに undo する方法もあるかもしれない)。※全体に対して編集履歴を記録すれば、原理的には一つ一つの履歴項目に対する履歴も抽出できるわけですが、その分処理が非効率になります。
個人的には Zsh よりも Bash の動作のほうが概ね分かりやすいと考えているのですがいかがでしょうか。
ところで vimindex の U
の箇所に
U 2 1行中の最近の変更をすべて取り消す。
と書かれているのですが「すべて」というところを量りかねています。実際に試してみると、すべて取り消すという雰囲気ではなく、最近の変更 (U
自身も含む) を取り消すだけのように見えます。何かご存知でしょうか。また u
に関しても注意点などあれば教えて頂ければ幸いです。
確定を伴なう動作なので標準にしないほうが良いと感じました。というか正直 Vim での CTRL-@ の挙動とは少々違うので……。
やはり標準で実装するのは分かりにくいのですね。vi mode ユーザからの視点ありがとうございます!
こちらで対処します。どうかお気になさらないでください。
毎度試して頂きありがとうございます。この問題は取り敢えず保留として、頭の片隅にでも置いておくことにします。
これは 1b9e2a4 において発生しませんでした。ありがとうございます。
承知しました。また何か問題がありましたらお知らせ下さい。
蛇足気味ですが,vim を一々開いて :help するのが鬱陶しい場合はいつでもどこでも :help する というサイトがありますので,オンラインで手引きが閲覧できます。
ありがとうございます! 便利ですね! (と思って徐に surround と打ってみたらありませんと言われてしまいましたが…surround は標準機能ではありませんからね)
ほか、以下についての確認ありがとうございます!
すいません、追加で報告があります。
テキストオブジェクトに対する c
(削除後挿入モードに移行) が、 d
と同じ振舞いになります。
Ver: 1b9e2a4
また、>
/<
及び大文字小文字系統の動作の確認報告を忘れていました。全て完璧に動作しました。ありがとうございます。
@cmplstofB 様
アカウント名を統一されたのですね。今後とも宜しくお願い致します。
c
テキストオブジェクトに対する c (削除後挿入モードに移行) が、 d と同じ振舞いになります。
ご報告、ありがとうございます。修正しました。これは大ミスなので今 push
しました 3958c51842df0b474877349f4c94966de9578fe6 (修正してから気付いたのですが、もしかして c
が軒並み動かなくなっていたかもしれません)。
機能を拡張していく上で内部構造を大幅に変更することがしばしば出てくるので、このように以前動いていたものがバグで動かなくなってしまうということがあるということは、申し訳ありませんがご承知下さいませ。今回は vi_command
キーマップを vi_command
と vi_omap
(それぞれ Vim の nmap
, omap
に対応) に分割した時のバグでした。
また、>/< 及び大文字小文字系統の動作の確認報告を忘れていました。全て完璧に動作しました。
一つ一つ確認いただきまして本当にありがとうございます!
何度もすいません。しかしこれは今言うべきだと思ったので報告します。
ルートユーザになる為に、su -
を実行し、パスワードを打ち込むとおかしなことになります。
最初の文字は、入力がエコーされないという尋常の挙動ですが、直後に改行(LF/CR とかは分からないです)されて、パスワードの文字列が丸見えになります。
そのまま入力して決定すると、(恐らく)最初の一文字しかパスワードとして判定されず、認識に失敗します。
また、丸見えになっていた文字列は「実行」され、「そのようなコマンドはない」というエラーも出ます。
個人的にこれはシステム上危険すぎると思ったので、修正して欲しいです。
Readline が全滅なので例えば ble.sh を読み込んだ状態で Dash を起動して、su -
を実行しても同様の結果になりますが、
もちろん ble.sh を読み込まなければ正常なパスワード認証ができます。
Commit ID: 3958c51
@cmplstofB 様
ご報告ありがとうございます! cbab20b1b90e9998394e1e2a81b06553d6c1e6e3 stty
の設定を直しました。いかがでしょうか。
(あー…これは ble.sh
が犯人だったのですね。自分のところでも同じ現象になるということは認識していたのですが、余り root
にならないこと・検索しても似た症状の人が出てこないということから放置していました。ble.sh
が原因だったとは、道理で検索しても出てこない訳です…お恥ずかしい限りです)
ありがとうございます!正常な挙動になりました。 私も普段は sudo でパスワード無しの認証ばかりだったので今迄気が付きませんでした。
Commit ID: cbab20b
釈迦に説法のようで失礼ですが、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 の方が情報が見つけやすいかと要らぬ思案をして、結果梃摺らせてしまったことをお詫びします。
@cmplstofB 様
ありがとうございます! 実はもう既に surround.vim 式の実装が進んでしまっているので、一通り終わってから確認いたしますね。(追記: 実は ds
は一通り終わって cs
に入るところです)
本当にすいません……。
@akinomyoga 様、返信が遅れていたものです。
git pull
知らなかったです。git は間抜けでも操作できるということで "git" という名前らしいのですが、それさえも扱えないとは……。
undo に関しては基本的に Bash のそれに合わせて欲しいです。
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
@cmplstofB 様
undo に関しては基本的に Bash のそれに合わせて欲しいです。
ありがとうございます! 承知しました。ただ emacs mode の方とも一緒に実装したいので今すぐ実装するかは分かりません (merge
してから実装した方が良い気がするけれども、気がついたら実装しているかも…)。
実際問題 Vim の手引きでも「この動作はわかりにくいかもしれません」とあるので、
そうなのですね。
統計があるわけではないので定かな事は言えませんが、みなさんの Vim の設定ファイルを見ると、U に undo、つまり CTRL-R を割り当てている
なるほど。その方向も検討してみます。これも、"お好みで設定ファイルに書いて下さい" という説明をどこかに書いておくのが良さそうでしょうか。
上にお書きになった設定で正しいような気がします。ただ、([a-zA-Z])
の行よりも上に書かないといけませんね。また現在その辺りは激しい書き換えの対象であることと、さきの $()
, $(())
の件の対応と同時に外部から拡張できる仕組み (let g:surround_45
的な) を与える予定ですので、そのときにご説明いたします。
ble.sh の vi-mode における CTRL-K は kill-line のままでお願いします。
はい。同じ考えです! 実は一瞬 C-k
はダイグラフだったのですが、戻しました。Bash の C-k
が既定で kill-line
であることと、自分で使ってみてこれは混乱の元だなと思ったためです。折角実装したので、敢えてダイグラフを使いたい人のために以下の Wiki ページに設定方法は書きましたが、今後既定で C-k
がダイグラフになる予定はありませんのでご安心下さいませ!
すみません。バグを色々出していました…。
新機能
[ia][pst]
%
{count}%
vim-surround.sh
: 設定 "bleopt vi_surround_45
", etc. に対応動作変更
r{char}
gr{char}
で上書き対象を着色C-m
, C-h
, DEL
; nmap: o
, O
でインデントを認識バグ修正
2yj
など) をするとエラーになるバグの修正yib
など) 位置の移動が起こらないバグの修正isearch
の途中でノーマルモードに移行すると選択状態がそのままになるバグの修正{count}L
で現在行より上に行く場合、{count}H
で現在行より下に行く場合などで範囲が裏返るバグの修正+
-
H
L
yib
などで非空白行頭に移る条件の修正gg
G
(現在のコマンド内の移動) で、引数省略時に引数 1 と解釈していたバグを修正$?
及び $_
の復元が動かなくなっていたバグの修正char_width=emacs
のとき、★などの文字 (U+2000 - U+2600) の文字幅が常に 1 になっていたバグの修正未対応
vim-surround.sh
(ds
cs
): インデント、テキストオブジェクト p
s
t
、コマンド yS
, ySS
u
C-r
U
/
?
n
N
(これらは master
にマージ後)@cmplstofB 様
引用符の入力を q/Q を用いて行なう設定はどのように記述すればよいでしょうか。
これは既に dotfiles に追加なされたもので問題ありません。
新機能
/
?
n
N
:
gj
gk
_
g0
g<home>
g^
g$
g<end>
gm
go
g_
ge
gE
v
char, V
line, C-v
block);
~
u
U
?
s
x
<delete>
r
C
D
X
S
R
Y
vim-surround.sh
にて囲み文字として t
T
<
を指定したとき、タグ名の入力を受け付けるバグ修正
>>
など) でエラーが出るバグを修正g~
を呼び出せないバグを修正k
-
G
gg
などで履歴項目を移動したときに(最後の文字でなく)行末にカーソルが来るバグの修正>
および <
で空行が消滅するバグの修正ble-bind -d
" の内部でパス名展開が起こって出力が正しくないバグの修正動作の変更
c{linewise}
({linewise}
= j
k
H
L
+
-
gg
G
) のとき空行を挿入するように修正d
で最終行を削除したとき前の行に移動するように修正f
F
t
T
r
gr
に C-? の形式で文字を指定できるように修正dd
, yy
, etc. および D
は最終行で 2 以上の引数を与えるとエラーにするように修正未対応
u
C-r
U
(マージ後の予定)I
A
J
gJ
^]
テキストオブジェクトの正しい動作 (その内)=
(未定)vim-surround.sh
: cs
ds
のインデント, yS
ySS
(未定)@akinomyoga 様
追加の様々な実装ありがとうございます。返信遅れました。 疑問と要望が追加であります。何度も何度も本当にすいません……。
:
コマンドの役割非常な失礼を承知で聞きます。これは一体何をするコマンドなのでしょうか。 Vim の ex モードのようなものだと勝手に解釈し,
$ sudo atp install emacs
-- NORMAL --
というような状態で :
を押下し,
$ sudo atp install emacs
:s/atp/apt
のような入力を行なったのち,
$ sudo apt install emacs
-- NORMAL --
のような状態になることを勝手に予期したのですが,何も起こりませんでした。
しつこくてすいません。しかしながら,やはりカーソルの形状をモード間で変更したいです。 ほんの少しですが私の端末制御への理解も進み,カーソル周りの CS をモード変更毎に送信したりすることが無謀な要望だとは重々に承知しています。そこをどうにか……。 尊大な言い草になってしまいますが,不可能,もしくは手間の多さで無理ならばもう二度とカーソルの形状に係る要望はしません。
More Than Human---Wikipedia によると,『More Than Human』という SF 小説の中で,「blesh」という造語が,「(6人の能力者が) 力を合わせる」というような意味で用いられているそうです。
ちょっと無理矢理な解釈ですが,widget の組合せで強力な編集能力を発揮する ble.sh に類推できますし,『More Than Human』という題名も More Than Bash な ble.sh に似合ってる気がしました。 ロゴとかに使えると面白いかもです。
@cmplstofB 様
ご要望などありがとうございます!
すみません。これは :
を通して別の色々のコマンドを呼び出せるようにするために枠組みを追加しただけで、実際のコマンドは未だ整備していません (物凄く沢山ありますし…)。試験的に :q
(シェル終了) などがあるのみです。検索 (/
, ?
) を実装するために cmap
を定義する必要があって、そのために初めに :
を実装したということなのでした。
今のところ、要望が出ない限りはそれぞれのコマンドの対応をする予定はありません。要望が出たとしても一旦 master
にマージしてからにしますね。
因みに、ble/widget/vi-command:名前
という関数を定義していただければ、:名前 引数...
に対してその関数が呼び出されるようになります (ただ、widget
の実装方法についての説明がないので意味のない情報かもしれませんが。すみません…)。
これの対応は実は簡単です。モードを切り替えるときに制御シーケンスを吐けば良いので。実のところ、既に、上書きモードの時には SM/RM(?25)
(\e[?25h
, \e[?25l
) によってカーソルを非表示にするような制御を行っております。
どのように対応するのが良さそうかについてご意見をいただけませんか。ご意見がなければ勝手に実装します
tput Ss
がある時) デフォルトでカーソル変更を有効にするかどうか
(調べてみると DECSCUSR
は terminfo では Ss
が用いられているようですね [1]。)実のところ TERM
に依存してユーザが場合分けで設定を書かなければならないような設定項目ではなくて、ble.sh
の中で解決 (TERM
依存の切り替えは tput
を用いて内部的に解決) できるような設定項目にしたいというのはあります。因みに設定の $'\e[1m-- NORMAL --\e[m'
の \e[1m
などは ble.sh
内部で ANSI に基づき解釈し tput
の結果に応じて適切なものに置き換えて出力しています (以前、勘違いだったと書きましたが改めてコードを読むとやはり置き換えはしていました…)。その意味で DECSCUSR
を ble.sh
で読み取るという手もありますが、その辺りは分かりやすさとの兼ね合いです。
情報ありがとうございます!
blesh
という単語の意味は確認したりはしていたのですが、映画については知りませんでした。色々と名前で関連を調べるのは楽しいですよね。自分もやります。(ただまあ、相当説得力がない限りは余り後付けは、"公式では" やりたくないなというのはあります。ユーザの方で色々考えていただくのは嬉しいです)
ロゴもあった方が良いですかね。実のところ ble.sh
は余り個性を発揮したものではなくて空気のように存在を意識しなくても使えるものにしたいなあなどと考えていたりします (vim の細かい動作に拘っているのもそういうことにあります)。なので、ロゴを作るとしたら、ミニマリズムというのでしょうか、なにか淡白なものがいいなあと考えていました。
追記 カーソル制御の資料
DECSCUSR
の引数で 5 以上は高さの百分率と解釈する端末もあったはず今週末は進められないのでもう push します。レジスタ "x
とマーク mx
の対応で根幹を弄ったあと、余りテストしていないので不安定かもしれませんがご容赦下さい
新機能
mx
, `x
, 'x
(x
= [][<>`'a-zA-Z"^.]
)gi
, <C-d>
(空文字列のとき exit), "x
(レジスタ)I
, A
, p
, P
, J
, gJ
, aw
, iw
yS
, ySS
, ySs
, cS
, xmap S
, gS
bleopt tab_width
: タブの表示幅, 既定値 ''
(tput を使用))bleopt indent_offset
: >
や <
のインデントの幅, 既定値 4
(8 から 4 に変更した)bleopt indent_tabs
: >
や <
のインデントにタブを用いるかどうか, 既定値 1
(true)バグ修正
ESC ?
も一緒に繰り返されていたバグの修正g?
が動かなくなっていたのを修正/
?
): 検索対象の入力中に C-c
してもキャンセルされないバグの修正r
(visual char/line)): 全体を置換したものが選択範囲に挿入されていたバグの修正$
): 行末で $
をしたときに表示が更新されないバグの修正0
): オペレータを認識していなかったバグを修正/
?
n
N
対応の際に埋め込んでいたので修正complete -F something -D
で登録されている補完関数が正しく実行されていなかったのを修正PROMPT_COMMAND
によって設定された PS1
を拾っていなかったバグを修正C-z
(fz
) すると描画高さを正しく確保できていないバグの修正動作変更
<
>
): Visual block での正しい振る舞い:
/
?
): 文字列入力中に空文字列で DEL or C-h することでキャンセルできるように修正J
, gJ
): 引数に対応p
): 最後の行で挿入するときに余分な行が入らないように修正Y
D
R
): 記録するビジュアルモードの種類を修正.SHELL_COMMAND
): 実行しないコマンドに色がついているのはややこしいのでグレーアウトする様に変更他の変更
未実装
.
, xmap o
, O
(実装予定)u
, C-r
, U
(マージ後の予定)=
, xmap テキストオブジェクトの正しい動作 (未定)ごめんなさい、ビジュアルモードのテキストオブジェクトは面倒になりました。後回しです
@akinomyoga 様
# 誤操作でフォークしてたと思います。すいません。
:
コマンドの役割早とちりしていました。widget の作り方はソースを見て勉強させて頂きます。
ありがとうございます! 是非おねがいします。
@akinomyoga 様に託したいです。
しかし (釈迦に説法ですが) 提案するとするなら,
bleopt is_toggle_cursor_shape_in_vi_mode:=1
のようにすると発現する) はしない。——...
bleopt cs_vi_normal_mode_cursor_shape=$'\e[2 q' # ノーマル
bleopt cs_vi_ins_mode_cursor_shape=$'\e[5 q' # 挿入
bleopt cs_vi_operator_mode_cursor_shape=$'\e[4 q' # y/c/d etc...
...
すいません説明を省略します。
$ cat <<. > tmp/bbbb.ttt
-bash: 警告: ヒアドキュメントの 3 行目でファイル終了 (EOF) に達しました (`.' が必要)
Esc
でノーマルモードに移行しない件結論から言うと,いまだ解決していません。また,今のところ,とりあえず確実に綴りを送信できるキー (具体的には C-c
を潰してます) を vi-insert/normal-mode に割り当てています。
前にも述べましたが,これは自機の問題だと思うので,解決はこちらで頑張りますが,一応報告をしておきます。
Esc
を押してから大体 0.4 sec 以内くらいに英数字やら_普通の_キーを送信すると,ノーマルモードに移行し,またそのキーに割り当てられている動作が実行されます。Esc
キーを 0.4 sec 以内の間隔で4回 (3回では駄目です) 叩くとノーマルモードに移行します。
この 0.4 sec がどこから発生しているのか,正直見当が付かないのですが,とりあえず現状はこんな感じです。
個人的に,「Esc
に続いてある秒数_以内_で他のキーを送信すると Meta-*
と見做される」という症状のほうが一般的な気がします。Commit ID: af62754
@cmplstofB 様
すみません。現状では C-q RET
または C-v RET
などとして複数行編集にして全て入力していただいてから、C-j
で実行していただかなければなりません。
「文法的に続きがあるということが明らかな時に RET
が入力された場合、実行せずに改行を挿入する」というのは前々から考えていたのですが、ble.sh
の文法解析に誤りがあると「実行できるはずのコマンドが実行できない」ということになり兼ねないので慎重になっていたのでした。この辺りはマージ後に対応します。
これは丁度気になっていたところでした。もし解決しないようでしたら ble.sh
にキーロガー (ble.sh
が実際に見ているバイト列・文字の列・キーの列を記録する機構) を組み込んで実行してもらうことを考えていました。
その前に、どのような動作を期待するのか行き違いがあるような気がしたので、確認させていただいてよいでしょうか:
ESC
が来たら (次の文字を待たずに) その場でノーマルモードに移行することを想定していますか。現状の ble.sh
では時間間隔に依存せず、次の文字が来るまで処理しません (エスケープシーケンスの先頭かもしれないので)。未だちゃんと調べていないですが、たぶん、対応できますあと、ご報告頂いた動作について、0.4 sec 以上経過するとそれぞれどのように動作するのでしょうか。またどのように動作することを本来期待するのでしょうか。よろしくおねがいいたします。
@akinomyoga 様
分かりました。ぶっちゃけインタラクティブシェルではあまりヒアドキュメントを使わないと思うので,別に問題ないと言えばないのですが……。
Esc
キーあーこれは完全に私の認識が間違っていました。
もしかして
ESC
が来たら (次の文字を待たずに) その場でノーマルモードに移行することを想定していますか。
はい,そう想定していました。すいません……。
0.4 sec 以上経過するとそれぞれどのように動作するのでしょうか。
英数字キーを押下した場合: その英数字がコマンドラインに挿入されます。つまり挿入モードで入力したのと同じような挙動です。
Esc
キー連打の場合: 何も起きず,ずっと挿入モードのままです。
@cmplstofB 様
はい,そう想定していました。すいません……。
承知しました。そのように実装してみます。
0.4 sec 以上経過するとそれぞれどのように動作するのでしょうか。
- 英数字キーを押下した場合: その英数字がコマンドラインに挿入されます。つまり挿入モードで入力したのと同じような挙動です。
- Esc キー連打の場合: 何も起きず,ずっと挿入モードのままです。
あら、それは不思議ですね…。やはり次でキーロガーを入れることにします
確認いたしました。
Esc
キーへの対応ありがとうございます!
@cmplstofB 様 あら、書き込む前に返事が来てしまいました。確認ありがとうございます!
ESC
の timeout に対応しました。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
★今回の修正には破壊的変更が含まれているので注意して下さい★
破壊的変更
vi_command
-> vi_nmap
, vi_insert
-> vi_imap
ble/widget/{no,}marked
-> ble/widget/@{no,}marked
ble/widget/vi-command/*
(一部) -> ble/widget/vi_nmap/*
ble/widget/vi-insert/@norepeat
廃止。別の方法 (_ble_keymap_vi_imap_white_list
) を用いるので個々に指定する必要はなくなる。新しい機能
term_vi_[inoxc]map
shopt -s histverify
, shopt -s histreedit
に対応 #D0547
.
は実装途中 (現状 nmap/omap におけるオペレータ経由の変更のみ記録) #D0542
#D0549
#D0550
バグ修正
p
, P
が正しく動作しないバグを修正gg
, G
): レジスター指定が消失していたバグの修正y
, d
に正しく渡っていなかったバグの修正PROMPT_COMMAND
で設定された PS1
が永続化されていなかったバグの修正bind -x
で曖昧な登録があって bash_execute_unix_command
エラーになっていた問題の修正 #D0544
vi.sh
, emacs.sh
において default.sh
が多重に呼び出されていた無駄の修正 #D0545
ble/util/assign
が壊れていたバグの修正動作変更
x
, <delete>
, s
, X
, C
, D
): support registerssource ble.sh
において無事にロードされたときに終了ステータス 0 を返すことを保証readlink -f
が動かないときも) シンボリックリンクを通したロードに対応 #D0543
ToDo
.
, xmap o
, O
(実装予定)ToDo (マージ後)
u
, C-r
, U
=
, xmap テキストオブジェクトの正しい動作RET
による複数行モード移行@cmplstofB さま
お誕生日おめでとうございます! こちらは .
をちんたら実装していたために急に失速して余り進んでいませんが、現状で push しますね。あと、今回の変更には破壊的な変更が含まれているために、bashrc における設定を書き換えねばなりません。後で dotfiles に伺います。
よろしくお願いいたします!
お誕生日おめでとうございます!
ありがとうございます。
後で dotfiles に伺います。
すみませんが,commit するまで少々時間を頂きたいです。
すみませんが,commit するまで少々時間を頂きたいです。
承知です。一行ずつコメントしてそちらで修正して頂く方が良いでしょうか。 或いは、こちらで PR を作りましょうか (実はこちらとしては PR の方が楽です)。
或いは、こちらで PR を作りましょうか (実はこちらとしては PR の方が楽です)。
分かりました。PR して下さい。只今 push しましたが,非常に半端な設定になっていると思います。お手間お掛けします……。
set -o vi
対応を行う (参照: #1)。bind -p
を参考にする。