Skip to content

Commit

Permalink
keymap/vi: update mode names on change of "bleopt keymap_vi_mode_name_*"
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed May 23, 2021
1 parent 9372670 commit 11ac106
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 19 deletions.
70 changes: 53 additions & 17 deletions keymap/vi.sh
Expand Up @@ -371,21 +371,42 @@ bleopt/declare -v keymap_vi_mode_name_visual 'VISUAL'
bleopt/declare -v keymap_vi_mode_name_select 'SELECT'
bleopt/declare -v keymap_vi_mode_name_linewise 'LINE'
bleopt/declare -v keymap_vi_mode_name_blockwise 'BLOCK'
function bleopt/check:keymap_vi_mode_name_insert { ble/keymap:vi/update-mode-name; }
function bleopt/check:keymap_vi_mode_name_replace { ble/keymap:vi/update-mode-name; }
function bleopt/check:keymap_vi_mode_name_vreplace { ble/keymap:vi/update-mode-name; }
function bleopt/check:keymap_vi_mode_name_visual { ble/keymap:vi/update-mode-name; }
function bleopt/check:keymap_vi_mode_name_select { ble/keymap:vi/update-mode-name; }
function bleopt/check:keymap_vi_mode_name_linewise { ble/keymap:vi/update-mode-name; }
function bleopt/check:keymap_vi_mode_name_blockwise { ble/keymap:vi/update-mode-name; }


