From 79d671da2d661c6cdce2706c6c7128fa5c4deaea Mon Sep 17 00:00:00 2001 From: Koichi Murase Date: Mon, 26 Apr 2021 08:40:30 +0900 Subject: [PATCH] decode: support "ble-bind -m KEYMAP --cursor DECSCUSR" --- ble.pp | 2 +- blerc | 10 +- contrib | 2 +- keymap/emacs.sh | 7 +- keymap/vi.sh | 81 ++++++++++------- keymap/vi_digraph.sh | 5 +- lib/core-complete.sh | 22 ++--- lib/vim-surround.sh | 2 +- memo/D1514.stub.patch | 75 +++++++++++++++ note.txt | 206 ++++++++++++++++++++++++++++++++++++++++++ src/decode.sh | 152 ++++++++++++++++++++----------- src/edit.sh | 28 +++--- src/util.sh | 8 ++ 13 files changed, 475 insertions(+), 125 deletions(-) create mode 100644 memo/D1514.stub.patch diff --git a/ble.pp b/ble.pp index abb341ab..1d541956 100644 --- a/ble.pp +++ b/ble.pp @@ -873,7 +873,7 @@ function ble/base/unload { ble/util/buffer.flush >&2 ble/fd#finalize ble/util/import/finalize - ble-decode/keymap/unload + ble/decode/keymap#unload ble-edit/bind/clear-keymap-definition-loader ble/bin/rm -rf "$_ble_base_run/$$".* 2>/dev/null blehook/invoke unload diff --git a/blerc b/blerc index af49a406..94c4fc43 100644 --- a/blerc +++ b/blerc @@ -650,11 +650,11 @@ function blerc/vim-load-hook { ## Cursor settings - # bleopt keymap_vi_nmap_cursor=2 - # bleopt keymap_vi_imap_cursor=5 - # bleopt keymap_vi_omap_cursor=4 - # bleopt keymap_vi_xmap_cursor=2 - # bleopt keymap_vi_cmap_cursor=0 + # ble-bind -m vi_nmap --cursor 2 + # ble-bind -m vi_imap --cursor 5 + # ble-bind -m vi_omap --cursor 4 + # ble-bind -m vi_xmap --cursor 2 + # ble-bind -m vi_cmap --cursor 0 ## DECSCUSR setting ## diff --git a/contrib b/contrib index de69ed65..62101190 160000 --- a/contrib +++ b/contrib @@ -1 +1 @@ -Subproject commit de69ed652f099cb25e43f2d01506d90b8dd4d970 +Subproject commit 62101190730225b5e22ffcbd87d76ab2e59663a5 diff --git a/keymap/emacs.sh b/keymap/emacs.sh index 8db09183..e4842b18 100644 --- a/keymap/emacs.sh +++ b/keymap/emacs.sh @@ -9,6 +9,7 @@ function ble-edit/bind/load-editing-mode:emacs { :; } # 2019-03-21 keymap cache should be updated for recent changes # 2020-04-29 force update (rename ble-decode/keymap/.register) # 2021-01-25 force update (change mapping of C-w and M-w) +# 2021-04-26 force update (rename ble/decode/keymap#.register) #------------------------------------------------------------------------------ @@ -213,9 +214,9 @@ function ble-decode/keymap:emacs/initialize { ble/edit/info/immediate-show text "ble.sh: updating cache/keymap.emacs..." { - ble-decode/keymap/load isearch dump - ble-decode/keymap/load nsearch dump - ble-decode/keymap/load emacs dump + ble/decode/keymap#load isearch dump + ble/decode/keymap#load nsearch dump + ble/decode/keymap#load emacs dump } 3>| "$fname_keymap_cache" ble/edit/info/immediate-show text "ble.sh: updating cache/keymap.emacs... done" diff --git a/keymap/vi.sh b/keymap/vi.sh index b1e1da31..ac2e0c6d 100644 --- a/keymap/vi.sh +++ b/keymap/vi.sh @@ -7,6 +7,7 @@ function ble-edit/bind/load-editing-mode:vi { :; } # 2020-04-29 force update (rename ble-decode/keymap/.register) # 2021-01-25 force update (change mapping of C-w and M-w) +# 2021-04-26 force update (rename ble/decode/keymap#.register) source "$_ble_base/keymap/vi_digraph.sh" @@ -333,6 +334,26 @@ bleopt/declare -v keymap_vi_omap_cursor '' bleopt/declare -v keymap_vi_xmap_cursor '' bleopt/declare -v keymap_vi_smap_cursor '' bleopt/declare -v keymap_vi_cmap_cursor '' +function ble/keymap:vi/.process-cursor-options { + local keymap=${FUNCNAME[1]#bleopt/check:keymap_}; keymap=${keymap%_cursor} + ble-bind -m "$keymap" --cursor "$value" + local locate=$'\e[32m'$bleopt_source:$bleopt_lineno$'\e[m' + ble/util/print-lines \ + "bleopt ($locate): The option 'keymap_${keymap}_cursor' has been removed." \ + " Please use 'ble-bind -m $keymap --cursor $value' instead." >&2 +} +function bleopt/check:keymap_vi_imap_cursor { ble/keymap:vi/.process-cursor-options; } +function bleopt/check:keymap_vi_nmap_cursor { ble/keymap:vi/.process-cursor-options; } +function bleopt/check:keymap_vi_omap_cursor { ble/keymap:vi/.process-cursor-options; } +function bleopt/check:keymap_vi_xmap_cursor { ble/keymap:vi/.process-cursor-options; } +function bleopt/check:keymap_vi_smap_cursor { ble/keymap:vi/.process-cursor-options; } +function bleopt/check:keymap_vi_cmap_cursor { ble/keymap:vi/.process-cursor-options; } +function bleopt/obsolete:keymap_vi_imap_cursor { :; } +function bleopt/obsolete:keymap_vi_nmap_cursor { :; } +function bleopt/obsolete:keymap_vi_omap_cursor { :; } +function bleopt/obsolete:keymap_vi_xmap_cursor { :; } +function bleopt/obsolete:keymap_vi_smap_cursor { :; } +function bleopt/obsolete:keymap_vi_cmap_cursor { :; } bleopt/declare -v keymap_vi_mode_show 1 function bleopt/check:keymap_vi_mode_show { @@ -393,23 +414,17 @@ function ble/keymap:vi/update-mode-name { local kmap=$_ble_decode_keymap cursor= if [[ $kmap == vi_imap ]]; then ble/util/buffer "$bleopt_term_vi_imap" - ble/term/cursor-state/set-internal "$bleopt_keymap_vi_imap_cursor" elif [[ $kmap == vi_nmap ]]; then ble/util/buffer "$bleopt_term_vi_nmap" - ble/term/cursor-state/set-internal "$bleopt_keymap_vi_nmap_cursor" elif [[ $kmap == vi_xmap ]]; then ble/util/buffer "$bleopt_term_vi_xmap" - ble/term/cursor-state/set-internal "$bleopt_keymap_vi_xmap_cursor" elif [[ $kmap == vi_smap ]]; then ble/util/buffer "$bleopt_term_vi_smap" - ble/term/cursor-state/set-internal "$bleopt_keymap_vi_smap_cursor" elif [[ $kmap == vi_omap ]]; then ble/util/buffer "$bleopt_term_vi_omap" - ble/term/cursor-state/set-internal "$bleopt_keymap_vi_omap_cursor" elif [[ $kmap == vi_cmap ]]; then ble/edit/info/default text '' ble/util/buffer "$bleopt_term_vi_cmap" - ble/term/cursor-state/set-internal "$bleopt_keymap_vi_cmap_cursor" return 0 fi @@ -487,7 +502,7 @@ function ble/widget/vi_imap/normal-mode.impl { _ble_keymap_vi_single_command= _ble_keymap_vi_single_command_overwrite= ble-edit/content/bolp || ((_ble_edit_ind--)) - ble-decode/keymap/push vi_nmap + ble/decode/keymap/push vi_nmap } function ble/widget/vi_imap/normal-mode { ble-edit/content/clear-arg @@ -540,7 +555,7 @@ function ble/keymap:vi/adjust-command-mode { local kmap_popped= if [[ $_ble_decode_keymap == vi_omap ]]; then - ble-decode/keymap/pop + ble/decode/keymap/pop kmap_popped=1 fi @@ -580,8 +595,8 @@ function ble/widget/vi-command/bell { ## @param[in] overwrite ## @param[in] opts function ble/widget/vi_nmap/.insert-mode { - [[ $_ble_decode_keymap == vi_[xs]map ]] && ble-decode/keymap/pop - [[ $_ble_decode_keymap == vi_omap ]] && ble-decode/keymap/pop + [[ $_ble_decode_keymap == vi_[xs]map ]] && ble/decode/keymap/pop + [[ $_ble_decode_keymap == vi_omap ]] && ble/decode/keymap/pop local arg=$1 overwrite=$2 ble/keymap:vi/imap-repeat/reset "$arg" _ble_edit_mark_active= @@ -591,7 +606,7 @@ function ble/widget/vi_nmap/.insert-mode { _ble_keymap_vi_single_command= _ble_keymap_vi_single_command_overwrite= _ble_keymap_vi_search_matched= - ble-decode/keymap/pop + ble/decode/keymap/pop ble/keymap:vi/update-mode-name ble/keymap:vi/mark/start-edit-area @@ -1132,7 +1147,7 @@ function ble/widget/vi-command/operator { ble/keymap:vi/adjust-command-mode return "$ext" elif [[ $_ble_decode_keymap == vi_nmap ]]; then - ble-decode/keymap/push vi_omap + ble/decode/keymap/push vi_omap _ble_keymap_vi_oparg=$_ble_edit_arg _ble_keymap_vi_opfunc=$opname _ble_edit_arg= @@ -2270,7 +2285,7 @@ function ble/keymap:vi/async-read-char.hook { local IFS=$_ble_term_IFS local command="${*:1:$#-1}" key="${*:$#}" if ((key==(_ble_decode_Ctrl|0x6B))); then # C-k - ble-decode/keymap/push vi_digraph + ble/decode/keymap/push vi_digraph _ble_keymap_vi_digraph__hook="$command" else builtin eval -- "$command $key" @@ -2724,11 +2739,11 @@ function ble/keymap:vi/repeat/invoke { ble/widget/vi-command/bell return 1 elif [[ $KEYMAP == vi_omap ]]; then - ble-decode/keymap/push vi_omap + ble/decode/keymap/push vi_omap elif [[ $KEYMAP == vi_[xs]map ]]; then local _ble_keymap_vi_xmap_prev_edit=${_ble_keymap_vi_repeat[6]} ble/widget/vi_xmap/.restore-visual-state - ble-decode/keymap/push "$KEYMAP" + ble/decode/keymap/push "$KEYMAP" # Note: vim では . によって領域の大きさは更新されない。 # 従ってここでは敢えて _ble_keymap_vi_xmap_prev_edit を unset しない fi @@ -6682,7 +6697,7 @@ function ble/widget/vi-command/visual-mode.impl { ((ARG)) && ble/widget/vi_xmap/.restore-visual-state "$ARG" - ble-decode/keymap/push "$keymap" + ble/decode/keymap/push "$keymap" ble/keymap:vi/update-mode-name return 0 } @@ -6713,7 +6728,7 @@ function ble/widget/vi_xmap/exit { if [[ $_ble_decode_keymap == vi_[xs]map ]]; then ble/keymap:vi/xmap/set-previous-visual-area _ble_edit_mark_active= - ble-decode/keymap/pop + ble/decode/keymap/pop ble/keymap:vi/update-mode-name ble/keymap:vi/adjust-command-mode fi @@ -6759,24 +6774,24 @@ function ble/widget/vi_xmap/switch-to-blockwise { # xmap function ble/widget/vi_xmap/switch-to-select { if [[ $_ble_decode_keymap == vi_xmap ]]; then - ble-decode/keymap/pop - ble-decode/keymap/push vi_smap + ble/decode/keymap/pop + ble/decode/keymap/push vi_smap ble/keymap:vi/update-mode-name fi } # smap function ble/widget/vi_xmap/switch-to-visual { if [[ $_ble_decode_keymap == vi_smap ]]; then - ble-decode/keymap/pop - ble-decode/keymap/push vi_xmap + ble/decode/keymap/pop + ble/decode/keymap/push vi_xmap ble/keymap:vi/update-mode-name fi } # smap function ble/widget/vi_xmap/switch-to-visual-blockwise { if [[ $_ble_decode_keymap == vi_smap ]]; then - ble-decode/keymap/pop - ble-decode/keymap/push vi_xmap + ble/decode/keymap/pop + ble/decode/keymap/push vi_xmap fi if [[ ${_ble_edit_mark_active%+} != vi_block ]]; then ble/widget/vi_xmap/switch-to-blockwise @@ -7727,7 +7742,7 @@ function ble/widget/vi_imap/insert-digraph.hook { } function ble/widget/vi_imap/insert-digraph { - ble-decode/keymap/push vi_digraph + ble/decode/keymap/push vi_digraph _ble_keymap_vi_digraph__hook=ble/widget/vi_imap/insert-digraph.hook return 0 } @@ -7953,7 +7968,7 @@ function ble/keymap:vi/async-commandline-mode { _ble_keymap_vi_cmap_history_prefix=$_ble_history_prefix # 初期化 - ble-decode/keymap/push vi_cmap + ble/decode/keymap/push vi_cmap ble/keymap:vi/update-mode-name # textarea @@ -8004,7 +8019,7 @@ function ble/widget/vi_cmap/accept { [[ $_ble_edit_overwrite_mode ]] && ble/util/buffer "$_ble_term_civis" _ble_history_prefix=$_ble_keymap_vi_cmap_history_prefix - ble-decode/keymap/pop + ble/decode/keymap/pop ble/keymap:vi/update-mode-name if [[ $hook ]]; then builtin eval -- "$hook \"\$result\"" @@ -8087,13 +8102,13 @@ function ble-decode/keymap:vi/initialize { ble/edit/info/immediate-show text "ble.sh: updating cache/keymap.vi..." { - ble-decode/keymap/load isearch dump - ble-decode/keymap/load nsearch dump - ble-decode/keymap/load vi_imap dump - ble-decode/keymap/load vi_nmap dump - ble-decode/keymap/load vi_omap dump - ble-decode/keymap/load vi_xmap dump - ble-decode/keymap/load vi_cmap dump + ble/decode/keymap#load isearch dump + ble/decode/keymap#load nsearch dump + ble/decode/keymap#load vi_imap dump + ble/decode/keymap#load vi_nmap dump + ble/decode/keymap#load vi_omap dump + ble/decode/keymap#load vi_xmap dump + ble/decode/keymap#load vi_cmap dump } 3>| "$fname_keymap_cache" ble/edit/info/immediate-show text "ble.sh: updating cache/keymap.vi... done" diff --git a/keymap/vi_digraph.sh b/keymap/vi_digraph.sh index 3dca4184..7b2b50e5 100644 --- a/keymap/vi_digraph.sh +++ b/keymap/vi_digraph.sh @@ -1,6 +1,7 @@ #!/bin/bash # 2020-04-29 force update (rename ble-decode/keymap/.register) +# 2021-04-26 force update (rename ble/decode/keymap#.register) _ble_keymap_vi_digraph__hook= @@ -8,7 +9,7 @@ function ble/widget/vi_digraph/.proc { local code=$1 local hook=${_ble_keymap_vi_digraph__hook:-ble-decode-key} _ble_keymap_vi_digraph__hook= - ble-decode/keymap/pop + ble/decode/keymap/pop builtin eval -- "$hook $code" } @@ -57,7 +58,7 @@ function ble-decode/keymap:vi_digraph/initialize { ble/edit/info/immediate-show text "ble.sh: updating cache/keymap.vi_digraph..." : >| "$fname_keymap_cache" - ble-decode/keymap/load vi_digraph dump 3>> "$fname_keymap_cache" + ble/decode/keymap#load vi_digraph dump 3>> "$fname_keymap_cache" ble/edit/info/immediate-show text "ble.sh: updating cache/keymap.vi_digraph... done" } diff --git a/lib/core-complete.sh b/lib/core-complete.sh index 30d42906..8a11d28e 100644 --- a/lib/core-complete.sh +++ b/lib/core-complete.sh @@ -794,12 +794,12 @@ function ble/widget/menu/end-of-page { } function ble/widget/menu/cancel { - ble-decode/keymap/pop + ble/decode/keymap/pop ble/complete/menu#clear "$_ble_complete_menu_class"/oncancel } function ble/widget/menu/accept { - ble-decode/keymap/pop + ble/decode/keymap/pop ble/complete/menu#clear local nsel=$_ble_complete_menu_selected local hook=$_ble_complete_menu_accept_hook @@ -860,7 +860,7 @@ function ble/complete/menu#start { ble/complete/menu#construct sync || return "$?" ble/complete/menu#show ble/complete/menu#select 0 - ble-decode/keymap/push menu + ble/decode/keymap/push menu return 147 } @@ -5200,13 +5200,13 @@ function ble/complete/menu-complete/enter { fi _ble_edit_mark_active=insert - ble-decode/keymap/push menu_complete + ble/decode/keymap/push menu_complete return 0 } function ble/widget/menu_complete/exit { local opts=$1 - ble-decode/keymap/pop + ble/decode/keymap/pop if ((_ble_complete_menu_selected>=0)); then # 置換情報を再構成 @@ -5255,7 +5255,7 @@ function ble/widget/menu_complete/exit { _ble_complete_menu_original= } function ble/widget/menu_complete/cancel { - ble-decode/keymap/pop + ble/decode/keymap/pop ble/complete/menu#select -1 _ble_edit_mark_active= _ble_complete_menu_original= @@ -5408,7 +5408,7 @@ function ble/complete/auto-complete/.enter-auto-complete-mode { _ble_complete_ac_suffix=$suffix _ble_edit_mark_active=auto_complete - ble-decode/keymap/push auto_complete + ble/decode/keymap/push auto_complete ble-decode-key "$_ble_complete_KCODE_ENTER" # dummy key input to record keyboard macros } ## @fn ble/complete/auto-complete/.insert ins @@ -5597,7 +5597,7 @@ function ble/widget/auto-complete-enter { ble/complete/auto-complete.impl sync } function ble/widget/auto_complete/cancel { - ble-decode/keymap/pop + ble/decode/keymap/pop ble-edit/content/replace "$_ble_edit_ind" "$_ble_edit_mark" '' _ble_edit_mark=$_ble_edit_ind _ble_edit_mark_active= @@ -5605,7 +5605,7 @@ function ble/widget/auto_complete/cancel { _ble_complete_ac_suffix= } function ble/widget/auto_complete/insert { - ble-decode/keymap/pop + ble/decode/keymap/pop ble-edit/content/replace "$_ble_edit_ind" "$_ble_edit_mark" '' _ble_edit_mark=$_ble_edit_ind @@ -6244,7 +6244,7 @@ function ble/complete/dabbrev/next.fib { } function ble/widget/dabbrev-expand { ble/complete/dabbrev/initialize-variables - ble-decode/keymap/push dabbrev + ble/decode/keymap/push dabbrev ble/util/fiberchain#initialize ble/complete/dabbrev ble/util/fiberchain#push next ble/util/fiberchain#resume @@ -6288,7 +6288,7 @@ function ble/widget/dabbrev/cancel { fi } function ble/widget/dabbrev/exit { - ble-decode/keymap/pop + ble/decode/keymap/pop _ble_edit_mark_active= ble/complete/dabbrev/erase-status } diff --git a/lib/vim-surround.sh b/lib/vim-surround.sh index c64c10a5..bb8ed8a5 100644 --- a/lib/vim-surround.sh +++ b/lib/vim-surround.sh @@ -795,7 +795,7 @@ function ble/widget/vim-surround.sh/omap { local ARG FLAG REG; ble/keymap:vi/get-arg 1 _ble_edit_arg=$ARG _ble_keymap_vi_reg=$REG - ble-decode/keymap/pop + ble/decode/keymap/pop ble/widget/vi-command/operator "$opfunc:$opflags" ;; (yss) ble/widget/vi_nmap/linewise-operator "yss:$opflags" ;; diff --git a/memo/D1514.stub.patch b/memo/D1514.stub.patch new file mode 100644 index 00000000..d3c2718c --- /dev/null +++ b/memo/D1514.stub.patch @@ -0,0 +1,75 @@ +From 7456a437e59f26b22507ec453bc19d67e45c8673 Mon Sep 17 00:00:00 2001 +From: Koichi Murase +Date: Mon, 26 Apr 2021 06:36:26 +0900 +Subject: [PATCH] stub: keymap_emacs_cursor + +--- + blerc | 10 ++++++++++ + keymap/emacs.sh | 16 +++++++++++++++- + 2 files changed, 25 insertions(+), 1 deletion(-) + +diff --git a/blerc b/blerc +index 94c4fc4..3cb6cbe 100644 +--- a/blerc ++++ b/blerc +@@ -609,6 +609,16 @@ + # ble-color-setface varname_transform fg=29,bold + # ble-color-setface varname_unset fg=124 + ++##----------------------------------------------------------------------------- ++## Settings for emacs-mode ++ ++function blerc/emacs-load-hook { ++ : ++ ## Cursor style ++ ++ # bleopt keymap_emacs_cursor=5 ++} ++blehook/eval-after-load keymap_emacs blerc/emacs-load-hook + + ##----------------------------------------------------------------------------- + ## Settings for vim-mode +diff --git a/keymap/emacs.sh b/keymap/emacs.sh +index e4842b1..1c20c0e 100644 +--- a/keymap/emacs.sh ++++ b/keymap/emacs.sh +@@ -11,6 +11,16 @@ function ble-edit/bind/load-editing-mode:emacs { :; } + # 2021-01-25 force update (change mapping of C-w and M-w) + # 2021-04-26 force update (rename ble/decode/keymap#.register) + ++bleopt/declare -v keymap_emacs_cursor '' ++function bleopt/check:keymap_emacs_cursor { ++ if [[ $_ble_attached ]]; then ++ local ret; bleopt/get:default_keymap ++ [[ $ret == emacs ]] && ++ ble/term/cursor-state/set-internal "$bleopt_keymap_emacs_cursor" ++ fi ++ return 0 ++} ++ + #------------------------------------------------------------------------------ + + _ble_keymap_emacs_white_list=( +@@ -39,6 +49,10 @@ function ble/keymap:emacs/is-command-white { + return 1 + } + ++function ble/widget/emacs/__attach__ { ++ ble/widget/safe/__attach__ ++ ble/term/cursor-state/set-internal "$bleopt_keymap_emacs_cursor" ++} + function ble/widget/emacs/__before_widget__ { + if ! ble/keymap:emacs/is-command-white "$WIDGET"; then + ble-edit/undo/add +@@ -154,7 +168,7 @@ function ble-decode/keymap:emacs/define { + + #---------------------------------------------------------------------------- + +- ble-bind -f __attach__ safe/__attach__ ++ ble-bind -f __attach__ emacs/__attach__ + ble-bind -f __before_widget__ emacs/__before_widget__ + ble-bind -f __after_widget__ emacs/__after_widget__ + ble-bind -f __line_limit__ __line_limit__ +-- +2.30.0 + diff --git a/note.txt b/note.txt index ac15ecc0..29c8f974 100644 --- a/note.txt +++ b/note.txt @@ -1208,6 +1208,43 @@ bash_tips 0.5 ControlPanel/TUI Framework 0.4 progcolor +2021-04-26 + + * keymap/vi: vi における既定の keymap を imap ではなく nmap にするオプション + + 現在の振る舞いではコマンド実行後に nmap であれば insert-mode に戻すという操 + 作をしていた筈である。その箇所を書き換えて、オプションに応じて変更先のモー + ドを切り替える様にすれば良い。それと ble-attach した時の最初の設定を行った + 直後に、自動的に nmap に移動する様にする処理を加えれば良い。 + + * ble-bind: ble-bind -P で、他のオプションで指定したタイプの binding だけを出力する? + + % -T を指定すれば -T の設定を出力する。--cursor を指定すれば --cursor の設 + % 定を出力する。cmap 関連のオプションを指定すればそれに関連する設定を出力す + % る。と思ったが、-T, --cursor, --csi, -k, etc. はそれぞれオプション引数を + % 取るので、引数読み取りの段階で -P の後で振る舞いを変更する様にしなければ + % ならない。これはコマンドライン引数の解釈として不自然である。 + + 別のオプションを使って dump する内容を選別するのが良い。例えば、 + --filter=timeout:cursor:csi:cmap:etc 等である。 + + * decode: [refactor] _ble_decode_KEYMAP_kmap_@ ? + + いきなり KEYMAP ではなくてその前に何か挟みたい。例えば + _ble_decode_kmap_KEYMAP_@ に変更する等。この場合には KEYMAP の名称として紛 + らわしい物が定義された時に問題になるのではないか。前の実装で KEYMAP の直後 + に固定の文字列を挿入していたのは、末尾から KEYMAP 以外の部分を一意に切り取 + る事ができる様にする為の設計だったのではないか。 + + 現在の実装は末尾からの一意性が保証される様になっている。_kmap_ が他で使われ + ていない限りに於いて、ちゃんと一意になっている。然し、名前空間として変であ + るというのも分かりにくい。なので、 _ble_decode_kmap_KEYMAP_xxxx_yyyy にして、 + xxxx には yyyy に絶対に現れない文字列を指定すれば良い。例えば data 等。 + +2021-04-04 + + * history auto-save + 2021-03-07 * システムによってロードされた fzf が悪さをして固まってしまう。 @@ -4019,6 +4056,175 @@ bash_tips Done (実装ログ) ------------------------------------------------------------------------------- +2021-04-26 + + * util: 既定の cursor-shape の時には DECSCUSR は出力しない (motivated by jmederosalvarado) [#D1516] + https://github.com/akinomyoga/ble.sh/issues/95 + + % cursor shape を変更しない場合には external/internal の切り替えでも + % DECSCUSR は出力しない様にするオプション? + →オプションではなく固定でその様な動作に変更した。 + + そもそもその様な実装になっていると思っていたが…。恐らく一番最初の状態が + unknown になっているのが原因? もし最初の状態が 0 になっていたとして emacs + mode の場合にはそのまま DECSCUSR が全く呼び出されずに済んだ可能性はあったろ + うか。 + + →実際に試しに最初の状態を unknown から 0 に変更した所、ちゃんと最初のカー + ソル状態が保持される様になった。 + + ? no: 然し、コマンドを実行した後にカーソル形状を元に戻すという操作が強制で + 入っている可能性はあるだろうか? + + →確認してみたが、特に external/internal は意識していなくて、また外部コマ + ンドがカーソル形状を変化させてしまうという可能性は考えていない。外部コマ + ンドが停止する時にカーソル形状を戻しておくべきであるという前提に基づいて + いるのであろう。 + + 取り敢えずその前提は仮定する事にする。 + + 条件判定を変更したが、実は初めから値を 0 に設定しておけば同じ動作になるので + はないだろうか…。此処で実装するべきは空文字列だった時と 0 の区別ではないか。 + と思ったが、0 を意図してブロックとして指定するユーザーがいるかも怪しい。ブ + ロックであれば 1 を指定すれば良いからである。 + + 諸々考えると単に初期値を unknown から 0 にすれば良いという気がする。 + + * term/edit: keymap 毎のカーソル形状 (motivated by jmederosalvarado) [#D1515] + https://github.com/akinomyoga/ble.sh/issues/95 + + 現在の実装では auto-complete, menu 等の mini mode 等でカーソル形状は変わら + ないと仮定して、emacs, vi_?map の間の変更だけでカーソル形状の再設定を行って + いる。然し、今後 mini mode におけるカーソル形状の変更も考えると、もっと統一 + 的にカーソル形状を管理する必要がある気がする。 + + 例えば keymap 毎にカーソル形状を設定できる様にして、keymap の切替時に設定さ + れたカーソル形状に変更する様にする。指定した keymap にカーソル形状が設定さ + れていない場合は、keymap stack 内の前の keymap を参照する。 + + * この時、既存のカーソル形状の設定はどうするのか。 + + 現在の vi におけるカーソル形状の設定: imap,nmap,omap,xmap,smap,cmap + ... これらの設定に応じてカーソル形状を変化させる様になっている。然し、実 + 際の実装ではこれらの map は参照せずに設定している気がする… と思ったが確 + 認したらちゃんと keymap を参照してカーソルを切り替えていた。 + + 設定の方法は bleopt keymap_vi_?map_cursor を介して行っているが、もし + keymap 毎にカーソル形状を管理する様にするという事だと、(1) 既存の設定は翻 + 訳しなければならない (2) 新しい方法に移行する様に情報を提示する必要がある。 + + 或いは、bleopt keymap_KEYMAP_cursor を一般に使える様にするという手もある + が、これはこれで bleopt 内に名称の構造を作成する事になるので避けたい。 + + * emacs に対応する。 + + ? ok: cursor-state を decode.sh から参照しても依存関係的に問題ない + か。cursor-state は何処で実装されているか? → util.sh で定義され + ている様なので大丈夫。 + + [変更] + + * done: 設定の変数名を決める ... _ble_decode_KEYMAP_kmap_cursor + + 取り敢えずは bleopt_keymap_KEYMAP_cursor を参照して実装する? と思ったが後 + の調整が色々面倒になりそうなので、もうこの時点で変数名も決めてしまう事に + する。 + + 元々の keymap の設定は _ble_decode_KEYMAP_kmap_@ に保持している。同様に + _ble_decode_KEYMAP_kmap_cursor を使おうと考えたが、これだと dump/save で + 記録されてしまうので微妙である。また、どういう設定コマンドで設定するべき + かという問題もある。 + + a ble-bind を使って設定を行う? と思っても直感的に変である。例えば + ble-bind -m KEYMAP --cursor 5 とか設定する事になる。うーん。そんなに変 + ではないかもしれない? + + 後、これの呼び出しも遅延する事にすれば実は dump で記録されてしまう問題 + も気にしなくて良い気がする。KEYMAP に紐付いているという事を考えても、直 + 観的に特に問題はない様な気もしてきた。 + + この場合には ble-bind -P で出力する時にカーソル設定も出力する様にする必 + 要がある。 + + a 新しくカーソル設定だけの為のコマンドを用意する? というのもユーザーが覚 + える事が増えるだけで余り良くない。 + + c 或いはやはり bleopt keymap_cursor_KEYMAP という感じにして、多少構造化さ + れた名前の bleopt に変更するに留めるか。 + + 今は取り敢えず a の方針で考える事にする。 + + * done: ble-bind にオプションを追加する。 + * done: ble-bind に於ける遅延初期化について確認する。 + * done: refactor: ble-decode-key/dump 其他。 + + * done: 実装する。keymap/push, pop の際に cursor shape を再設定すれば良い。 + + % 遡ってもカーソル形状が指定されていない場合には何もしない? 今までに何も + % 設定されていなければ何もしない。今までに何か特別な物が設定されていた場 + % 合には 0 または空の文字列で DECSCUSR を呼び出してカーソル形状の設定をク + % リアする。これは実は cursor-shape の側で設定を行っている筈なので気にし + % なくて良い。 + + 遡ってもカーソル形状が指定されていない場合はカーソル形状をクリアする。 + + * done: keymap_vi_?map_cursor の設定を翻訳する。 + + 書き換えの指示を表示する事にした。然し、遅延ロードで設定が読み込まれる為 + に表示が乱れてしまう。これに対応する為にはメッセージを受け取った時に表示 + する様にしなければならない。どの様にするのが良いか。或いは invalidate す + る? と思ったが座標計算のずれまでは解決しない。 + + * reject: term_vi_?map についても keymap 側に設定を移行するべきなのではないか。 + + 然しこれに関しては大して系統的に管理しようとはしていないし、もし何かしよ + うと思う場合でも __attach__ で実行すれば良いのではないか。ただ + し、__attach__ はその keymap を push した時にしか実行されない。一方で、 + term は pop して表に出てきた時にも実行する必要があるという点が異なる。そ + ういう意味で ble-bind --cursor と同様に取り扱っても良いのではないか。とい + うより、ble-bind --cursor を止めてもっと汎用的な hook を用意する可能性? + と思ったが、やはり cursor は cursor で管理するのが良い気がする。 + + term_vi_?map についてはユーザが設定したい時に利用する物なので、現状の儘 + naive な実装をするままで良い。複雑な仕様にするとユーザーが混乱する。 + + * done: vi における動作テストを行う。 + + * done: wiki: ble-bind に追記 + * done: wiki: 既存の keymap_vi_?map_cursor を廃止。 + * done: update blerc + + * 2021-04-04 keymap/emacs: emacs mode でも cursor shape を設定できる様にする [#D1514] + https://github.com/akinomyoga/ble.sh/issues/95 + + % keymap/vi と同様に実装した。本来は auto-complete や menu 等の mini mode の + % 中でカーソルの形が変化することも考慮に入れて、もっと統一的な枠組みでカーソ + % ルの形状を管理するべきな気もするが、現在は external/internal 及び major + % mode の切り替えのみでカーソル形状を変更する取り決めにして、直接カーソル形状 + % の設定を各 major mode の切り替えで記述している。 + % + % 2021-04-26 設定を変更した時に直ぐに反映する様にするには? →取り敢えず + % keymap/vi と同様にカーソルの形状はトップレベルで決まっていると考えて、基底 + % keymap が emacs かどうかだけで変更を適用する様にした。然し、既に上の段落で + % 記述した様に、mini mode 毎にカーソル形状を変更する為にはちゃんと構造化して + % カーソルを変更する仕組みを整備しなければならない。 + % + % * 今の暫定実装だと、emacs モード内で vi に移行している時に意図しない動作に + % なる。vi は毎回自分の状態に応じてカーソルを設定しようとするとので、emacs + % の中で vi に移行していたとしても関係なくカーソル形状を変更してくる。なの + % で、emacs 内の vi でも vi のカーソル形状の設定は有効であると考えるべきで + % ある。 + % + % 暫定実装では基底が emacs かどうかで判定しているが、そうではなくて、keymap + % stack の内部でカーソルが設定されている一番上の keymap を使って判定するべ + % きなのではないだろうか。 + % + % これも keymap ベースの判定方法なので、やはり keymap を基準にした実装に切 + % り替えるべきの気がしてきた。 + + この変更は結局 #D1515 の実装に伴ってキャンセルした。一応変更は + memo/D1503.stub.patch に残しておく。 + 2021-03-15 * 2021-03-03 syntax: 実は "${v#...}" の中身も tilde 展開の対象の様である [#D1513] diff --git a/src/decode.sh b/src/decode.sh index 65e74924..2054aa11 100644 --- a/src/decode.sh +++ b/src/decode.sh @@ -1380,35 +1380,35 @@ function ble-decode-char/dump { ## 初期化済みの kmap の名前の一覧を保持します。 ## 既定の kmap (名前無し) は含まれません。 _ble_decode_keymap_list= -function ble-decode/keymap/registered { +function ble/decode/keymap#registered { [[ :$_ble_decode_keymap_list: == *:"$1":* ]] } -## @fn ble-decode/keymap/.register kmap +## @fn ble/decode/keymap#.register kmap ## @exit 新しく keymap が登録された時に成功します。 ## 既存の keymap だった時に失敗します。 ## @remarks ## この関数は keymap cache から読み出されます。 -function ble-decode/keymap/.register { +function ble/decode/keymap#.register { local kmap=$1 if [[ $kmap && :$_ble_decode_keymap_list: != *:"$kmap":* ]]; then _ble_decode_keymap_list=$_ble_decode_keymap_list:$kmap fi } -function ble-decode/keymap/.unregister { +function ble/decode/keymap#.unregister { _ble_decode_keymap_list=$_ble_decode_keymap_list: _ble_decode_keymap_list=${_ble_decode_keymap_list//:"$1":/:} _ble_decode_keymap_list=${_ble_decode_keymap_list%:} } -function ble-decode/keymap/is-keymap { - ble-decode/keymap/registered "$1" || ble/is-function "ble-decode/keymap:$1/define" +function ble/decode/is-keymap { + ble/decode/keymap#registered "$1" || ble/is-function "ble-decode/keymap:$1/define" } -function ble-decode/keymap/is-empty { +function ble/decode/keymap#is-empty { ! ble/is-array "_ble_decode_${1}_kmap_" || builtin eval -- "((\${#_ble_decode_${1}_kmap_[*]}==0))" } -function ble-decode/keymap/.onload { +function ble/decode/keymap#.onload { local kmap=$1 local delay=$_ble_base_run/$$.bind.delay.$kmap if [[ -s $delay ]]; then @@ -1416,27 +1416,27 @@ function ble-decode/keymap/.onload { : >| "$delay" fi } -function ble-decode/keymap/load { +function ble/decode/keymap#load { local opts=:$2: - ble-decode/keymap/registered "$1" && return 0 + ble/decode/keymap#registered "$1" && return 0 local init=ble-decode/keymap:$1/define ble/is-function "$init" || return 1 - ble-decode/keymap/.register "$1" + ble/decode/keymap#.register "$1" local ble_bind_keymap=$1 - if ! "$init" || ble-decode/keymap/is-empty "$1"; then - ble-decode/keymap/.unregister "$1" + if ! "$init" || ble/decode/keymap#is-empty "$1"; then + ble/decode/keymap#.unregister "$1" return 1 fi [[ $opts == *:dump:* ]] && - ble-decode/keymap/dump "$1" >&3 - ble-decode/keymap/.onload "$1" + ble/decode/keymap#dump "$1" >&3 + ble/decode/keymap#.onload "$1" return 0 } -## @fn ble-decode/keymap/unload [keymap_name...] -function ble-decode/keymap/unload { +## @fn ble/decode/keymap#unload [keymap_name...] +function ble/decode/keymap#unload { if (($#==0)); then local list; ble/string#split-words list "${_ble_decode_keymap_list//:/ }" set -- "${list[@]}" @@ -1448,17 +1448,17 @@ function ble-decode/keymap/unload { for array_name in "${array_names[@]}"; do builtin unset -v "$array_name" done - ble-decode/keymap/.unregister "$1" + ble/decode/keymap#.unregister "$1" shift done } if [[ $_ble_decode_kmaps ]]; then - ## @fn ble-decode/keymap/cleanup-old-keymaps + ## @fn ble/decode/keymap/cleanup-old-keymaps ## 古い形式の keymap を削除する (#D1076) ## 0.4.0-devel1+e13e979 以前は unload 時に keymaps を削除していなかった為に、 ## reload した時に keycode 不整合で無限ループになってしまうバグがあった。 - function ble-decode/keymap/cleanup-old-keymaps { + function ble/decode/keymap/cleanup-old-keymaps { # Note: 古い形式では必ずしも _ble_decode_kmaps に keymap # が登録されていなかったので、配列データから抽出する必要がある。 local -a list=() @@ -1472,25 +1472,25 @@ if [[ $_ble_decode_kmaps ]]; then local keymap_name for keymap_name in "${list[@]}"; do - ble-decode/keymap/unload "$keymap_name" + ble/decode/keymap#unload "$keymap_name" done builtin unset -v _ble_decode_kmaps } - ble-decode/keymap/cleanup-old-keymaps + ble/decode/keymap/cleanup-old-keymaps fi -function ble-decode/keymap/dump { +function ble/decode/keymap#dump { if (($#)); then local kmap=$1 arrays builtin eval "arrays=(\"\${!_ble_decode_${kmap}_kmap_@}\")" - ble/util/print "ble-decode/keymap/.register $kmap" + ble/util/print "ble/decode/keymap#.register $kmap" ble/util/declare-print-definitions "${arrays[@]}" - ble/util/print "ble-decode/keymap/.onload $kmap" + ble/util/print "ble/decode/keymap#.onload $kmap" else local list; ble/string#split-words list "${_ble_decode_keymap_list//:/ }" local keymap_name for keymap_name in "${list[@]}"; do - ble-decode/keymap/dump "$keymap_name" + ble/decode/keymap#dump "$keymap_name" done fi } @@ -1508,11 +1508,11 @@ function ble-decode/GET_BASEMAP { ## ble-decode.sh 使用コードで上書きして使用します。 function ble-decode/INITIALIZE_DEFMAP { ble-decode/GET_BASEMAP "$@" && - ble-decode/keymap/load "${!2}" && + ble/decode/keymap#load "${!2}" && return 0 # fallback - ble-decode/keymap/load safe && + ble/decode/keymap#load safe && builtin eval -- "$2=safe" && bleopt_default_keymap=safe } @@ -1527,7 +1527,7 @@ function ble/widget/.EDIT_COMMAND { local IFS=$_ble_term_IFS; builtin eval -- "$ ## @fn ble-decode-key/bind keymap keys command ## @param[in] keymap keys command function ble-decode-key/bind { - if ! ble-decode/keymap/registered "$1"; then + if ! ble/decode/keymap#registered "$1"; then ble/util/print-quoted-command "$FUNCNAME" "$@" >> "$_ble_base_run/$$.bind.delay.$1" return 0 fi @@ -1569,7 +1569,7 @@ function ble-decode-key/bind { } function ble-decode-key/set-timeout { - if ! ble-decode/keymap/registered "$1"; then + if ! ble/decode/keymap#registered "$1"; then ble/util/print-quoted-command "$FUNCNAME" "$@" >> "$_ble_base_run/$$.bind.delay.$1" return 0 fi @@ -1598,7 +1598,7 @@ function ble-decode-key/set-timeout { ## @fn ble-decode-key/unbind keymap keys function ble-decode-key/unbind { - if ! ble-decode/keymap/registered "$1"; then + if ! ble/decode/keymap#registered "$1"; then ble/util/print-quoted-command "$FUNCNAME" "$@" >> "$_ble_base_run/$$.bind.delay.$1" return 0 fi @@ -1647,13 +1647,29 @@ function ble-decode-key/unbind { done } -function ble-decode-key/dump { +function ble/decode/keymap#get-cursor { + cursor=_ble_decode_${1}_kmap_cursor + cursor=${!cursor-} +} +function ble/decode/keymap#set-cursor { + local keymap=$1 cursor=$2 + if ! ble/decode/keymap#registered "$keymap"; then + ble/util/print-quoted-command "$FUNCNAME" "$@" >> "$_ble_base_run/$$.bind.delay.$keymap" + return 0 + fi + builtin eval "_ble_decode_${keymap}_kmap_cursor=\$cursor" +} + +## @fn ble/decode/keymap#print keymap [tseq nseq] +## @param keymap +## @param[in,internal] tseq nseq +function ble/decode/keymap#print { # 引数の無い場合: 全ての kmap を dump local kmap if (($#==0)); then for kmap in ${_ble_decode_keymap_list//:/ }; do ble/util/print "# keymap $kmap" - ble-decode-key/dump "$kmap" + ble/decode/keymap#print "$kmap" done return 0 fi @@ -1687,7 +1703,7 @@ function ble-decode-key/dump { fi if [[ ${ent::1} == _ ]]; then - ble-decode-key/dump "$kmap" "${tseq}_$key" "$knames" + ble/decode/keymap#print "$kmap" "${tseq}_$key" "$knames" if [[ $ent == _[0-9]* ]]; then local timeout=${ent%%:*}; timeout=${timeout:1} ble/util/print "ble-bind$kmapopt -T '${knames//$q/$Q}' $timeout" @@ -1707,28 +1723,45 @@ function ble-decode-key/dump { _ble_decode_keymap=emacs _ble_decode_keymap_stack=() -## @fn ble-decode/keymap/push kmap -function ble-decode/keymap/push { - if ble-decode/keymap/registered "$1"; then +## @fn ble/decode/keymap/push kmap +function ble/decode/keymap/push { + if ble/decode/keymap#registered "$1"; then ble/array#push _ble_decode_keymap_stack "$_ble_decode_keymap" _ble_decode_keymap=$1 - elif ble-decode/keymap/load "$1" && ble-decode/keymap/registered "$1"; then - ble-decode/keymap/push "$1" # 再実行 + + # set cursor-state + local cursor; ble/decode/keymap#get-cursor "$1" + [[ $cursor ]] && ble/term/cursor-state/set-internal $((cursor)) + elif ble/decode/keymap#load "$1" && ble/decode/keymap#registered "$1"; then + ble/decode/keymap/push "$1" # 再実行 else ble/util/print "[ble: keymap '$1' not found]" >&2 return 1 fi } -## @fn ble-decode/keymap/pop -function ble-decode/keymap/pop { +## @fn ble/decode/keymap/pop +function ble/decode/keymap/pop { local count=${#_ble_decode_keymap_stack[@]} local last=$((count-1)) ble/util/assert '((last>=0))' || return 1 + + # reset cursor-state + local cursor + ble/decode/keymap#get-cursor "$_ble_decode_keymap" + if [[ $cursor ]]; then + local i + for ((i=last;i>=0;i--)); do + ble/decode/keymap#get-cursor "${_ble_decode_keymap_stack[i]}" + [[ $cursor ]] && break + done + ble/term/cursor-state/set-internal $((${cursor:-0})) + fi + + local old_keymap=_ble_decode_keymap _ble_decode_keymap=${_ble_decode_keymap_stack[last]} builtin unset -v '_ble_decode_keymap_stack[last]' } - ## @var _ble_decode_key__seq ## 今迄に入力された未処理のキーの列を保持します ## /(_\d+)*/ の形式の文字列です。 @@ -2788,7 +2821,7 @@ function ble/decode/rebind { function ble-bind/.initialize-kmap { [[ $kmap ]] && return 0 ble-decode/GET_BASEMAP -v kmap - if ! ble-decode/keymap/is-keymap "$kmap"; then + if ! ble/decode/is-keymap "$kmap"; then ble/util/print "ble-bind: the default keymap '$kmap' is unknown." >&2 return 1 fi @@ -2802,6 +2835,7 @@ ble-bind -k [TYPE:]cspecs [[TYPE:]kspec] ble-bind --csi PsFt [TYPE:]kspec ble-bind [-m keymap] -fxc@s [TYPE:]kspecs command ble-bind [-m keymap] -T [TYPE:]kspecs timeout +ble-bind [-m keymap] --cursor cursor_code ble-bind [-m keymap]... (-PD|--print|--dump) ble-bind (-L|--list-widgets) @@ -2814,6 +2848,12 @@ TYPE:SPEC keyseq Key sequence in the Readline format raw Raw byte sequence +TIMEOUT + specifies the timeout duration in milliseconds. + +CURSOR_CODE + specifies the cursor shape by the DECSCUSR code. + EOF } @@ -2827,8 +2867,7 @@ function ble-bind/check-argument { return 2 fi } -# -# + function ble-bind/option:csi { local ret key= if [[ $2 ]]; then @@ -2889,11 +2928,11 @@ function ble-bind/option:dump { if (($#)); then local keymap for keymap; do - ble-decode/keymap/dump "$keymap" + ble/decode/keymap#dump "$keymap" done else ble/util/declare-print-definitions "${!_ble_decode_kbd__@}" "${!_ble_decode_cmap_@}" "${!_ble_decode_csimap_@}" - ble-decode/keymap/dump + ble/decode/keymap#dump fi } function ble-bind/option:print { @@ -2901,17 +2940,17 @@ function ble-bind/option:print { ble-decode/INITIALIZE_DEFMAP -v keymap # 初期化を強制する if (($#)); then for keymap; do - ble-decode-key/dump "$keymap" + ble/decode/keymap#print "$keymap" done else ble-decode-char/csi/print ble-decode-char/dump - ble-decode-key/dump + ble/decode/keymap#print fi } function ble-bind { - local kmap=$ble_bind_keymap ret + local kmap=${ble_bind_keymap-} ret local -a keymaps; keymaps=() ble/decode/initialize @@ -2926,6 +2965,11 @@ function ble-bind { ble-bind/check-argument --csi 2 "$#" || return 1 ble-bind/option:csi "$1" "$2" shift 2 ;; + (cursor) + ble-bind/check-argument --cursor 1 $# || return 1 + ble-bind/.initialize-kmap || return 1 # -> kmap + ble/decode/keymap#set-cursor "$kmap" "$1" + shift 1 ;; (list-widgets|list-functions) ble-bind/option:list-widgets ;; (dump) ble-bind/option:dump "${keymaps[@]}" ;; @@ -2957,7 +3001,7 @@ function ble-bind { if (($#<1)); then ble/util/print "ble-bind: the option \`-m' requires an argument." >&2 return 2 - elif ! ble-decode/keymap/is-keymap "$1"; then + elif ! ble/decode/is-keymap "$1"; then ble/util/print "ble-bind: the keymap '$1' is unknown." >&2 return 1 fi @@ -3270,7 +3314,7 @@ function ble/builtin/bind/.initialize-kmap { (*) ble-decode/GET_BASEMAP -v kmap ;; esac - if ! ble-decode/keymap/is-keymap "$kmap"; then + if ! ble/decode/is-keymap "$kmap"; then ble/util/print "ble/builtin/bind: the keymap '$kmap' is unknown." >&2 return 1 fi @@ -3403,7 +3447,7 @@ function ble/builtin/bind/option:u { local rlfunc=$1 local kmap - if ! ble/builtin/bind/.initialize-kmap "$opt_keymap" || ! ble-decode/keymap/load "$kmap"; then + if ! ble/builtin/bind/.initialize-kmap "$opt_keymap" || ! ble/decode/keymap#load "$kmap"; then ble/util/print "ble.sh (bind): sorry, failed to initialize keymap:'$opt_keymap'." >&2 flags=e$flags return 1 @@ -3762,7 +3806,7 @@ function ble/decode/reset-default-keymap { ## _ble_decode_keymap が使用可能な状態になっている必要がある。 function ble/decode/attach { # 失敗すると悲惨なことになるのでチェック - if ble-decode/keymap/is-empty "$_ble_decode_keymap"; then + if ble/decode/keymap#is-empty "$_ble_decode_keymap"; then ble/util/print "ble.sh: The keymap '$_ble_decode_keymap' is empty." >&2 return 1 fi diff --git a/src/edit.sh b/src/edit.sh index 842d0cc3..0eb67e27 100644 --- a/src/edit.sh +++ b/src/edit.sh @@ -3083,7 +3083,7 @@ function ble/widget/yank-pop { ble/edit/yankpop.impl "$arg" _ble_edit_mark_active=insert - ble-decode/keymap/push yankpop + ble/decode/keymap/push yankpop } function ble/widget/yankpop/next { local arg; ble-edit/content/get-arg 1 @@ -3094,7 +3094,7 @@ function ble/widget/yankpop/prev { ble/edit/yankpop.impl $((-arg)) } function ble/widget/yankpop/exit { - ble-decode/keymap/pop + ble/decode/keymap/pop _ble_edit_mark_active= } function ble/widget/yankpop/cancel { @@ -3263,7 +3263,7 @@ function ble/widget/insert-last-argument { local delta=-1 nth=$arg ble/widget/insert-arg.impl "$beg" "$end" "$index" "$delta" "$nth" || return "$?" _ble_edit_mark_active=insert - ble-decode/keymap/push lastarg + ble/decode/keymap/push lastarg } function ble/widget/lastarg/next { local arg; ble-edit/content/get-arg 1 @@ -3282,7 +3282,7 @@ function ble/widget/lastarg/next { ble/widget/insert-arg.impl "$beg" "$end" "$index" "$delta" "$nth" } function ble/widget/lastarg/exit { - ble-decode/keymap/pop + ble/decode/keymap/pop _ble_edit_mark_active= } function ble/widget/lastarg/cancel { @@ -6621,7 +6621,7 @@ function ble/widget/isearch/.restore-mark-state { fi } function ble/widget/isearch/exit.impl { - ble-decode/keymap/pop + ble/decode/keymap/pop _ble_edit_isearch_arr=() _ble_edit_isearch_dir= _ble_edit_isearch_str= @@ -6677,7 +6677,7 @@ function ble/widget/isearch/exit-delete-forward-char { function ble/widget/history-isearch.impl { local opts=$1 ble-edit/content/clear-arg - ble-decode/keymap/push isearch + ble/decode/keymap/push isearch ble/util/fiberchain#initialize ble-edit/isearch local index; ble/history/get-index @@ -6925,7 +6925,7 @@ function ble/widget/history-search { _ble_edit_nsearch_opts= fi _ble_edit_mark_active= - ble-decode/keymap/push nsearch + ble/decode/keymap/push nsearch # start search ble/util/fiberchain#initialize ble-edit/nsearch @@ -6982,7 +6982,7 @@ function ble/widget/nsearch/backward { ble/util/fiberchain#resume } function ble/widget/nsearch/exit { - ble-decode/keymap/pop + ble/decode/keymap/pop _ble_edit_mark_active= ble-edit/nsearch/erase-status } @@ -7305,7 +7305,7 @@ function ble-decode/keymap:safe/define { } function ble-edit/bind/load-editing-mode:safe { - ble-decode/keymap/load safe + ble/decode/keymap#load safe } ble/util/autoload "keymap/emacs.sh" \ @@ -7347,7 +7347,7 @@ function ble/widget/read/accept { _ble_edit_read_result=$_ble_edit_str # [[ $_ble_edit_read_result ]] && # ble/history/add "$_ble_edit_read_result" # Note: cancel でも登録する - ble-decode/keymap/pop + ble/decode/keymap/pop } function ble/widget/read/cancel { local _ble_edit_line_disabled=1 @@ -7463,7 +7463,7 @@ function ble/builtin/read/.read-arguments { function ble/builtin/read/.set-up-textarea { # 初期化 - ble-decode/keymap/push read || return 1 + ble/decode/keymap/push read || return 1 [[ $_ble_edit_read_context == external ]] && _ble_canvas_panel_height[0]=0 @@ -7645,7 +7645,7 @@ function ble/builtin/read/.impl { return 0 fi - ble-decode/keymap/load read + ble/decode/keymap#load read local result _ble_edit_read_context=$_ble_term_state # Note: サブシェル中で重複して出力されない様に空にしておく @@ -8294,7 +8294,7 @@ function ble-decode/INITIALIZE_DEFMAP { local base_keymap=$defmap [[ $defmap == vi ]] && base_keymap=vi_imap builtin eval -- "$2=\$base_keymap" - ble-decode/keymap/is-keymap "$base_keymap" && return 0 + ble/decode/is-keymap "$base_keymap" && return 0 fi # エラーメッセージ @@ -8308,7 +8308,7 @@ function ble-decode/INITIALIZE_DEFMAP { # Fallback keymap "safe" ble-edit/bind/load-editing-mode safe && - ble-decode/keymap/load safe && + ble/decode/keymap#load safe && builtin eval -- "$2=safe" && bleopt_default_keymap=safe } diff --git a/src/util.sh b/src/util.sh index 5f1b82c5..e1918917 100644 --- a/src/util.sh +++ b/src/util.sh @@ -93,6 +93,8 @@ function bleopt { local var=${spec%%=*} value=${spec#*=} [[ ${!var+set} && ${!var} == "$value" ]] && continue if ble/is-function bleopt/check:"${var#bleopt_}"; then + local bleopt_source=${BASH_SOURCE[1]} + local bleopt_lineno=${BASH_LINENO[0]} if ! bleopt/check:"${var#bleopt_}"; then flags=E$flags continue @@ -4503,6 +4505,12 @@ _ble_term_cursor_current=unknown _ble_term_cursor_internal=0 _ble_term_cursor_hidden_current=unknown _ble_term_cursor_hidden_internal=reveal + +# #D1516 今迄にカーソル変更がなく、且つ既定値に戻そうとしている時は +# 何もしない。xterm.js で DECSCUSR(0) がユーザー既定値でない事への +# 対策。外部コマンドがカーソル形状を復元するという事を前提にしている。 +_ble_term_cursor_current=0 + function ble/term/cursor-state/.update { local state=$(($1)) [[ $_ble_term_cursor_current == "$state" ]] && return 0