## @fn ble/keymap:vi/script/get-vi-keymap
## 現在の vi キーマップ名 (vi_?map) を取得します。
## もし現在 vi キーマップにない場合には失敗します。
function ble/keymap:vi/script/get-vi-keymap {
local i=${#_ble_decode_keymap_stack[@]}

keymap=$_ble_decode_keymap
while [[ $keymap != vi_?map || $keymap == emacs ]]; do
((i--)) || return 1
keymap=${_ble_decode_keymap_stack[i]}
done
[[ $keymap == vi_?map ]]
}

## @fn ble/keymap:vi/script/get-mode
## @var[out] mode
function ble/keymap:vi/script/get-mode {
mode=

local kmap=$_ble_decode_keymap
[[ $kmap == auto_complete ]] && kmap=vi_imap
local keymap; ble/keymap:vi/script/get-vi-keymap

# /[iR^R]?/
if [[ $_ble_keymap_vi_single_command || $kmap == vi_imap ]]; then
if [[ $_ble_keymap_vi_single_command || $keymap == vi_imap ]]; then
local overwrite=
if [[ $kmap == vi_imap ]]; then
if [[ $keymap == vi_imap ]]; then
overwrite=$_ble_edit_overwrite_mode
elif [[ $kmap == vi_[noxs]map ]]; then
elif [[ $keymap == vi_[noxs]map ]]; then
overwrite=$_ble_keymap_vi_single_command_overwrite
fi
case $overwrite in
Expand All @@ -396,7 +417,7 @@ function ble/keymap:vi/script/get-mode {
fi

# /[nvV^VsS^S]?/
case $kmap:${_ble_edit_mark_active%+} in
case $keymap:${_ble_edit_mark_active%+} in
(vi_xmap:vi_line) mode=$mode'V' ;;
(vi_xmap:vi_block)mode=$mode$'\x16' ;; # C-v
(vi_xmap:*) mode=$mode'v' ;;
Expand All @@ -410,19 +431,34 @@ function ble/keymap:vi/script/get-mode {
esac
}

_ble_keymap_vi_mode_name_dirty=
function ble/keymap:vi/info_reveal.hook {
[[ $_ble_keymap_vi_mode_name_dirty ]] || return 0
_ble_keymap_vi_mode_name_dirty=
ble/keymap:vi/update-mode-name
}
blehook info_reveal+=ble/keymap:vi/info_reveal.hook

function ble/keymap:vi/update-mode-name {
local kmap=$_ble_decode_keymap cursor=
if [[ $kmap == vi_imap ]]; then
if ! [[ $_ble_attached && $_ble_edit_layout == normal ]]; then
_ble_keymap_vi_mode_name_dirty=1
return 0
fi

local keymap
ble/keymap:vi/script/get-vi-keymap || return 0

if [[ $keymap == vi_imap ]]; then
ble/util/buffer "$bleopt_term_vi_imap"
elif [[ $kmap == vi_nmap ]]; then
elif [[ $keymap == vi_nmap ]]; then
ble/util/buffer "$bleopt_term_vi_nmap"
elif [[ $kmap == vi_xmap ]]; then
elif [[ $keymap == vi_xmap ]]; then
ble/util/buffer "$bleopt_term_vi_xmap"
elif [[ $kmap == vi_smap ]]; then
elif [[ $keymap == vi_smap ]]; then
ble/util/buffer "$bleopt_term_vi_smap"
elif [[ $kmap == vi_omap ]]; then
elif [[ $keymap == vi_omap ]]; then
ble/util/buffer "$bleopt_term_vi_omap"
elif [[ $kmap == vi_cmap ]]; then
elif [[ $keymap == vi_cmap ]]; then
ble/edit/info/default text ''
ble/util/buffer "$bleopt_term_vi_cmap"
return 0
Expand All @@ -435,11 +471,11 @@ function ble/keymap:vi/update-mode-name {
local name=
if [[ $bleopt_keymap_vi_mode_show ]]; then
local show= overwrite=
if [[ $kmap == vi_imap ]]; then
if [[ $keymap == vi_imap ]]; then
show=1 overwrite=$_ble_edit_overwrite_mode
elif [[ $_ble_keymap_vi_single_command && ( $kmap == vi_nmap || $kmap == vi_omap ) ]]; then
elif [[ $_ble_keymap_vi_single_command && ( $keymap == vi_nmap || $keymap == vi_omap ) ]]; then
show=1 overwrite=$_ble_keymap_vi_single_command_overwrite
elif [[ $kmap == vi_[xs]map ]]; then
elif [[ $keymap == vi_[xs]map ]]; then
show=x overwrite=$_ble_keymap_vi_single_command_overwrite
else
name=$bleopt_keymap_vi_mode_string_nmap
Expand All @@ -462,7 +498,7 @@ function ble/keymap:vi/update-mode-name {
if [[ $show == x ]]; then
local mark_type=${_ble_edit_mark_active%+}
local visual_name=$bleopt_keymap_vi_mode_name_visual
[[ $kmap == vi_smap ]] && visual_name=$bleopt_keymap_vi_mode_name_select
[[ $keymap == vi_smap ]] && visual_name=$bleopt_keymap_vi_mode_name_select
if [[ $mark_type == vi_line ]]; then
visual_name=$visual_name' '$bleopt_keymap_vi_mode_name_linewise
elif [[ $mark_type == vi_block ]]; then
Expand Down
5 changes: 3 additions & 2 deletions memo/ChangeLog.md
Expand Up @@ -75,6 +75,7 @@
- complete (`ble-sabbrev`): support colored output `#D1546` 750ca38
- decode (`ble-bind`): support colored output `#D1547` 750ca38
- decode (`ble-bind`): output bindings of the specified keymaps with `ble-bind -m KEYMAP` (fixup 750ca38) `#D1559` 6e0245a
- keymap/vi: update mode names on change of `bleopt keymap_vi_mode_name_*` (motivated by huresche) `#D1565` 0000000

## Fixes

Expand Down Expand Up @@ -105,10 +106,10 @@
- bind: fix errors on readline macros (reported by RakibFiha) `#D1537` c257299
- main: work around sourcing `ble.sh` inside subshells `#D1554` bbc2a90
- main: fix exit status for `bash ble.sh --test` (fixup bbc2a90) `#D1558` 641238a
- main: fix reloading after ble-update (fixup bbc2a90) `#D1558` 0000000
- main: fix reloading after ble-update (fixup bbc2a90) (fixed by oc1024) `#D1558` 9372670
- main: work around `. ble.sh --{test,update,clear-cache}` in intereactive sessions `#D1555` bbc2a90
- Makefile: create `run` directory instead of `tmp` `#D1557` 9bdb37d
- main: fix the workaround for `set -e` `#D1564` 0000000
- main: fix the workaround for `set -e` `#D1564` ab2f70b

## Compatibility

Expand Down
1 change: 1 addition & 0 deletions src/def.sh
Expand Up @@ -52,6 +52,7 @@ blehook/declare PREEXEC
blehook/declare POSTEXEC
blehook/declare widget_bell
blehook/declare textarea_render_defer
blehook/declare info_reveal

# deprecated function
function ble-edit/prompt/print { ble/prompt/print "$@"; }
Expand Down
1 change: 1 addition & 0 deletions src/edit.sh
Expand Up @@ -1342,6 +1342,7 @@ function ble/edit/info/hide {
ble/edit/info/.clear-content
}
function ble/edit/info/reveal {
blehook/invoke info_reveal
if [[ $_ble_edit_info_scene == default ]]; then
ble/edit/info/.render-content "${_ble_edit_info_default[@]}"
fi
Expand Down

0 comments on commit 11ac106

Please sign in to comment.