summaryrefslogtreecommitdiff
path: root/.local/src/blesh/keymap/vi.sh
diff options
context:
space:
mode:
Diffstat (limited to '.local/src/blesh/keymap/vi.sh')
-rw-r--r--.local/src/blesh/keymap/vi.sh6171
1 files changed, 0 insertions, 6171 deletions
diff --git a/.local/src/blesh/keymap/vi.sh b/.local/src/blesh/keymap/vi.sh
deleted file mode 100644
index ccf8b84..0000000
--- a/.local/src/blesh/keymap/vi.sh
+++ /dev/null
@@ -1,6171 +0,0 @@
-# this script is a part of blesh (https://github.com/akinomyoga/ble.sh) under BSD-3-Clause license
-ble/is-function ble-edit/bind/load-editing-mode:vi && return 0
-function ble-edit/bind/load-editing-mode:vi { :; }
-source "$_ble_base/keymap/vi_digraph.sh"
-bleopt/declare -n keymap_vi_macro_depth 64
-function ble/keymap:vi/k2c {
- local key=$1
- local flag=$((key&_ble_decode_MaskFlag)) char=$((key&_ble_decode_MaskChar))
- if ((flag==0&&(32<=char&&char<_ble_decode_FunctionKeyBase))); then
- ret=$char
- return 0
- elif ((flag==_ble_decode_Ctrl&&63<=char&&char<128&&(char&0x1F)!=0)); then
- ((char=char==63?127:char&0x1F))
- ret=$char
- return 0
- else
- return 1
- fi
-}
-function ble/string#index-of-chars {
- local chars=$2 index=${3:-0}
- local text=${1:index}
- local cut=${text%%["$chars"]*}
- if ((${#cut}<${#text})); then
- ((ret=index+${#cut}))
- return 0
- else
- ret=-1
- return 1
- fi
-}
-function ble/string#last-index-of-chars {
- local text=$1 chars=$2 index=$3
- [[ $index ]] && text=${text::index}
- local cut=${text%["$chars"]*}
- if ((${#cut}<${#text})); then
- ((ret=${#cut}))
- return 0
- else
- ret=-1
- return 1
- fi
-}
-function ble-edit/content/nonbol-eolp {
- local pos=${1:-$_ble_edit_ind}
- ! ble-edit/content/bolp "$pos" && ble-edit/content/eolp "$pos"
-}
-function ble/keymap:vi/string#encode-rot13 {
- local text=$1
- local -a buff=() ch
- for ((i=0;i<${#text};i++)); do
- ch=${text:i:1}
- if [[ $ch == [A-Z] ]]; then
- ch=${_ble_util_string_upper_list%%"$ch"*}
- ch=${_ble_util_string_upper_list:(${#ch}+13)%26:1}
- elif [[ $ch == [a-z] ]]; then
- ch=${_ble_util_string_lower_list%%"$ch"*}
- ch=${_ble_util_string_lower_list:(${#ch}+13)%26:1}
- fi
- ble/array#push buff "$ch"
- done
- IFS= builtin eval 'ret="${buff[*]-}"'
-}
-_ble_keymap_vi_REX_WORD=$'[a-zA-Z0-9_]+|[!-/:-@[-`{-~]+|[^ \t\na-zA-Z0-9!-/:-@[-`{-~]+'
-function ble/widget/vi_imap/__default__ {
- local flag=$((KEYS[0]&_ble_decode_MaskFlag)) code=$((KEYS[0]&_ble_decode_MaskChar))
- if ((flag&_ble_decode_Meta)); then
- ble/keymap:vi/imap-repeat/pop
- local esc=27 # ESC
- ble/decode/widget/skip-lastwidget
- ble/decode/widget/redispatch-by-keys "$esc" $((KEYS[0]&~_ble_decode_Meta)) "${KEYS[@]:1}"
- return 0
- fi
- if local ret; ble/keymap:vi/k2c "${KEYS[0]}"; then
- local -a KEYS; KEYS=("$ret")
- ble/widget/self-insert
- return 0
- fi
- return 125
-}
-function ble/widget/vi-command/decompose-meta {
- local flag=$((KEYS[0]&_ble_decode_MaskFlag)) code=$((KEYS[0]&_ble_decode_MaskChar))
- if ((flag&_ble_decode_Meta)); then
- local esc=$((_ble_decode_Ctrl|0x5b)) # C-[ (もしくは esc=27 ESC?)
- ble/decode/widget/skip-lastwidget
- ble/decode/widget/redispatch-by-keys "$esc" $((KEYS[0]&~_ble_decode_Meta)) "${KEYS[@]:1}"
- return 0
- fi
- return 125
-}
-function ble/widget/vi_omap/__default__ {
- ble/widget/vi-command/decompose-meta || ble/widget/vi-command/bell
- return 0
-}
-function ble/widget/vi_omap/cancel {
- ble/keymap:vi/adjust-command-mode
- return 0
-}
-_ble_keymap_vi_irepeat_count=
-_ble_keymap_vi_irepeat=()
-ble/array#push _ble_textarea_local_VARNAMES \
- _ble_keymap_vi_irepeat_count \
- _ble_keymap_vi_irepeat
-function ble/keymap:vi/imap-repeat/pop {
- local top_index=$((${#_ble_keymap_vi_irepeat[*]}-1))
- ((top_index>=0)) && builtin unset -v '_ble_keymap_vi_irepeat[top_index]'
-}
-function ble/keymap:vi/imap-repeat/push {
- local IFS=$_ble_term_IFS
- ble/array#push _ble_keymap_vi_irepeat "${KEYS[*]-}:$WIDGET"
-}
-function ble/keymap:vi/imap-repeat/reset {
- local count=${1-}
- _ble_keymap_vi_irepeat_count=
- _ble_keymap_vi_irepeat=()
- ((count>1)) && _ble_keymap_vi_irepeat_count=$count
-}
-function ble/keymap:vi/imap-repeat/process {
- if ((_ble_keymap_vi_irepeat_count>1)); then
- local repeat=$_ble_keymap_vi_irepeat_count
- local -a widgets; widgets=("${_ble_keymap_vi_irepeat[@]}")
- local i widget
- for ((i=1;i<repeat;i++)); do
- for widget in "${widgets[@]}"; do
- ble/decode/widget/call "${widget#*:}" ${widget%%:*}
- done
- done
- fi
-}
-function ble/keymap:vi/imap/invoke-widget {
- local WIDGET=$1
- local -a KEYS; KEYS=("${@:2}")
- ble/keymap:vi/imap-repeat/push
- builtin eval -- "$WIDGET"
-}
-_ble_keymap_vi_imap_white_list=(
- self-insert
- batch-insert
- nop
- magic-space
- delete-backward-{c,f,s,u}word
- copy{,-forward,-backward}-{c,f,s,u}word
- copy-region{,-or}
- clear-screen
- command-help
- display-shell-version
- redraw-line
-)
-function ble/keymap:vi/imap/is-command-white {
- if [[ $1 == ble/widget/self-insert ]]; then
- return 0
- elif [[ $1 == ble/widget/* ]]; then
- local IFS=$_ble_term_IFS
- local cmd=${1#ble/widget/}; cmd=${cmd%%["$_ble_term_IFS"]*}
- [[ $cmd == vi_imap/* || " ${_ble_keymap_vi_imap_white_list[*]} " == *" $cmd "* ]] && return 0
- fi
- return 1
-}
-function ble/widget/vi_imap/__before_widget__ {
- if ble/keymap:vi/imap/is-command-white "$WIDGET"; then
- ble/keymap:vi/imap-repeat/push
- else
- if ((_ble_keymap_vi_mark_edit_dbeg>=0)); then
- ble/keymap:vi/mark/end-edit-area
- ble/keymap:vi/repeat/record-insert
- ble/keymap:vi/mark/start-edit-area
- fi
- ble/keymap:vi/imap-repeat/reset
- fi
-}
-function ble/widget/vi_imap/complete {
- ble/keymap:vi/imap-repeat/pop
- ble/keymap:vi/undo/add more
- ble/widget/complete "$@"
-}
-function ble/keymap:vi/complete/insert.hook {
- [[ $_ble_decode_keymap == vi_imap ||
- $_ble_decode_keymap == auto_complete ]] || return 1
- local original=${comp_text:insert_beg:insert_end-insert_beg}
- local q="'" Q="'\''"
- local WIDGET="ble/widget/complete-insert '${original//$q/$Q}' '${insert//$q/$Q}' '${suffix//$q/$Q}'"
- ble/keymap:vi/imap-repeat/push
- [[ $_ble_decode_keymap == vi_imap ]] &&
- ble/keymap:vi/undo/add more
-}
-blehook complete_insert+=ble/keymap:vi/complete/insert.hook
-function ble-decode/keymap:vi_imap/bind-complete {
- ble-bind -f 'C-i' 'vi_imap/complete'
- ble-bind -f 'TAB' 'vi_imap/complete'
- ble-bind -f 'C-TAB' 'menu-complete'
- ble-bind -f 'S-C-i' 'menu-complete backward'
- ble-bind -f 'S-TAB' 'menu-complete backward'
- ble-bind -f 'auto_complete_enter' 'auto-complete-enter'
- ble-bind -f 'C-x /' 'menu-complete context=filename'
- ble-bind -f 'C-x ~' 'menu-complete context=username'
- ble-bind -f 'C-x $' 'menu-complete context=variable'
- ble-bind -f 'C-x @' 'menu-complete context=hostname'
- ble-bind -f 'C-x !' 'menu-complete context=command'
- ble-bind -f 'C-]' 'sabbrev-expand'
- ble-bind -f 'C-x C-r' 'dabbrev-expand'
- ble-bind -f 'C-x *' 'complete insert_all:context=glob'
- ble-bind -f 'C-x g' 'complete show_menu:context=glob'
-}
-_ble_keymap_vi_insert_overwrite=
-_ble_keymap_vi_insert_leave=
-_ble_keymap_vi_single_command=
-_ble_keymap_vi_single_command_overwrite=
-ble/array#push _ble_textarea_local_VARNAMES \
- _ble_keymap_vi_insert_overwrite \
- _ble_keymap_vi_insert_leave \
- _ble_keymap_vi_single_command \
- _ble_keymap_vi_single_command_overwrite
-bleopt/declare -n keymap_vi_mode_string_nmap $'\e[1m~\e[m'
-bleopt/declare -o keymap_vi_nmap_name keymap_vi_mode_string_nmap
-bleopt/declare -v term_vi_imap ''
-bleopt/declare -v term_vi_nmap ''
-bleopt/declare -v term_vi_omap ''
-bleopt/declare -v term_vi_xmap ''
-bleopt/declare -v term_vi_smap ''
-bleopt/declare -v term_vi_cmap ''
-bleopt/declare -v keymap_vi_imap_cursor ''
-bleopt/declare -v keymap_vi_nmap_cursor ''
-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 {
- local bleopt_keymap_vi_mode_show=$value
- [[ $_ble_attached ]] &&
- ble/keymap:vi/update-mode-name
- return 0
-}
-bleopt/declare -v keymap_vi_mode_update_prompt ''
-bleopt/declare -v keymap_vi_mode_name_insert 'INSERT'
-bleopt/declare -v keymap_vi_mode_name_replace 'REPLACE'
-bleopt/declare -v keymap_vi_mode_name_vreplace 'VREPLACE'
-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; }
-function ble/keymap:vi/script/get-vi-keymap {
- ble/prompt/unit/add-hash '$_ble_decode_keymap,${_ble_decode_keymap_stack[*]}'
- 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 ]]
-}
-function ble/keymap:vi/script/get-mode {
- ble/prompt/unit/add-hash '$_ble_decode_keymap,${_ble_decode_keymap_stack[*]}'
- ble/prompt/unit/add-hash '$_ble_keymap_vi_single_command,$_ble_edit_mark_active'
- mode=
- local keymap; ble/keymap:vi/script/get-vi-keymap
- if [[ $_ble_keymap_vi_single_command || $keymap == vi_imap ]]; then
- local overwrite=
- if [[ $keymap == vi_imap ]]; then
- overwrite=$_ble_edit_overwrite_mode
- elif [[ $keymap == vi_[noxs]map ]]; then
- overwrite=$_ble_keymap_vi_single_command_overwrite
- fi
- case $overwrite in
- ('') mode=i ;;
- (R) mode=R ;;
- (*) mode=$'\x12' ;; # C-r
- esac
- fi
- 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' ;;
- (vi_smap:vi_line) mode=$mode'S' ;;
- (vi_smap:vi_block)mode=$mode$'\x13' ;; # C-s
- (vi_smap:*) mode=$mode's' ;;
- (vi_[no]map:*) mode=$mode'n' ;;
- (vi_cmap:*) mode=$mode'c' ;;
- (vi_imap:*) ;;
- (*:*) mode=$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 {
- if [[ ! $_ble_attached ]] || ble/edit/is-command-layout; 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 [[ $keymap == vi_nmap ]]; then
- ble/util/buffer "$bleopt_term_vi_nmap"
- elif [[ $keymap == vi_xmap ]]; then
- ble/util/buffer "$bleopt_term_vi_xmap"
- elif [[ $keymap == vi_smap ]]; then
- ble/util/buffer "$bleopt_term_vi_smap"
- elif [[ $keymap == vi_omap ]]; then
- ble/util/buffer "$bleopt_term_vi_omap"
- elif [[ $keymap == vi_cmap ]]; then
- ble/edit/info/default text ''
- ble/util/buffer "$bleopt_term_vi_cmap"
- return 0
- fi
- [[ $bleopt_keymap_vi_mode_update_prompt ]] && ble/prompt/clear
- local name=
- if [[ $bleopt_keymap_vi_mode_show ]]; then
- local show= overwrite=
- if [[ $keymap == vi_imap ]]; then
- show=1 overwrite=$_ble_edit_overwrite_mode
- elif [[ $_ble_keymap_vi_single_command && ( $keymap == vi_nmap || $keymap == vi_omap ) ]]; then
- show=1 overwrite=$_ble_keymap_vi_single_command_overwrite
- elif [[ $keymap == vi_[xs]map ]]; then
- show=x overwrite=$_ble_keymap_vi_single_command_overwrite
- else
- name=$bleopt_keymap_vi_mode_string_nmap
- fi
- fi
- if [[ $show ]]; then
- if [[ $overwrite == R ]]; then
- name=$bleopt_keymap_vi_mode_name_replace
- elif [[ $overwrite ]]; then
- name=$bleopt_keymap_vi_mode_name_vreplace
- else
- name=$bleopt_keymap_vi_mode_name_insert
- fi
- if [[ $_ble_keymap_vi_single_command ]]; then
- local ret; ble/string#tolower "$name"; name="($ret)"
- fi
- if [[ $show == x ]]; then
- local mark_type=${_ble_edit_mark_active%+}
- local visual_name=$bleopt_keymap_vi_mode_name_visual
- [[ $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
- visual_name=$visual_name' '$bleopt_keymap_vi_mode_name_blockwise
- fi
- if [[ $_ble_keymap_vi_single_command ]]; then
- name="$name $visual_name"
- else
- name=$visual_name
- fi
- fi
- name=$'\e[1m-- '$name$' --\e[m'
- fi
- if [[ $_ble_keymap_vi_reg_record ]]; then
- name=$name${name:+' '}$'\e[1;31mREC @'$_ble_keymap_vi_reg_record_char$'\e[m'
- elif [[ $_ble_edit_kbdmacro_record ]]; then
- name=$name${name:+' '}$'\e[1;31mREC\e[m'
- fi
- ble/edit/info/default ansi "$name" # 6ms
-}
-function ble/widget/vi_imap/normal-mode.impl {
- local opts=$1
- ble/keymap:vi/mark/set-local-mark 94 "$_ble_edit_ind" # `^
- ble/keymap:vi/mark/end-edit-area
- [[ :$opts: == *:InsertLeave:* ]] && builtin eval -- "$_ble_keymap_vi_insert_leave"
- _ble_edit_mark_active=
- _ble_edit_overwrite_mode=
- _ble_keymap_vi_insert_leave=
- _ble_keymap_vi_single_command=
- _ble_keymap_vi_single_command_overwrite=
- ble-edit/content/bolp || ((_ble_edit_ind--))
- ble/decode/keymap/push vi_nmap
-}
-function ble/widget/vi_imap/normal-mode {
- ble-edit/content/clear-arg
- ble/keymap:vi/imap-repeat/pop
- ble/keymap:vi/imap-repeat/process
- ble/keymap:vi/repeat/record-insert
- ble/widget/vi_imap/normal-mode.impl InsertLeave
- ble/keymap:vi/update-mode-name
- return 0
-}
-function ble/widget/vi_imap/normal-mode-without-insert-leave {
- ble-edit/content/clear-arg
- ble/keymap:vi/imap-repeat/pop
- ble/keymap:vi/repeat/record-insert
- ble/widget/vi_imap/normal-mode.impl
- ble/keymap:vi/update-mode-name
- return 0
-}
-function ble/widget/vi_imap/single-command-mode {
- ble-edit/content/clear-arg
- local single_command=1
- local single_command_overwrite=$_ble_edit_overwrite_mode
- ble-edit/content/eolp && _ble_keymap_vi_single_command=2
- ble/keymap:vi/imap-repeat/pop
- ble/widget/vi_imap/normal-mode.impl
- _ble_keymap_vi_single_command=$single_command
- _ble_keymap_vi_single_command_overwrite=$single_command_overwrite
- ble/keymap:vi/update-mode-name
- return 0
-}
-function ble/keymap:vi/needs-eol-fix {
- [[ $_ble_decode_keymap == vi_nmap || $_ble_decode_keymap == vi_omap ]] || return 1
- [[ $_ble_keymap_vi_single_command ]] && return 1
- local index=${1:-$_ble_edit_ind}
- ble-edit/content/nonbol-eolp "$index"
-}
-function ble/keymap:vi/adjust-command-mode {
- if [[ $_ble_decode_keymap == vi_[xs]map ]]; then
- ble/keymap:vi/xmap/remove-eol-extension
- fi
- local kmap_popped=
- if [[ $_ble_decode_keymap == vi_omap ]]; then
- ble/decode/keymap/pop
- kmap_popped=1
- fi
- if [[ $_ble_keymap_vi_search_activate ]]; then
- if [[ $_ble_decode_keymap != vi_[xs]map ]]; then
- _ble_edit_mark_active=$_ble_keymap_vi_search_activate
- fi
- _ble_keymap_vi_search_matched=1
- _ble_keymap_vi_search_activate=
- else
- [[ $_ble_edit_mark_active == vi_search ]] && _ble_edit_mark_active=
- ((_ble_keymap_vi_search_matched)) && _ble_keymap_vi_search_matched=
- fi
- if [[ $_ble_decode_keymap == vi_nmap && $_ble_keymap_vi_single_command ]]; then
- if ((_ble_keymap_vi_single_command==2)); then
- local index=$((_ble_edit_ind+1))
- ble-edit/content/nonbol-eolp "$index" && _ble_edit_ind=$index
- fi
- ble/widget/vi_nmap/.insert-mode 1 "$_ble_keymap_vi_single_command_overwrite" resume
- ble/keymap:vi/repeat/clear-insert
- elif [[ $kmap_popped ]]; then
- ble/keymap:vi/update-mode-name
- fi
- return 0
-}
-function ble/widget/vi-command/bell {
- ble/widget/.bell "$1"
- ble/keymap:vi/adjust-command-mode
- return 0
-}
-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
- local arg=$1 overwrite=$2
- ble/keymap:vi/imap-repeat/reset "$arg"
- _ble_edit_mark_active=
- _ble_edit_overwrite_mode=$overwrite
- _ble_keymap_vi_insert_leave=
- _ble_keymap_vi_insert_overwrite=$overwrite
- _ble_keymap_vi_single_command=
- _ble_keymap_vi_single_command_overwrite=
- ble/keymap:vi/search/clear-matched
- ble/decode/keymap/pop
- ble/keymap:vi/update-mode-name
- ble/keymap:vi/mark/start-edit-area
- if [[ :$opts: != *:resume:* ]]; then
- ble/keymap:vi/mark/commit-edit-area "$_ble_edit_ind" "$_ble_edit_ind"
- fi
-}
-function ble/widget/vi_nmap/insert-mode {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi_nmap/.insert-mode "$ARG"
- ble/keymap:vi/repeat/record
- return 0
-}
-function ble/widget/vi_nmap/append-mode {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- if ! ble-edit/content/eolp; then
- ((_ble_edit_ind++))
- fi
- ble/widget/vi_nmap/.insert-mode "$ARG"
- ble/keymap:vi/repeat/record
- return 0
-}
-function ble/widget/vi_nmap/append-mode-at-end-of-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret; ble-edit/content/find-logical-eol
- _ble_edit_ind=$ret
- ble/widget/vi_nmap/.insert-mode "$ARG"
- ble/keymap:vi/repeat/record
- return 0
-}
-function ble/widget/vi_nmap/insert-mode-at-beginning-of-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret; ble-edit/content/find-logical-bol
- _ble_edit_ind=$ret
- ble/widget/vi_nmap/.insert-mode "$ARG"
- ble/keymap:vi/repeat/record
- return 0
-}
-function ble/widget/vi_nmap/insert-mode-at-first-non-space {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/first-non-space
- [[ ${_ble_edit_str:_ble_edit_ind:1} == [$' \t'] ]] &&
- ((_ble_edit_ind++)) # 逆eol補正
- ble/widget/vi_nmap/.insert-mode "$ARG"
- ble/keymap:vi/repeat/record
- return 0
-}
-function ble/widget/vi_nmap/insert-mode-at-previous-point {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret
- ble/keymap:vi/mark/get-local-mark 94 && _ble_edit_ind=$ret
- ble/widget/vi_nmap/.insert-mode "$ARG"
- ble/keymap:vi/repeat/record
- return 0
-}
-function ble/widget/vi_nmap/replace-mode {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi_nmap/.insert-mode "$ARG" R
- ble/keymap:vi/repeat/record
- return 0
-}
-function ble/widget/vi_nmap/virtual-replace-mode {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi_nmap/.insert-mode "$ARG" 1
- ble/keymap:vi/repeat/record
- return 0
-}
-function ble/widget/vi_nmap/accept-line {
- ble/keymap:vi/clear-arg
- ble/widget/vi_nmap/.insert-mode
- ble/keymap:vi/repeat/clear-insert
- [[ $_ble_keymap_vi_reg_record ]] &&
- ble/widget/vi_nmap/record-register
- ble/widget/default/accept-line
-}
-function ble/widget/vi-command/edit-and-execute-command {
- ble/keymap:vi/clear-arg
- ble/widget/vi_nmap/.insert-mode
- ble/keymap:vi/repeat/clear-insert
- [[ $_ble_keymap_vi_reg_record ]] &&
- ble/widget/vi_nmap/record-register
- ble/widget/edit-and-execute-command
-}
-_ble_keymap_vi_oparg=
-_ble_keymap_vi_opfunc=
-_ble_keymap_vi_reg=
-ble/array#push _ble_textarea_local_VARNAMES \
- _ble_keymap_vi_oparg \
- _ble_keymap_vi_opfunc \
- _ble_keymap_vi_reg
-_ble_keymap_vi_register=()
-_ble_keymap_vi_register_onplay=
-function ble/keymap:vi/clear-arg {
- _ble_edit_arg=
- _ble_keymap_vi_oparg=
- _ble_keymap_vi_opfunc=
- _ble_keymap_vi_reg=
-}
-function ble/keymap:vi/get-arg {
- local default_value=$1
- REG=$_ble_keymap_vi_reg
- FLAG=$_ble_keymap_vi_opfunc
- if [[ ! $_ble_edit_arg && ! $_ble_keymap_vi_oparg ]]; then
- ARG=$default_value
- else
- ARG=$((10#0${_ble_edit_arg:-1}*10#0${_ble_keymap_vi_oparg:-1}))
- fi
- ble/keymap:vi/clear-arg
-}
-function ble/keymap:vi/register#load {
- local reg=$1
- if [[ $reg ]] && ((reg!=34)); then
- if [[ $reg == 37 ]]; then # "%
- ble-edit/content/push-kill-ring "$HISTFILE" ''
- return 0
- fi
- local value=${_ble_keymap_vi_register[reg]}
- if [[ $value == */* ]]; then
- ble-edit/content/push-kill-ring "${value#*/}" "${value%%/*}"
- return 0
- else
- ble-edit/content/push-kill-ring
- return 1
- fi
- fi
-}
-function ble/keymap:vi/register#set {
- local reg=$1 type=$2 content=$3
- if [[ $reg == +* ]]; then
- local value=${_ble_keymap_vi_register[reg]}
- if [[ $value == */* ]]; then
- local otype=${value%%/*}
- local oring=${value#*/}
- if [[ $otype == L ]]; then
- if [[ $type == q ]]; then
- type=L content=${oring%$'\n'}$content # V + * → V
- else
- type=L content=$oring$content # V + * → V
- fi
- elif [[ $type == L ]]; then
- type=L content=$oring$'\n'$content # C-v + V, v + V → V
- elif [[ $otype == B:* ]]; then
- if [[ $type == B:* ]]; then
- type=$otype' '${type#B:}
- content=$oring$'\n'$content # C-v + C-v → C-v
- elif [[ $type == q ]]; then
- local ret; ble/string#count-char "$content" $'\n'
- ble/string#repeat ' 0' "$ret"
- type=$otype$ret
- content=$oring$$content # C-v + q → C-v
- else
- local ret; ble/string#count-char "$content" $'\n'
- ble/string#repeat ' 0' $((ret+1))
- type=$otype$ret
- content=$oring$'\n'$content # C-v + v → C-v
- fi
- else
- type= content=$oring$content # v + C-v, v + v, v + q → v
- fi
- fi
- fi
- [[ $type == L && $content != *$'\n' ]] && content=$content$'\n'
- local suppress_default=
- [[ $type == q ]] && type= suppress_default=1
- if [[ ! $reg ]] || ((reg==34)); then # ""
- ble-edit/content/push-kill-ring "$content" "$type"
- return 0
- elif ((reg==58||reg==46||reg==37||reg==126)); then # ": ". "% "~
- ble/widget/.bell "attempted to write on a read-only register #$reg"
- return 1
- elif ((reg==95)); then # "_
- return 0
- else
- if [[ ! $suppress_default ]]; then
- ble-edit/content/push-kill-ring "$content" "$type"
- fi
- _ble_keymap_vi_register[reg]=$type/$content
- return 0
- fi
-}
-function ble/keymap:vi/register#set-yank {
- ble/keymap:vi/register#set "$@" || return 1
- local reg=$1 type=$2 content=$3
- if [[ $reg == '' || $reg == 34 ]]; then
- ble/keymap:vi/register#set 48 "$type" "$content" # "0
- fi
-}
-_ble_keymap_vi_register_49_widget_list=(
- ble/widget/vi-command/search-matchpair-or
- ble/widget/vi-command/percentage-line
- ble/widget/vi-command/goto-mark
- ble/widget/vi-command/search-forward
- ble/widget/vi-command/search-backward
- ble/widget/vi-command/search-repeat
- ble/widget/vi-command/search-reverse-repeat
-)
-function ble/keymap:vi/register#set-edit {
- ble/keymap:vi/register#set "$@" || return 1
- local reg=$1 type=$2 content=$3
- if [[ $reg == '' || $reg == 34 ]]; then
- local IFS=$_ble_term_IFS
- local widget=${WIDGET%%["$_ble_term_IFS"]*}
- if [[ $content == *$'\n'* || " $widget " == " ${_ble_keymap_vi_register_49_widget_list[*]} " ]]; then
- local n
- for ((n=9;n>=2;n--)); do
- _ble_keymap_vi_register[48+n]=${_ble_keymap_vi_register[48+n-1]}
- done
- ble/keymap:vi/register#set 49 "$type" "$content" # "1
- else
- ble/keymap:vi/register#set 45 "$type" "$content" # "-
- fi
- fi
-}
-function ble/keymap:vi/register#play {
- local reg=$1 value
- if [[ $reg ]] && ((reg!=34)); then
- value=${_ble_keymap_vi_register[reg]}
- if [[ $value == */* ]]; then
- value=${value#*/}
- else
- value=
- return 1
- fi
- else
- value=$_ble_edit_kill_ring
- fi
- local _ble_keymap_vi_register_onplay=1
- local ret; ble/decode/charlog#decode "$value"
- ble/widget/.MACRO "${ret[@]}"
- return 0
-}
-function ble/keymap:vi/register#dump/escape {
- local text=$1
- local out= i=0 iN=${#text}
- while ((i<iN)); do
- local tail=${text:i}
- if ble/util/isprint+ "$tail"; then
- out=$out$BASH_REMATCH
- ((i+=${#BASH_REMATCH}))
- else
- ble/util/s2c "$tail"
- local code=$ret
- if ((code<32)); then
- ble/util/c2s $((code+64))
- out=$out$_ble_term_rev^$ret$_ble_term_sgr0
- elif ((code==127)); then
- out=$out$_ble_term_rev^?$_ble_term_sgr0
- elif ((128<=code&&code<160)); then
- ble/util/c2s $((code-64))
- out=$out${_ble_term_rev}M-^$ret$_ble_term_sgr0
- else
- out=$out${tail::1}
- fi
- ((i++))
- fi
- done
- ret=$out
-}
-function ble/keymap:vi/register#dump {
- local k ret out=
- local value type content
- for k in 34 "${!_ble_keymap_vi_register[@]}"; do
- if ((k==34)); then
- type=$_ble_edit_kill_type
- content=$_ble_edit_kill_ring
- else
- value=${_ble_keymap_vi_register[k]}
- type=${value%%/*} content=${value#*/}
- fi
- ble/util/c2s "$k"; k=$ret
- case $type in
- (L) type=line ;;
- (B:*) type=block ;;
- (*) type=char ;;
- esac
- ble/keymap:vi/register#dump/escape "$content"; content=$ret
- out=$out'"'$k' ('$type') '$content$'\n'
- done
- ble/edit/info/show ansi "$out"
- return 0
-}
-function ble/widget/vi-command:reg { ble/keymap:vi/register#dump; }
-function ble/widget/vi-command:regi { ble/keymap:vi/register#dump; }
-function ble/widget/vi-command:regis { ble/keymap:vi/register#dump; }
-function ble/widget/vi-command:regist { ble/keymap:vi/register#dump; }
-function ble/widget/vi-command:registe { ble/keymap:vi/register#dump; }
-function ble/widget/vi-command:register { ble/keymap:vi/register#dump; }
-function ble/widget/vi-command:registers { ble/keymap:vi/register#dump; }
-function ble/widget/vi-command/append-arg {
- local ret ch=$1
- if [[ ! $ch ]]; then
- local n=${#KEYS[@]}
- local code=$((KEYS[n?n-1:0]&_ble_decode_MaskChar))
- ((code==0)) && return 1
- ble/util/c2s "$code"; ch=$ret
- fi
- ble/util/assert '[[ ! ${ch//[0-9]} ]]'
- if [[ $ch == 0 && ! $_ble_edit_arg ]]; then
- ble/widget/vi-command/beginning-of-line
- return "$?"
- fi
- _ble_edit_arg="$_ble_edit_arg$ch"
- return 0
-}
-function ble/widget/vi-command/register {
- _ble_decode_key__hook="ble/widget/vi-command/register.hook"
-}
-function ble/widget/vi-command/register.hook {
- local key=$1
- ble/keymap:vi/clear-arg
- local ret
- if ble/keymap:vi/k2c "$key" && local c=$ret; then
- if ((65<=c&&c<91)); then # A-Z
- _ble_keymap_vi_reg=+$((c+32))
- return 0
- elif ((97<=c&&c<123||48<=c&&c<58||c==45||c==58||c==46||c==37||c==35||c==61||c==42||c==43||c==126||c==95||c==47)); then # a-z 0-9 - : . % # = * + ~ _ /
- _ble_keymap_vi_reg=$c
- return 0
- elif ((c==34)); then # ""
- _ble_keymap_vi_reg=$c
- return 0
- fi
- fi
- ble/widget/vi-command/bell
- return 1
-}
-_ble_keymap_vi_reg_record=
-_ble_keymap_vi_reg_record_char=
-_ble_keymap_vi_reg_record_play=0
-ble/array#push _ble_textarea_local_VARNAMES \
- _ble_keymap_vi_reg_record \
- _ble_keymap_vi_reg_record_char \
- _ble_keymap_vi_reg_record_play
-function ble/widget/vi_nmap/record-register {
- if [[ $_ble_keymap_vi_register_onplay ]]; then
- ble/keymap:vi/clear-arg
- ble/keymap:vi/adjust-command-mode
- return 0
- fi
- if [[ $_ble_keymap_vi_reg_record ]]; then
- ble/keymap:vi/clear-arg
- local -a ret
- ble/decode/charlog#end-exclusive-depth1
- ble/decode/charlog#encode "${ret[@]}"
- ble/keymap:vi/register#set "$_ble_keymap_vi_reg_record" q "$ret"
- _ble_keymap_vi_reg_record=
- ble/keymap:vi/update-mode-name
- else
- _ble_decode_key__hook="ble/widget/vi_nmap/record-register.hook"
- fi
-}
-function ble/widget/vi_nmap/record-register.hook {
- local key=$1 ret
- ble/keymap:vi/clear-arg
- local reg= c=
- if ble/keymap:vi/k2c "$key" && c=$ret; then
- if ((65<=c&&c<91)); then # q{A-Z}
- reg=+$((c+32))
- elif ((48<=c&&c<58||97<=c&&c<123)); then # q{0-9a-z}
- reg=$c
- elif ((c==34)); then # q"
- reg=$c
- fi
- fi
- if [[ ! $reg ]]; then
- ble/widget/vi-command/bell "invalid register key=$key"
- return 1
- fi
- if ! ble/decode/charlog#start vi-macro; then
- ble/widget/.bell 'vi-macro: the logging system is currently busy'
- return 1
- fi
- ble/util/c2s "$c"
- _ble_keymap_vi_reg_record=$reg
- _ble_keymap_vi_reg_record_char=$ret
- ble/keymap:vi/update-mode-name
- return 0
-}
-function ble/widget/vi_nmap/play-register {
- _ble_decode_key__hook="ble/widget/vi_nmap/play-register.hook"
-}
-function ble/widget/vi_nmap/play-register.hook {
- ble/keymap:vi/clear-arg
- local depth=$_ble_keymap_vi_reg_record_play
- if ((depth>=bleopt_keymap_vi_macro_depth)) || ble/util/is-stdin-ready; then
- return 1 # 無限ループを防ぐため
- fi
- local _ble_keymap_vi_reg_record_play=$((depth+1))
- local key=$1
- local ret
- if ble/keymap:vi/k2c "$key" && local c=$ret; then
- ((65<=c&&c<91)) && ((c+=32)) # A-Z -> a-z
- if ((48<=c&&c<58||97<=c&&c<123)); then # 0-9a-z
- ble/keymap:vi/register#play "$c" && return 0
- fi
- fi
- ble/widget/vi-command/bell
- return 1
-}
-function ble/widget/vi-command/operator {
- local ret opname=$1
- if [[ $_ble_decode_keymap == vi_[xs]map ]]; then
- local ARG FLAG REG; ble/keymap:vi/get-arg ''
- local a=$_ble_edit_ind b=$_ble_edit_mark
- ((a<=b||(a=_ble_edit_mark,b=_ble_edit_ind)))
- ble/widget/vi_xmap/.save-visual-state
- local ble_keymap_vi_mark_active=$_ble_edit_mark_active # used in call-operator-blockwise
- local mark_type=${_ble_edit_mark_active%+}
- ble/widget/vi_xmap/exit
- local ble_keymap_vi_opmode=$mark_type
- if [[ $mark_type == vi_line ]]; then
- ble/keymap:vi/call-operator-linewise "$opname" "$a" "$b" "$ARG" "$REG"
- elif [[ $mark_type == vi_block ]]; then
- ble/keymap:vi/call-operator-blockwise "$opname" "$a" "$b" "$ARG" "$REG"
- else
- local end=$b
- ((end<${#_ble_edit_str}&&end++))
- ble/keymap:vi/call-operator-charwise "$opname" "$a" "$end" "$ARG" "$REG"
- fi; local ext=$?
- ((ext==147)) && return 147
- ((ext)) && ble/widget/.bell
- ble/keymap:vi/adjust-command-mode
- return "$ext"
- elif [[ $_ble_decode_keymap == vi_nmap ]]; then
- ble/decode/keymap/push vi_omap
- _ble_keymap_vi_oparg=$_ble_edit_arg
- _ble_keymap_vi_opfunc=$opname
- _ble_edit_arg=
- ble/keymap:vi/update-mode-name
- elif [[ $_ble_decode_keymap == vi_omap ]]; then
- local opname1=${_ble_keymap_vi_opfunc%%:*}
- if [[ $opname == "$opname1" ]]; then
- ble/widget/vi_nmap/linewise-operator "$_ble_keymap_vi_opfunc"
- else
- ble/keymap:vi/clear-arg
- ble/widget/vi-command/bell
- return 1
- fi
- fi
- return 0
-}
-function ble/widget/vi_nmap/linewise-operator {
- local opname=${1%%:*} opflags=${1#*:}
- local ARG FLAG REG; ble/keymap:vi/get-arg 1 # _ble_edit_arg is consumed here
- if ((ARG==1)) || [[ ${_ble_edit_str:_ble_edit_ind} == *$'\n'* ]]; then
- if [[ :$opflags: == *:vi_char:* || :$opflags: == *:vi_block:* ]]; then
- local beg=$_ble_edit_ind
- local ret; ble-edit/content/find-logical-bol "$beg" $((ARG-1)); local end=$ret
- ((beg<=end)) || local beg=$end end=$beg
- if [[ :$opflags: == *:vi_block:* ]]; then
- ble/keymap:vi/call-operator-blockwise "$opname" "$beg" "$end" '' "$REG"
- else
- ble/keymap:vi/call-operator-charwise "$opname" "$beg" "$end" '' "$REG"
- fi
- else
- ble/keymap:vi/call-operator-linewise "$opname" "$_ble_edit_ind" "$_ble_edit_ind:$((ARG-1))" '' "$REG"; local ext=$?
- fi
- if ((ext==0)); then
- ble/keymap:vi/adjust-command-mode
- return 0
- elif ((ext==147)); then
- return 147
- fi
- fi
- ble/widget/vi-command/bell
- return 1
-}
-function ble/widget/vi_nmap/copy-current-line {
- ble/widget/vi_nmap/linewise-operator y
-}
-function ble/widget/vi_nmap/kill-current-line {
- ble/widget/vi_nmap/linewise-operator d
-}
-function ble/widget/vi_nmap/kill-current-line-and-insert {
- ble/widget/vi_nmap/linewise-operator c
-}
-function ble/widget/vi-command/beginning-of-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret; ble-edit/content/find-logical-bol; local beg=$ret
- ble/widget/vi-command/exclusive-goto.impl "$beg" "$FLAG" "$REG" nobell
-}
-function ble/keymap:vi/call-operator {
- ble/keymap:vi/mark/start-edit-area
- local _ble_keymap_vi_mark_suppress_edit=1
- ble/keymap:vi/operator:"$@"; local ext=$?
- ble/util/unlocal _ble_keymap_vi_mark_suppress_edit
- ble/keymap:vi/mark/end-edit-area
- if ((ext==0)); then
- if ble/is-function ble/keymap:vi/operator:"$1".record; then
- ble/keymap:vi/operator:"$1".record
- else
- ble/keymap:vi/repeat/record
- fi
- fi
- return "$ext"
-}
-function ble/keymap:vi/call-operator-charwise {
- local ch=$1 beg=$2 end=$3 arg=$4 reg=$5
- ((beg<=end||(beg=$3,end=$2)))
- if ble/is-function ble/keymap:vi/operator:"$ch"; then
- local ble_keymap_vi_operator_index=
- ble/keymap:vi/call-operator "$ch" "$beg" "$end" char "$arg" "$reg"; local ext=$?
- ((ext==147)) && return 147
- local index=${ble_keymap_vi_operator_index:-$beg}
- ble/keymap:vi/needs-eol-fix "$index" && ((index--))
- _ble_edit_ind=$index
- return 0
- else
- return 1
- fi
-}
-function ble/keymap:vi/call-operator-linewise {
- local ch=$1 a=$2 b=$3 arg=$4 reg=$5 ia=0 ib=0
- [[ $a == *:* ]] && local a=${a%%:*} ia=${a#*:}
- [[ $b == *:* ]] && local b=${b%%:*} ib=${b#*:}
- local ret
- ble-edit/content/find-logical-bol "$a" "$ia"; local beg=$ret
- ble-edit/content/find-logical-eol "$b" "$ib"; local end=$ret
- if ble/is-function ble/keymap:vi/operator:"$ch"; then
- local ble_keymap_vi_operator_index=
- ((end<${#_ble_edit_str}&&end++))
- ble/keymap:vi/call-operator "$ch" "$beg" "$end" line "$arg" "$reg"; local ext=$?
- ((ext==147)) && return 147
- if [[ $ble_keymap_vi_operator_index ]]; then
- local index=$ble_keymap_vi_operator_index
- else
- ble-edit/content/find-logical-bol "$beg"; beg=$ret # operator 中で beg が変更されているかも
- ble-edit/content/find-non-space "$beg"; local index=$ret
- fi
- ble/keymap:vi/needs-eol-fix "$index" && ((index--))
- _ble_edit_ind=$index
- return 0
- else
- return 1
- fi
-}
-function ble/keymap:vi/call-operator-blockwise {
- local ch=$1 beg=$2 end=$3 arg=$4 reg=$5
- if ble/is-function ble/keymap:vi/operator:"$ch"; then
- local mark_active=${ble_keymap_vi_mark_active:-vi_block}
- local sub_ranges sub_x1 sub_x2
- _ble_edit_mark_active=$mark_active ble/keymap:vi/extract-block "$beg" "$end"
- local nrange=${#sub_ranges[@]}
- ((nrange)) || return 1
- local ble_keymap_vi_operator_index=
- local beg=${sub_ranges[0]}; beg=${beg%%:*}
- local end=${sub_ranges[nrange-1]}; end=${end#*:}; end=${end%%:*}
- ble/keymap:vi/call-operator "$ch" "$beg" "$end" block "$arg" "$reg"
- ((ext==147)) && return 147
- local index=${ble_keymap_vi_operator_index:-$beg}
- ble/keymap:vi/needs-eol-fix "$index" && ((index--))
- _ble_edit_ind=$index
- return 0
- else
- return 1
- fi
-}
-function ble/keymap:vi/operator:d {
- local context=$3 arg=$4 reg=$5 # beg end は上書きする
- if [[ $context == line ]]; then
- ble/keymap:vi/register#set-edit "$reg" L "${_ble_edit_str:beg:end-beg}" || return 1
- if ((end==${#_ble_edit_str}&&beg>0)); then
- local ret
- ((beg--))
- ble-edit/content/find-logical-bol "$beg"
- ble-edit/content/find-non-space "$ret"
- ble_keymap_vi_operator_index=$ret
- fi
- ble/widget/.delete-range "$beg" "$end"
- elif [[ $context == block ]]; then
- local -a afill=() atext=() arep=()
- local sub shift=0 slpad0=
- local smin smax slpad srpad sfill stext
- for sub in "${sub_ranges[@]}"; do
- stext=${sub#*:*:*:*:*:}
- ble/string#split sub : "$sub"
- smin=${sub[0]} smax=${sub[1]}
- slpad=${sub[2]} srpad=${sub[3]}
- sfill=${sub[4]}
- [[ $slpad0 ]] || slpad0=$slpad # 最初の slpad
- ble/array#push afill "$sfill"
- ble/array#push atext "$stext"
- local ret; ble/string#repeat ' ' $((slpad+srpad))
- ble/array#push arep $((smin+shift)):$((smax+shift)):"$ret"
- ((shift+=(slpad+srpad)-(smax-smin)))
- done
- IFS=$'\n' builtin eval 'local yank_content="${atext[*]-}"'
- local IFS=$_ble_term_IFS
- local yank_type=B:"${afill[*]-}"
- ble/keymap:vi/register#set-edit "$reg" "$yank_type" "$yank_content" || return 1
- local rep
- for rep in "${arep[@]}"; do
- smin=${rep%%:*}; rep=${rep:${#smin}+1}
- smax=${rep%%:*}; rep=${rep:${#smax}+1}
- ble/widget/.replace-range "$smin" "$smax" "$rep"
- done
- ((beg+=slpad)) # fix start position
- else
- if ((beg<end)); then
- if [[ $ble_keymap_vi_opmode != vi_char && ${_ble_edit_str:beg:end-beg} == *$'\n'* ]]; then
- if local rex=$'(^|\n)([ \t]*)$'; [[ ${_ble_edit_str::beg} =~ $rex ]]; then
- local prefix=${BASH_REMATCH[2]}
- if rex=$'^[ \t]*(\n|$)'; [[ ${_ble_edit_str:end} =~ $rex ]]; then
- local suffix=$BASH_REMATCH
- ((beg-=${#prefix},end+=${#suffix}))
- ble/keymap:vi/operator:d "$beg" "$end" line "$arg" "$reg"
- return "$?"
- fi
- fi
- fi
- ble/keymap:vi/register#set-edit "$reg" '' "${_ble_edit_str:beg:end-beg}" || return 1
- ble/widget/.delete-range "$beg" "$end"
- fi
- fi
- return 0
-}
-function ble/keymap:vi/operator:c {
- local context=$3 arg=$4 reg=$5 # beg は上書き対象
- if [[ $context == line ]]; then
- ble/keymap:vi/register#set-edit "$reg" L "${_ble_edit_str:beg:end-beg}" || return 1
- local end2=$end
- ((end2)) && [[ ${_ble_edit_str:end2-1:1} == $'\n' ]] && ((end2--))
- local indent= ret
- ble-edit/content/find-non-space "$beg"; local nol=$ret
- ((beg<nol)) && indent=${_ble_edit_str:beg:nol-beg}
- ble/widget/.replace-range "$beg" "$end2" "$indent"
- ble/widget/vi_nmap/.insert-mode
- elif [[ $context == block ]]; then
- ble/keymap:vi/operator:d "$@" || return 1 # @var beg will be overwritten here
- local sub=${sub_ranges[0]}
- local smin=${sub%%:*} sub=${sub#*:}
- local smax=${sub%%:*} sub=${sub#*:}
- local slpad=${sub%%:*} sub=${sub#*:}
- ((smin+=slpad,smax=smin,slpad=0))
- sub_ranges[0]=$smin:$smax:$slpad:$sub
- ble/widget/vi_xmap/block-insert-mode.impl insert
- else
- local ble_keymap_vi_opmode=vi_char
- ble/keymap:vi/operator:d "$@" || return 1
- ble/widget/vi_nmap/.insert-mode
- fi
- return 0
-}
-function ble/keymap:vi/operator:y.record { :; }
-function ble/keymap:vi/operator:y {
- local beg=$1 end=$2 context=$3 arg=$4 reg=$5
- local yank_type= yank_content=
- if [[ $context == line ]]; then
- ble_keymap_vi_operator_index=$_ble_edit_ind # operator:y では現在位置を動かさない
- yank_type=L
- yank_content=${_ble_edit_str:beg:end-beg}
- elif [[ $context == block ]]; then
- local sub
- local -a afill=() atext=()
- for sub in "${sub_ranges[@]}"; do
- local sub4=${sub#*:*:*:*:}
- local sfill=${sub4%%:*} stext=${sub4#*:}
- ble/array#push afill "$sfill"
- ble/array#push atext "$stext"
- done
- IFS=$'\n' builtin eval 'local yank_content="${atext[*]-}"'
- local IFS=$_ble_term_IFS
- yank_type=B:"${afill[*]-}"
- else
- yank_type=
- yank_content=${_ble_edit_str:beg:end-beg}
- fi
- ble/keymap:vi/register#set-yank "$reg" "$yank_type" "$yank_content" || return 1
- ble/keymap:vi/mark/commit-edit-area "$beg" "$end"
- return 0
-}
-function ble/keymap:vi/operator:tr.impl {
- local beg=$1 end=$2 context=$3 filter=$4
- if [[ $context == block ]]; then
- local isub=${#sub_ranges[@]}
- while ((isub--)); do
- ble/string#split sub : "${sub_ranges[isub]}"
- local smin=${sub[0]} smax=${sub[1]}
- local ret; "$filter" "${_ble_edit_str:smin:smax-smin}"
- ble/widget/.replace-range "$smin" "$smax" "$ret"
- done
- else
- local ret; "$filter" "${_ble_edit_str:beg:end-beg}"
- ble/widget/.replace-range "$beg" "$end" "$ret"
- fi
- return 0
-}
-function ble/keymap:vi/operator:u {
- ble/keymap:vi/operator:tr.impl "$1" "$2" "$3" ble/string#tolower
-}
-function ble/keymap:vi/operator:U {
- ble/keymap:vi/operator:tr.impl "$1" "$2" "$3" ble/string#toupper
-}
-function ble/keymap:vi/operator:toggle_case {
- ble/keymap:vi/operator:tr.impl "$1" "$2" "$3" ble/string#toggle-case
-}
-function ble/keymap:vi/operator:rot13 {
- ble/keymap:vi/operator:tr.impl "$1" "$2" "$3" ble/keymap:vi/string#encode-rot13
-}
-function ble/keymap:vi/expand-range-for-linewise-operator {
- local ret
- ble-edit/content/find-logical-bol "$beg"; beg=$ret
- ble-edit/content/find-logical-bol "$end"; local bol2=$ret
- ble-edit/content/find-non-space "$bol2"; local nol2=$ret
- if ((beg<bol2&&_ble_edit_ind<=bol2&&end<=nol2)); then
- end=$bol2
- else
- ble-edit/content/find-logical-eol "$end"; local end=$ret
- [[ ${_ble_edit_str:end:1} == $'\n' ]] && ((end++))
- fi
-}
-function ble/keymap:vi/string#increase-indent {
- local text=$1 delta=$2
- local space=$' \t' it=${bleopt_tab_width:-$_ble_term_it}
- local arr; ble/string#split-lines arr "$text"
- local -a arr2=()
- local line indent i len x r
- for line in "${arr[@]}"; do
- indent=${line%%[!$space]*}
- line=${line:${#indent}}
- ((x=0))
- if [[ $indent ]]; then
- ((len=${#indent}))
- for ((i=0;i<len;i++)); do
- if [[ ${indent:i:1} == ' ' ]]; then
- ((x++))
- else
- ((x=(x+it)/it*it))
- fi
- done
- fi
- ((x+=delta,x<0&&(x=0)))
- indent=
- if ((x)); then
- if ((bleopt_indent_tabs&&(r=x/it))); then
- ble/string#repeat $'\t' "$r"
- indent=$ret
- ((x%=it))
- fi
- if ((x)); then
- ble/string#repeat ' ' "$x"
- indent=$indent$ret
- fi
- fi
- ble/array#push arr2 "$indent$line"
- done
- IFS=$'\n' builtin eval 'ret="${arr2[*]-}"'
-}
-function ble/keymap:vi/operator:indent.impl/increase-block-indent {
- local width=$1
- local isub=${#sub_ranges[@]}
- local sub smin slpad ret
- while ((isub--)); do
- ble/string#split sub : "${sub_ranges[isub]}"
- smin=${sub[0]} slpad=${sub[2]}
- ble/string#repeat ' ' $((slpad+width))
- ble/widget/.replace-range "$smin" "$smin" "$ret"
- done
-}
-function ble/keymap:vi/operator:indent.impl/decrease-graphical-block-indent {
- local width=$1
- local it=${bleopt_tab_width:-$_ble_term_it} cols=$_ble_textmap_cols
- local sub smin slpad ret
- local -a replaces=()
- local isub=${#sub_ranges[@]}
- while ((isub--)); do
- ble/string#split sub : "${sub_ranges[isub]}"
- smin=${sub[0]} slpad=${sub[2]}
- ble-edit/content/find-non-space "$smin"; local nsp=$ret
- ((smin<nsp)) || continue
- local ax ay bx by
- ble/textmap#getxy.out --prefix=a "$smin"
- ble/textmap#getxy.out --prefix=b "$nsp"
- local w=$(((bx-ax)-(by-ay)*cols-width))
- ((w<slpad)) && w=$slpad
- local ins=
- if ((w)); then
- local r
- if ((bleopt_indent_tabs&&(r=(ax+w)/it-ax/it))); then
- ble/string#repeat $'\t' "$r"; ins=$ret
- ((w=(ax+w)%it))
- fi
- if ((w)); then
- ble/string#repeat ' ' "$w"
- ins=$ins$ret
- fi
- fi
- ble/array#push replaces "$smin:$nsp:$ins"
- done
- local rep
- for rep in "${replaces[@]}"; do
- ble/string#split rep : "$rep"
- ble/widget/.replace-range "${rep[@]::3}"
- done
-}
-function ble/keymap:vi/operator:indent.impl/decrease-logical-block-indent {
- local width=$1
- local it=${bleopt_tab_width:-$_ble_term_it}
- local sub smin ret nsp
- local isub=${#sub_ranges[@]}
- while ((isub--)); do
- ble/string#split sub : "${sub_ranges[isub]}"
- smin=${sub[0]}
- ble-edit/content/find-non-space "$smin"; nsp=$ret
- ((smin<nsp)) || continue
- local stext=${_ble_edit_str:smin:nsp-smin}
- local i=0 n=${#stext} c=0 pad=0
- for ((i=0;i<n;i++)); do
- if [[ ${stext:i:1} == $'\t' ]]; then
- ((c+=it))
- else
- ((c++))
- fi
- if ((c>=width)); then
- pad=$((c-width))
- nsp=$((smin+i+1))
- break
- fi
- done
- local padding=
- ((pad)) && { ble/string#repeat ' ' "$pad"; padding=$ret; }
- ble/widget/.replace-range "$smin" "$nsp" "$padding"
- done
-}
-function ble/keymap:vi/operator:indent.impl {
- local delta=$1 context=$2
- ((delta)) || return 0
- if [[ $context == block ]]; then
- if ((delta>=0)); then
- ble/keymap:vi/operator:indent.impl/increase-block-indent "$delta"
- elif ble/edit/use-textmap; then
- ble/keymap:vi/operator:indent.impl/decrease-graphical-block-indent $((-delta))
- else
- ble/keymap:vi/operator:indent.impl/decrease-logical-block-indent $((-delta))
- fi
- else
- [[ $context == char ]] && ble/keymap:vi/expand-range-for-linewise-operator
- ((beg<end)) && [[ ${_ble_edit_str:end-1:1} == $'\n' ]] && ((end--))
- local ret
- ble/keymap:vi/string#increase-indent "${_ble_edit_str:beg:end-beg}" "$delta"; local content=$ret
- ble/widget/.replace-range "$beg" "$end" "$content"
- if [[ $context == char ]]; then
- ble-edit/content/find-non-space "$beg"
- ble_keymap_vi_operator_index=$ret
- fi
- fi
- return 0
-}
-function ble/keymap:vi/operator:indent-left {
- local context=$3 arg=${4:-1}
- ble/keymap:vi/operator:indent.impl $((-bleopt_indent_offset*arg)) "$context"
-}
-function ble/keymap:vi/operator:indent-right {
- local context=$3 arg=${4:-1}
- ble/keymap:vi/operator:indent.impl $((bleopt_indent_offset*arg)) "$context"
-}
-function ble/keymap:vi/string#measure-width {
- local text=$1 iN=${#1} i=0 s=0
- while ((i<iN)); do
- if ble/util/isprint+ "${text:i}"; then
- ((s+=${#BASH_REMATCH},
- i+=${#BASH_REMATCH}))
- else
- ble/util/s2c "${text:i:1}"
- ble/util/c2w-edit "$ret"
- ((s+=ret,i++))
- fi
- done
- ret=$s
-}
-function ble/keymap:vi/string#fold/.get-interval {
- local text=$1 x=$2
- local it=${bleopt_tab_width:-${_ble_term_it:-8}}
- local i=0 iN=${#text}
- for ((i=0;i<iN;i++)); do
- if [[ ${text:i:1} == $'\t' ]]; then
- ((x=(x/it+1)*it))
- else
- ((x++))
- fi
- done
- ret=$((x-$2))
-}
-function ble/keymap:vi/string#fold {
- local text=$1
- local cols=${2:-${COLUMNS-80}}
- local sp=$' \t' nl=$'\n'
- local i=0 out= otmp= x=0 xtmp=0
- local isfirst=1 indent= xindent=0
- local rex='^([^'$nl$sp']+)|^(['$sp']+)|^.'
- while [[ ${text:i} =~ $rex ]]; do
- ((i+=${#BASH_REMATCH}))
- if [[ ${BASH_REMATCH[1]} ]]; then
- local word=${BASH_REMATCH[1]}
- ble/keymap:vi/string#measure-width "$word"
- if ((xtmp+ret<cols||xtmp<=xindent)); then
- out=$out$otmp$word
- ((x=xtmp+=ret))
- else
- out=$out$'\n'$indent$word
- ((x=xtmp=xindent+ret))
- fi
- otmp=
- else
- local w=1
- if [[ ${BASH_REMATCH[2]} ]]; then
- [[ $otmp ]] && continue # 改行直後の空白は無視
- otmp=${BASH_REMATCH[2]}
- ble/keymap:vi/string#fold/.get-interval "$otmp" "$x"; w=$ret
- [[ $isfirst ]] && indent=$otmp xindent=$ret # インデント記録
- else
- otmp=' ' w=1
- fi
- if ((x+w<cols)); then
- ((xtmp=x+w))
- else
- ((xtmp=xindent))
- otmp=$'\n'$indent
- fi
- fi
- isfirst=
- done
- ret=$out
-}
-function ble/keymap:vi/operator:fold/.fold-paragraphwise {
- local text=$1
- local cols=${2:-${COLUMNS:-80}}
- local nl=$'\n' sp=$' \t'
- local rex_paragraph='^((['$sp']*'$nl')*)(['$sp']*[^'$sp$nl'][^'$nl']*('$nl'|$))+'
- local i=0 out=
- while [[ ${text:i} =~ $rex_paragraph ]]; do
- ((i+=${#BASH_REMATCH}))
- local rematch1=${BASH_REMATCH[1]}
- local len1=${#rematch1}
- local paragraph=${BASH_REMATCH:len1}
- ble/keymap:vi/string#fold "$paragraph" "$cols"
- paragraph=${ret%$'\n'}$'\n'
- out=$out$rematch1$paragraph
- done
- ret=$out${text:i}
-}
-function ble/keymap:vi/operator:fold.impl {
- local context=$1 opts=$2
- local ret
- [[ $context != line ]] && ble/keymap:vi/expand-range-for-linewise-operator
- local old=${_ble_edit_str:beg:end-beg} oind=$_ble_edit_ind
- local cols=${COLUMNS:-80}; ((cols>80&&(cols=80)))
- ble/keymap:vi/operator:fold/.fold-paragraphwise "$old" "$cols"; local new=$ret
- ble/widget/.replace-range "$beg" "$end" "$new"
- if [[ :$opts: == *:preserve_point:* ]]; then
- if ((end<=oind)); then
- ble_keymap_vi_operator_index=$((beg+${#new}))
- elif ((beg<oind)); then
- ble/keymap:vi/operator:fold/.fold-paragraphwise "${old::oind-beg}" "$cols"
- ble_keymap_vi_operator_index=$((beg+${#ret}))
- fi
- else
- if [[ $new ]]; then
- ble-edit/content/find-logical-bol $((beg+${#new}-1))
- ble-edit/content/find-non-space "$ret"
- ble_keymap_vi_operator_index=$ret
- fi
- fi
- return 0
-}
-function ble/keymap:vi/operator:fold {
- local context=$3
- ble/keymap:vi/operator:fold.impl "$context"
-}
-function ble/keymap:vi/operator:fold-preserve-point {
- local context=$3
- ble/keymap:vi/operator:fold.impl "$context" preserve_point
-}
-_ble_keymap_vi_filter_args=()
-_ble_keymap_vi_filter_repeat=()
-_ble_keymap_vi_filter_history=()
-_ble_keymap_vi_filter_history_edit=()
-_ble_keymap_vi_filter_history_dirt=()
-_ble_keymap_vi_filter_history_index=0
-function ble/highlight/layer:region/mark:vi_filter/get-face {
- face=region_target
-}
-function ble/keymap:vi/operator:filter/.cache-repeat {
- local -a _ble_keymap_vi_repeat _ble_keymap_vi_repeat_irepeat
- ble/keymap:vi/repeat/record-normal
- _ble_keymap_vi_filter_repeat=("${_ble_keymap_vi_repeat[@]}")
-}
-function ble/keymap:vi/operator:filter/.record-repeat {
- ble/keymap:vi/repeat/record-special && return 0
- local command=$1
- _ble_keymap_vi_repeat=("${_ble_keymap_vi_filter_repeat[@]}")
- _ble_keymap_vi_repeat_irepeat=()
- _ble_keymap_vi_repeat[10]=$command
-}
-function ble/keymap:vi/operator:filter {
- local context=$3
- [[ $context != line ]] && ble/keymap:vi/expand-range-for-linewise-operator
- _ble_keymap_vi_filter_args=("$beg" "$end" "${@:3}")
- if [[ $_ble_keymap_vi_repeat_invoke ]]; then
- local command=${_ble_keymap_vi_repeat[10]}
- ble/keymap:vi/operator:filter/.hook "$command"
- return "$?"
- else
- ble/keymap:vi/operator:filter/.cache-repeat
- _ble_edit_ind=$beg
- _ble_edit_mark=$end
- _ble_edit_mark_active=vi_filter
- ble/keymap:vi/async-commandline-mode 'ble/keymap:vi/operator:filter/.hook'
- _ble_edit_PS1='!'
- ble/history/set-prefix _ble_keymap_vi_filter
- _ble_keymap_vi_cmap_before_command=ble/keymap:vi/commandline/before-command.hook
- _ble_keymap_vi_cmap_cancel_hook=ble/keymap:vi/operator:filter/cancel.hook
- _ble_syntax_lang=bash
- _ble_highlight_layer__list=(plain syntax region overwrite_mode)
- return 147
- fi
-}
-function ble/keymap:vi/operator:filter/cancel.hook {
- _ble_edit_mark_active= # clear mark:vi_filter
-}
-function ble/keymap:vi/operator:filter/.hook {
- local command=$1 # 入力されたコマンド
- if [[ ! $command ]]; then
- ble/widget/vi-command/bell
- return 1
- fi
- local beg=${_ble_keymap_vi_filter_args[0]}
- local end=${_ble_keymap_vi_filter_args[1]}
- local context=${_ble_keymap_vi_filter_args[2]}
- _ble_edit_mark_active= # clear mark:vi_filter
- local old=${_ble_edit_str:beg:end-beg} new
- old=${old%$'\n'}
- if ! ble/util/assign new 'builtin eval -- "$command" <<< "$old" 2>/dev/null'; then
- ble/widget/vi-command/bell
- return 1
- fi
- new=${new%$'\n'}$'\n'
- ble/widget/.replace-range "$beg" "$end" "$new"
- _ble_edit_ind=$beg
- if [[ $context == line ]]; then
- ble/widget/vi-command/first-non-space
- else
- ble/keymap:vi/adjust-command-mode
- fi
- ble/keymap:vi/mark/set-previous-edit-area "$beg" $((beg+${#new}))
- ble/keymap:vi/operator:filter/.record-repeat "$command"
- return 0
-}
-bleopt/declare -v keymap_vi_operatorfunc ''
-function ble/keymap:vi/operator:map {
- local context=$3
- if [[ $bleopt_keymap_vi_operatorfunc ]]; then
- local opfunc=ble/keymap:vi/operator:$bleopt_keymap_vi_operatorfunc
- if ble/is-function "$opfunc"; then
- "$opfunc" "$@"
- return "$?"
- fi
- fi
- return 1
-}
-function ble/widget/vi-command/exclusive-range.impl {
- local src=$1 dst=$2 flag=$3 reg=$4 opts=$5
- if [[ $flag ]]; then
- local opname=${flag%%:*} opflags=${flag#*:}
- if [[ :$opflags: == *:vi_line:* ]]; then
- local ble_keymap_vi_opmode=vi_line
- ble/keymap:vi/call-operator-linewise "$opname" "$src" "$dst" '' "$reg"; local ext=$?
- elif [[ :$opflags: == *:vi_block:* ]]; then
- local ble_keymap_vi_opmode=vi_line
- ble/keymap:vi/call-operator-blockwise "$opname" "$src" "$dst" '' "$reg"; local ext=$?
- elif [[ :$opflags: == *:vi_char:* ]]; then
- local ble_keymap_vi_opmode=vi_char
- if [[ :$opts: == *:inclusive:* ]]; then
- ((src<dst?dst--:(dst<src&&src--)))
- else
- if ((src<=dst)); then
- ((dst<${#_ble_edit_str})) &&
- [[ ${_ble_edit_str:dst:1} != $'\n' ]] &&
- ((dst++))
- else
- ((src<${#_ble_edit_str})) &&
- [[ ${_ble_edit_str:src:1} != $'\n' ]] &&
- ((src++))
- fi
- fi
- ble/keymap:vi/call-operator-charwise "$opname" "$src" "$dst" '' "$reg"; local ext=$?
- else
- local ble_keymap_vi_opmode=
- ble/keymap:vi/call-operator-charwise "$opname" "$src" "$dst" '' "$reg"; local ext=$?
- fi
- ((ext==147)) && return 147
- ((ext)) && ble/widget/.bell
- ble/keymap:vi/adjust-command-mode
- return "$ext"
- else
- ble/keymap:vi/needs-eol-fix "$dst" && ((dst--))
- if ((dst!=_ble_edit_ind)); then
- _ble_edit_ind=$dst
- elif [[ :$opts: != *:nobell:* ]]; then
- ble/widget/vi-command/bell
- return 1
- fi
- ble/keymap:vi/adjust-command-mode
- return 0
- fi
-}
-function ble/widget/vi-command/exclusive-goto.impl {
- local index=$1 flag=$2 reg=$3 opts=$4
- if [[ $flag ]]; then
- if ble-edit/content/bolp "$index"; then
- local is_linewise=
- if ((_ble_edit_ind<index)); then
- ((index--))
- rex=$'(^|\n)[ \t]*$'
- [[ ${_ble_edit_str::_ble_edit_ind} =~ $rex ]] &&
- is_linewise=1
- elif ((index<_ble_edit_ind)); then
- ble-edit/content/bolp &&
- is_linewise=1
- fi
- if [[ $is_linewise ]]; then
- ble/widget/vi-command/linewise-goto.impl "$index" "$flag" "$reg"
- return "$?"
- fi
- fi
- fi
- ble/widget/vi-command/exclusive-range.impl "$_ble_edit_ind" "$index" "$flag" "$reg" "$opts"
-}
-function ble/widget/vi-command/inclusive-goto.impl {
- local index=$1 flag=$2 reg=$3 opts=$4
- if [[ $flag ]]; then
- if ((_ble_edit_ind<=index)); then
- ble-edit/content/eolp "$index" || ((index++))
- else
- ble-edit/content/eolp || ((_ble_edit_ind++))
- fi
- fi
- ble/widget/vi-command/exclusive-range.impl "$_ble_edit_ind" "$index" "$flag" "$reg" "$opts:inclusive"
-}
-function ble/widget/vi-command/linewise-range.impl {
- local p=$1 q=$2 flag=$3 reg=$4 opts=$5
- local ret
- if [[ $q == *:* ]]; then
- local qbase=${q%%:*} qline=${q#*:}
- else
- local qbase=$q qline=0
- fi
- local bolx=; local rex=':bolx=([0-9]+):'; [[ :$opts: =~ $rex ]] && bolx=${BASH_REMATCH[1]}
- local nolx=; local rex=':nolx=([0-9]+):'; [[ :$opts: =~ $rex ]] && nolx=${BASH_REMATCH[1]}
- if [[ ! $flag ]]; then
- if [[ ! $nolx ]]; then
- if [[ ! $bolx ]]; then
- ble-edit/content/find-logical-bol "$qbase" "$qline"; bolx=$ret
- fi
- ble-edit/content/find-non-space "$bolx"; nolx=$ret
- fi
- ble-edit/content/nonbol-eolp "$nolx" && ((nolx--))
- _ble_edit_ind=$nolx
- ble/keymap:vi/adjust-command-mode
- return 0
- fi
- local opname=${flag%%:*} opflags=${flag#*:}
- if ! ble/is-function ble/keymap:vi/operator:"$opname"; then
- ble/widget/vi-command/bell
- return 1
- fi
- local bolp bolq=$bolx nolq=$nolx
- ble-edit/content/find-logical-bol "$p"; bolp=$ret
- [[ $bolq ]] || { ble-edit/content/find-logical-bol "$qbase" "$qline"; bolq=$ret; }
- if [[ :$opts: == *:require_multiline:* ]]; then
- if ((bolq==bolp)); then
- ble/widget/vi-command/bell
- return 1
- fi
- fi
- if [[ :$opflags: == *:vi_char:* || :$opflags: == *:vi_block:* ]]; then
- local beg=$p end
- if [[ :$opts: == *:preserve_column:* ]]; then
- local index
- ble/keymap:vi/get-index-of-relative-line "$qbase" "$qline"; end=$index
- elif [[ :$opts: == *:goto_bol:* ]]; then
- end=$bolq
- else
- [[ $nolq ]] || { ble-edit/content/find-non-space "$bolq"; nolq=$ret; }
- end=$nolq
- fi
- ((beg<=end)) || local beg=$end end=$beg
- if [[ :$opflags: == *:vi_block:* ]]; then
- local ble_keymap_vi_opmode=vi_block
- ble/keymap:vi/call-operator "$opname" "$beg" "$end" block '' "$reg"; local ext=$?
- else
- local ble_keymap_vi_opmode=vi_char
- ble/keymap:vi/call-operator "$opname" "$beg" "$end" char '' "$reg"; local ext=$?
- fi
- if ((ext)); then
- ((ext==147)) && return 147
- ble/widget/vi-command/bell
- return "$ext"
- fi
- else
- local beg end
- if ((bolp<=bolq)); then
- ble-edit/content/find-logical-eol "$bolq"; beg=$bolp end=$ret
- else
- ble-edit/content/find-logical-eol "$bolp"; beg=$bolq end=$ret
- fi
- ((end<${#_ble_edit_str}&&end++))
- local ble_keymap_vi_opmode=
- [[ :$opflags: == *:vi_line:* ]] && ble_keymap_vi_opmode=vi_line
- ble/keymap:vi/call-operator "$opname" "$beg" "$end" line '' "$reg"; local ext=$?
- if ((ext)); then
- ((ext==147)) && return 147
- ble/widget/vi-command/bell
- return "$ext"
- fi
- local ind=$_ble_edit_ind
- if [[ $opname == [cd] ]]; then
- _ble_edit_ind=$beg
- ble/widget/vi-command/first-non-space
- elif [[ :$opts: == *:preserve_column:* ]]; then # j k
- if ((beg<ind)); then
- ble/string#count-char "${_ble_edit_str:beg:ind-beg}" $'\n'
- ((ret=-ret))
- elif ((ind<beg)); then
- ble/string#count-char "${_ble_edit_str:ind:beg-ind}" $'\n'
- else
- ret=0
- fi
- if ((ret)); then
- local index; ble/keymap:vi/get-index-of-relative-line "$_ble_edit_ind" "$ret"
- ble/keymap:vi/needs-eol-fix "$index" && ((index--))
- _ble_edit_ind=$index
- fi
- elif [[ :$opts: == *:goto_bol:* ]]; then # 行指向 yis
- _ble_edit_ind=$beg
- else # + - gg G L H
- if ((beg==bolq||ind<beg)) || [[ ${_ble_edit_str:beg:ind-beg} == *$'\n'* ]] ; then
- if ((bolq<=bolp)) && [[ $nolq ]]; then
- local nolb=$nolq
- else
- ble-edit/content/find-non-space "$beg"; local nolb=$ret
- fi
- ble-edit/content/nonbol-eolp "$nolb" && ((nolb--))
- ((ind<beg||nolb<ind)) && _ble_edit_ind=$nolb
- fi
- fi
- fi
- ble/keymap:vi/adjust-command-mode
- return 0
-}
-function ble/widget/vi-command/linewise-goto.impl {
- ble/widget/vi-command/linewise-range.impl "$_ble_edit_ind" "$@"
-}
-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_keymap_vi_digraph__hook="$command"
- else
- builtin eval -- "$command $key"
- fi
-}
-function ble/keymap:vi/async-read-char {
- local IFS=$_ble_term_IFS
- _ble_decode_key__hook="ble/keymap:vi/async-read-char.hook $*"
- return 147
-}
-_ble_keymap_vi_mark_Offset=32
-_ble_keymap_vi_mark_hindex=
-_ble_keymap_vi_mark_local=()
-_ble_keymap_vi_mark_global=()
-_ble_keymap_vi_mark_history=()
-_ble_keymap_vi_mark_edit_dbeg=-1
-_ble_keymap_vi_mark_edit_dend=-1
-_ble_keymap_vi_mark_edit_dend0=-1
-ble/array#push _ble_textarea_local_VARNAMES \
- _ble_keymap_vi_mark_hindex \
- _ble_keymap_vi_mark_local \
- _ble_keymap_vi_mark_global \
- _ble_keymap_vi_mark_history \
- _ble_keymap_vi_mark_edit_dbeg \
- _ble_keymap_vi_mark_edit_dend \
- _ble_keymap_vi_mark_edit_dend0
-ble/array#push _ble_edit_dirty_observer ble/keymap:vi/mark/shift-by-dirty-range
-blehook history_onleave+=ble/keymap:vi/mark/history-onleave.hook
-function ble/keymap:vi/mark/history-onleave.hook {
- if [[ $_ble_decode_keymap == vi_[inoxs]map ]]; then
- ble/keymap:vi/mark/set-local-mark 34 "$_ble_edit_ind" # `"
- fi
-}
-function ble/keymap:vi/mark/update-mark-history {
- local h; ble/history/get-index -v h
- if [[ ! $_ble_keymap_vi_mark_hindex ]]; then
- _ble_keymap_vi_mark_hindex=$h
- elif ((_ble_keymap_vi_mark_hindex!=h)); then
- local imark value
- local -a save=()
- for imark in "${!_ble_keymap_vi_mark_local[@]}"; do
- local value=${_ble_keymap_vi_mark_local[imark]}
- ble/array#push save "$imark:$value"
- done
- local IFS=$_ble_term_IFS
- _ble_keymap_vi_mark_history[_ble_keymap_vi_mark_hindex]="${save[*]-}"
- _ble_keymap_vi_mark_local=()
- local entry
- for entry in ${_ble_keymap_vi_mark_history[h]-}; do
- imark=${entry%%:*} value=${entry#*:}
- _ble_keymap_vi_mark_local[imark]=$value
- done
- _ble_keymap_vi_mark_hindex=$h
- fi
-}
-blehook history_clear+=ble/keymap:vi/mark/history-clear.hook
-blehook history_delete+=ble/keymap:vi/mark/history-delete.hook
-blehook history_insert+=ble/keymap:vi/mark/history-insert.hook
-function ble/keymap:vi/mark/history-clear.hook {
- _ble_keymap_vi_mark_global=()
- _ble_keymap_vi_mark_history=()
- _ble_keymap_vi_mark_hindex=
-}
-function ble/keymap:vi/mark/history-delete.hook {
- for imark in "${!_ble_keymap_vi_mark_global[@]}"; do
- local value=${_ble_keymap_vi_mark_global[imark]}
- local h=${value%%:*} v=${value#*:}
- local idel shift=0
- for idel; do
- if [[ $idel == *-* ]]; then
- local b=${idel%-*} e=${idel#*-}
- ((b<=h&&h<e)) && shift= # delete
- ((h<e)) && break
- ((shift+=e-b))
- else
- ((idel==h)) && shift= # delete
- ((idel>=h)) && break
- ((shift++))
- fi
- done
- [[ $shift ]] &&
- _ble_keymap_vi_mark_global[imark]=$((h-shift)):$v
- done
- ble/builtin/history/array#delete-hindex _ble_keymap_vi_mark_history "$@"
- _ble_keymap_vi_mark_hindex=
-}
-function ble/keymap:vi/mark/history-insert.hook {
- local beg=$1 len=$2
- for imark in "${!_ble_keymap_vi_mark_global[@]}"; do
- local value=${_ble_keymap_vi_mark_global[imark]}
- local h=${value%%:*} v=${value#*:}
- ((h>=beg)) && _ble_keymap_vi_mark_global[imark]=$((h+len)):$v
- done
- ble/builtin/history/array#insert-range _ble_keymap_vi_mark_history "$@"
- _ble_keymap_vi_mark_hindex=
-}
-function ble/keymap:vi/mark/shift-by-dirty-range {
- local beg=$1 end=$2 end0=$3 reason=$4
- if [[ $4 == edit ]]; then
- ble/dirty-range#update --prefix=_ble_keymap_vi_mark_edit_d "${@:1:3}"
- ble/keymap:vi/xmap/update-dirty-range "$@"
- ble/keymap:vi/mark/update-mark-history
- local shift=$((end-end0))
- local imark
- for imark in "${!_ble_keymap_vi_mark_local[@]}"; do
- local value=${_ble_keymap_vi_mark_local[imark]}
- local index=${value%%:*} rest=${value#*:}
- ((index<beg)) || _ble_keymap_vi_mark_local[imark]=$((index<end0?beg:index+shift)):$rest
- done
- local h; ble/history/get-index -v h
- for imark in "${!_ble_keymap_vi_mark_global[@]}"; do
- local value=${_ble_keymap_vi_mark_global[imark]}
- [[ $value == "$h":* ]] || continue
- local h=${value%%:*}; value=${value:${#h}+1}
- local index=${value%%:*}; value=${value:${#index}+1}
- ((index<beg)) || _ble_keymap_vi_mark_global[imark]=$h:$((index<end0?beg:index+shift)):$value
- done
- ble/keymap:vi/mark/set-local-mark 46 "$beg" # `.
- else
- ble/dirty-range#clear --prefix=_ble_keymap_vi_mark_edit_d
- if [[ $4 == newline && $_ble_decode_keymap != vi_cmap ]]; then
- ble/keymap:vi/mark/set-local-mark 96 0 # ``
- fi
- fi
-}
-function ble/keymap:vi/mark/set-global-mark {
- local c=$1 index=$2 ret
- ble/keymap:vi/mark/update-mark-history
- ble-edit/content/find-logical-bol "$index"; local bol=$ret
- local h; ble/history/get-index -v h
- _ble_keymap_vi_mark_global[c]=$h:$bol:$((index-bol))
-}
-function ble/keymap:vi/mark/set-local-mark {
- local c=$1 index=$2 ret
- ble/keymap:vi/mark/update-mark-history
- ble-edit/content/find-logical-bol "$index"; local bol=$ret
- _ble_keymap_vi_mark_local[c]=$bol:$((index-bol))
-}
-function ble/keymap:vi/mark/get-mark.impl {
- local index=$1 bytes=$2
- local len=${#_ble_edit_str}
- ((index>len&&(index=len)))
- ble-edit/content/find-logical-bol "$index"; index=$ret
- ble-edit/content/find-logical-eol "$index"; local eol=$ret
- ((index+=bytes,index>eol&&(index=eol))) # ToDo: calculate by byte offset
- ret=$index
- return 0
-}
-function ble/keymap:vi/mark/get-local-mark {
- local c=$1
- ble/keymap:vi/mark/update-mark-history
- local value=${_ble_keymap_vi_mark_local[c]}
- [[ $value ]] || return 1
- local data
- ble/string#split data : "$value"
- ble/keymap:vi/mark/get-mark.impl "${data[0]}" "${data[1]}" # -> ret
-}
-_ble_keymap_vi_mark_suppress_edit=
-function ble/keymap:vi/mark/set-previous-edit-area {
- [[ $_ble_keymap_vi_mark_suppress_edit ]] && return 0
- local beg=$1 end=$2
- ((beg<end)) && ! ble-edit/content/bolp "$end" && ((end--))
- ble/keymap:vi/mark/set-local-mark 91 "$beg" # `[
- ble/keymap:vi/mark/set-local-mark 93 "$end" # `]
- ble/keymap:vi/undo/add
-}
-function ble/keymap:vi/mark/start-edit-area {
- [[ $_ble_keymap_vi_mark_suppress_edit ]] && return 0
- ble/dirty-range#clear --prefix=_ble_keymap_vi_mark_edit_d
-}
-function ble/keymap:vi/mark/commit-edit-area {
- local beg=$1 end=$2
- ble/dirty-range#update --prefix=_ble_keymap_vi_mark_edit_d "$beg" "$end" "$end"
-}
-function ble/keymap:vi/mark/end-edit-area {
- [[ $_ble_keymap_vi_mark_suppress_edit ]] && return 0
- local beg=$_ble_keymap_vi_mark_edit_dbeg
- local end=$_ble_keymap_vi_mark_edit_dend
- ((beg>=0)) && ble/keymap:vi/mark/set-previous-edit-area "$beg" "$end"
-}
-function ble/keymap:vi/mark/set-jump {
- ble/keymap:vi/mark/set-local-mark 96 "$_ble_edit_ind"
-}
-function ble/widget/vi-command/set-mark {
- _ble_decode_key__hook="ble/widget/vi-command/set-mark.hook"
- return 147
-}
-function ble/widget/vi-command/set-mark.hook {
- local key=$1
- ble/keymap:vi/clear-arg
- local ret
- if ble/keymap:vi/k2c "$key" && local c=$ret; then
- if ((65<=c&&c<91)); then # A-Z
- ble/keymap:vi/mark/set-global-mark "$c" "$_ble_edit_ind"
- ble/keymap:vi/adjust-command-mode
- return 0
- elif ((97<=c&&c<123||c==91||c==93||c==60||c==62||c==96||c==39)); then # a-z [ ] < > ` '
- ((c==39)) && c=96 # m' は m` に読み替える
- ble/keymap:vi/mark/set-local-mark "$c" "$_ble_edit_ind"
- ble/keymap:vi/adjust-command-mode
- return 0
- fi
- fi
- ble/widget/vi-command/bell
- return 1
-}
-function ble/widget/vi-command/goto-mark.impl {
- local index=$1 flag=$2 reg=$3 opts=$4
- [[ $flag ]] || ble/keymap:vi/mark/set-jump # ``
- if [[ :$opts: == *:line:* ]]; then
- ble/widget/vi-command/linewise-goto.impl "$index" "$flag" "$reg"
- else
- ble/widget/vi-command/exclusive-goto.impl "$index" "$flag" "$reg" nobell
- fi
-}
-function ble/widget/vi-command/goto-local-mark.impl {
- local c=$1 opts=$2 ret
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- if ble/keymap:vi/mark/get-local-mark "$c" && local index=$ret; then
- ble/widget/vi-command/goto-mark.impl "$index" "$FLAG" "$REG" "$opts"
- else
- ble/widget/vi-command/bell
- return 1
- fi
-}
-function ble/widget/vi-command/goto-global-mark.impl {
- local c=$1 opts=$2
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/keymap:vi/mark/update-mark-history
- local value=${_ble_keymap_vi_mark_global[c]}
- if [[ ! $value ]]; then
- ble/widget/vi-command/bell
- return 1
- fi
- local data
- ble/string#split data : "$value"
- local index; ble/history/get-index
- if ((index!=data[0])); then
- if [[ $FLAG ]]; then
- ble/widget/vi-command/bell
- return 1
- fi
- ble-edit/history/goto "${data[0]}"
- fi
- local ret
- ble/keymap:vi/mark/get-mark.impl "${data[1]}" "${data[2]}"
- ble/widget/vi-command/goto-mark.impl "$ret" "$FLAG" "$REG" "$opts"
-}
-function ble/widget/vi-command/goto-mark {
- _ble_decode_key__hook="ble/widget/vi-command/goto-mark.hook ${1:-char}"
- return 147
-}
-function ble/widget/vi-command/goto-mark.hook {
- local opts=$1 key=$2
- local ret
- if ble/keymap:vi/k2c "$key" && local c=$ret; then
- if ((65<=c&&c<91)); then # A-Z
- ble/widget/vi-command/goto-global-mark.impl "$c" "$opts"
- return "$?"
- elif ((_ble_keymap_vi_mark_Offset<=c)); then
- ((c==39)) && c=96 # `' は `` に読み替える
- ble/widget/vi-command/goto-local-mark.impl "$c" "$opts"
- return "$?"
- fi
- fi
- ble/keymap:vi/clear-arg
- ble/widget/vi-command/bell
- return 1
-}
-_ble_keymap_vi_repeat=()
-_ble_keymap_vi_repeat_insert=()
-_ble_keymap_vi_repeat_irepeat=()
-_ble_keymap_vi_repeat_invoke=
-function ble/keymap:vi/repeat/record-special {
- [[ $_ble_keymap_vi_mark_suppress_edit ]] && return 0
- if [[ $_ble_keymap_vi_repeat_invoke ]]; then
- [[ $repeat_arg ]] && _ble_keymap_vi_repeat[3]=$repeat_arg
- [[ ! ${_ble_keymap_vi_repeat[5]} ]] && _ble_keymap_vi_repeat[5]=$repeat_reg
- return 0
- fi
- return 1
-}
-function ble/keymap:vi/repeat/record-normal {
- local IFS=$_ble_term_IFS
- local -a repeat; repeat=("$KEYMAP" "${KEYS[*]-}" "$WIDGET" "$ARG" "$FLAG" "$REG" '')
- if [[ $KEYMAP == vi_[xs]map ]]; then
- repeat[6]=$_ble_keymap_vi_xmap_prev_edit
- fi
- if [[ $_ble_decode_keymap == vi_imap ]]; then
- _ble_keymap_vi_repeat_insert=("${repeat[@]}")
- else
- _ble_keymap_vi_repeat=("${repeat[@]}")
- _ble_keymap_vi_repeat_irepeat=()
- fi
-}
-function ble/keymap:vi/repeat/record {
- ble/keymap:vi/repeat/record-special && return 0
- ble/keymap:vi/repeat/record-normal
-}
-function ble/keymap:vi/repeat/record-insert {
- ble/keymap:vi/repeat/record-special && return 0
- if [[ ${_ble_keymap_vi_repeat_insert-} ]]; then
- _ble_keymap_vi_repeat=("${_ble_keymap_vi_repeat_insert[@]}")
- _ble_keymap_vi_repeat_irepeat=("${_ble_keymap_vi_irepeat[@]}")
- elif ((${#_ble_keymap_vi_irepeat[@]})); then
- local IFS=$_ble_term_IFS
- _ble_keymap_vi_repeat=(vi_nmap "${KEYS[*]-}" ble/widget/vi_nmap/insert-mode 1 '' '')
- _ble_keymap_vi_repeat_irepeat=("${_ble_keymap_vi_irepeat[@]}")
- fi
- ble/keymap:vi/repeat/clear-insert
-}
-function ble/keymap:vi/repeat/clear-insert {
- _ble_keymap_vi_repeat_insert=()
-}
-function ble/keymap:vi/repeat/invoke {
- local repeat_arg=$_ble_edit_arg
- local repeat_reg=$_ble_keymap_vi_reg
- local KEYMAP=${_ble_keymap_vi_repeat[0]}
- local -a KEYS; ble/string#split-words KEYS "${_ble_keymap_vi_repeat[1]}"
- local WIDGET=${_ble_keymap_vi_repeat[2]}
- if [[ $KEYMAP != vi_[onxs]map ]]; then
- ble/widget/vi-command/bell
- return 1
- elif [[ $KEYMAP == vi_omap ]]; then
- 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"
- fi
- _ble_edit_arg=
- _ble_keymap_vi_oparg=${_ble_keymap_vi_repeat[3]}
- _ble_keymap_vi_opfunc=${_ble_keymap_vi_repeat[4]}
- [[ $repeat_arg ]] && _ble_keymap_vi_oparg=$repeat_arg
- local REG=${_ble_keymap_vi_repeat[5]}
- [[ $REG ]] && _ble_keymap_vi_reg=$REG
- local _ble_keymap_vi_single_command{,_overwrite}= # single-command-mode は持続させる。
- local _ble_keymap_vi_repeat_invoke=1
- local LASTWIDGET=$_ble_decode_widget_last
- _ble_decode_widget_last=$WIDGET
- builtin eval -- "$WIDGET"
- if [[ $_ble_decode_keymap == vi_imap ]]; then
- ((_ble_keymap_vi_irepeat_count<=1?(_ble_keymap_vi_irepeat_count=2):_ble_keymap_vi_irepeat_count++))
- local -a _ble_keymap_vi_irepeat
- _ble_keymap_vi_irepeat=("${_ble_keymap_vi_repeat_irepeat[@]}")
- ble/array#push _ble_keymap_vi_irepeat '0:ble/widget/dummy' # Note: normal-mode が自分自身を pop しようとするので。
- ble/widget/vi_imap/normal-mode
- fi
- ble/util/unlocal _ble_keymap_vi_single_command{,_overwrite}
-}
-function ble/widget/vi_nmap/repeat {
- ble/keymap:vi/repeat/invoke
- ble/keymap:vi/adjust-command-mode
-}
-function ble/widget/vi-command/forward-char {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local index
- if [[ $1 == wrap ]]; then
- if [[ $FLAG || $_ble_decode_keymap == vi_[xs]map ]]; then
- ((index=_ble_edit_ind+ARG,
- index>${#_ble_edit_str}&&(index=${#_ble_edit_str})))
- else
- local nl=$'\n'
- local rex="^([^$nl]$nl?|$nl){0,$ARG}"
- [[ ${_ble_edit_str:_ble_edit_ind} =~ $rex ]]
- ((index=_ble_edit_ind+${#BASH_REMATCH}))
- fi
- else
- local line=${_ble_edit_str:_ble_edit_ind:ARG}
- line=${line%%$'\n'*}
- ((index=_ble_edit_ind+${#line}))
- fi
- ble/widget/vi-command/exclusive-goto.impl "$index" "$FLAG" "$REG"
-}
-function ble/widget/vi-command/backward-char {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local index
- ((ARG>_ble_edit_ind&&(ARG=_ble_edit_ind)))
- if [[ $1 == wrap ]]; then
- if [[ $FLAG || $_ble_decode_keymap == vi_[xs]map ]]; then
- ((index=_ble_edit_ind-ARG,index<0&&(index=0)))
- else
- local width=$ARG line
- while ((width<=_ble_edit_ind)); do
- line=${_ble_edit_str:_ble_edit_ind-width:width}
- line=${line//[!$'\n']$'\n'/x}
- ((${#line}>=ARG)) && break
- ((width+=ARG-${#line}))
- done
- ((index=_ble_edit_ind-width,index<0&&(index=0)))
- fi
- else
- local line=${_ble_edit_str:_ble_edit_ind-ARG:ARG}
- line=${line##*$'\n'}
- ((index=_ble_edit_ind-${#line}))
- fi
- ble/widget/vi-command/exclusive-goto.impl "$index" "$FLAG" "$REG"
-}
-function ble/widget/vi_nmap/forward-char-toggle-case {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local line=${_ble_edit_str:_ble_edit_ind:ARG}
- line=${line%%$'\n'*}
- local len=${#line}
- if ((len==0)); then
- ble/widget/vi-command/bell
- return 1
- fi
- local index=$((_ble_edit_ind+len))
- local ret; ble/string#toggle-case "${_ble_edit_str:_ble_edit_ind:len}"
- ble/widget/.replace-range "$_ble_edit_ind" "$index" "$ret"
- ble/keymap:vi/mark/set-previous-edit-area "$_ble_edit_ind" "$index"
- ble/keymap:vi/repeat/record
- ble/keymap:vi/needs-eol-fix "$index" && ((index--))
- _ble_edit_ind=$index
- ble/keymap:vi/adjust-command-mode
- return 0
-}
-function ble/widget/vi-command/.history-relative-line {
- local offset=$1
- ((offset)) || return 0
- if [[ ! $_ble_history_prefix && ! $_ble_history_load_done ]]; then
- ((offset<0)) || return 1
- ble/history/initialize # to use ble/history/get-index
- fi
- local index histsize
- ble/history/get-index
- ble/history/get-count -v histsize
- local ret count=$((offset<0?-offset:offset)) exit=1
- ((count--))
- while ((count>=0)); do
- if ((offset<0)); then
- ((index>0)) || return "$exit"
- ble/widget/history-prev
- ret=${#_ble_edit_str}
- ble/keymap:vi/needs-eol-fix "$ret" && ((ret--))
- _ble_edit_ind=$ret
- else
- ((index<histsize)) || return "$exit"
- ble/widget/history-next
- _ble_edit_ind=0
- fi
- exit=0
- ble/string#count-char "$_ble_edit_str" $'\n'; local nline=$((ret+1))
- ((count<nline)) && break
- ((count-=nline))
- done
- if ((count)); then
- if ((offset<0)); then
- ble-edit/content/find-logical-eol 0 $((nline-count-1))
- ble/keymap:vi/needs-eol-fix "$ret" && ((ret--))
- else
- ble-edit/content/find-logical-bol 0 "$count"
- fi
- _ble_edit_ind=$ret
- fi
- return 0
-}
-function ble/keymap:vi/get-index-of-relative-line {
- local ind=${1:-$_ble_edit_ind} offset=$2
- if ((offset==0)); then
- index=$ind
- return 0
- fi
- local count=$((offset<0?-offset:offset))
- local ret
- ble-edit/content/find-logical-bol "$ind" 0; local bol1=$ret
- ble-edit/content/find-logical-bol "$ind" "$offset"; local bol2=$ret
- if ble/edit/use-textmap; then
- local b1x b1y; ble/textmap#getxy.cur --prefix=b1 "$bol1"
- local b2x b2y; ble/textmap#getxy.cur --prefix=b2 "$bol2"
- ble-edit/content/find-logical-eol "$bol2"; local eol2=$ret
- local c1x c1y; ble/textmap#getxy.cur --prefix=c1 "$ind"
- local e2x e2y; ble/textmap#getxy.cur --prefix=e2 "$eol2"
- local x=$c1x y=$((b2y+c1y-b1y))
- ((y>e2y&&(x=e2x,y=e2y)))
- ble/textmap#get-index-at "$x" "$y" # local variable "index" is set here
- else
- ble-edit/content/find-logical-eol "$bol2"; local eol2=$ret
- ((index=bol2+ind-bol1,index>eol2&&(index=eol2)))
- fi
-}
-function ble/widget/vi-command/relative-line.impl {
- local offset=$1 flag=$2 reg=$3 opts=$4
- ((offset==0)) && return 0
- if [[ $flag ]]; then
- ble/widget/vi-command/linewise-goto.impl "$_ble_edit_ind:$offset" "$flag" "$reg" preserve_column:require_multiline
- return "$?"
- fi
- local count=$((offset<0?-offset:offset)) ret
- if ((offset<0)); then
- ble/string#count-char "${_ble_edit_str::_ble_edit_ind}" $'\n'
- else
- ble/string#count-char "${_ble_edit_str:_ble_edit_ind}" $'\n'
- fi
- ((count-=count<ret?count:ret))
- if ((count==0)); then
- local index; ble/keymap:vi/get-index-of-relative-line "$_ble_edit_ind" "$offset"
- ble/keymap:vi/needs-eol-fix "$index" && ((index--))
- _ble_edit_ind=$index
- ble/keymap:vi/adjust-command-mode
- return 0
- fi
- if [[ $_ble_decode_keymap == vi_nmap && :$opts: == *:history:* ]]; then
- if ble/widget/vi-command/.history-relative-line $((offset>=0?count:-count)) || ((nmove)); then
- ble/keymap:vi/adjust-command-mode
- return 0
- fi
- fi
- ble/widget/vi-command/bell
- return 1
-}
-function ble/widget/vi-command/forward-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/relative-line.impl "$ARG" "$FLAG" "$REG" history
-}
-function ble/widget/vi-command/backward-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/relative-line.impl $((-ARG)) "$FLAG" "$REG" history
-}
-function ble/widget/vi-command/graphical-relative-line.impl {
- local offset=$1 flag=$2 reg=$3 opts=$4
- local index move
- if ble/edit/use-textmap; then
- local x y ax ay
- ble/textmap#getxy.cur "$_ble_edit_ind"
- ((ax=x,ay=y+offset,
- ay<_ble_textmap_begy?(ay=_ble_textmap_begy):
- (ay>_ble_textmap_endy?(ay=_ble_textmap_endy):0)))
- ble/textmap#get-index-at "$ax" "$ay"
- ble/textmap#getxy.cur --prefix=a "$index"
- ((offset-=move=ay-y))
- else
- local ret ind=$_ble_edit_ind
- ble-edit/content/find-logical-bol "$ind" 0; local bol1=$ret
- ble-edit/content/find-logical-bol "$ind" "$offset"; local bol2=$ret
- ble-edit/content/find-logical-eol "$bol2"; local eol2=$ret
- ((index=bol2+ind-bol1,index>eol2&&(index=eol2)))
- if ((index>ind)); then
- ble/string#count-char "${_ble_edit_str:ind:index-ind}" $'\n'
- ((offset+=move=-ret))
- elif ((index<ind)); then
- ble/string#count-char "${_ble_edit_str:index:ind-index}" $'\n'
- ((offset+=move=ret))
- fi
- fi
- if ((offset==0)); then
- ble/widget/vi-command/exclusive-goto.impl "$index" "$flag" "$reg"
- return "$?"
- fi
- if [[ ! $flag && $_ble_decode_keymap == vi_nmap && :$opts: == *:history:* ]]; then
- if ble/widget/vi-command/.history-relative-line "$offset"; then
- ble/keymap:vi/adjust-command-mode
- return 0
- fi
- fi
- ((move)) && ble/widget/vi-command/exclusive-goto.impl "$index"
- ble/widget/vi-command/bell
- return 1
-}
-function ble/widget/vi-command/graphical-forward-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/graphical-relative-line.impl "$ARG" "$FLAG" "$REG"
-}
-function ble/widget/vi-command/graphical-backward-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/graphical-relative-line.impl $((-ARG)) "$FLAG" "$REG"
-}
-function ble/widget/vi-command/relative-first-non-space.impl {
- local arg=$1 flag=$2 reg=$3 opts=$4
- local ret ind=$_ble_edit_ind
- ble-edit/content/find-logical-bol "$ind" "$arg"; local bolx=$ret
- ble-edit/content/find-non-space "$bolx"; local nolx=$ret
- ((_ble_keymap_vi_single_command==2&&_ble_keymap_vi_single_command--))
- if [[ $flag ]]; then
- if [[ :$opts: == *:charwise:* ]]; then
- ble-edit/content/nonbol-eolp "$nolx" && ((nolx--))
- ble/widget/vi-command/exclusive-goto.impl "$nolx" "$flag" "$reg" nobell
- elif [[ :$opts: == *:multiline:* ]]; then
- ble/widget/vi-command/linewise-goto.impl "$nolx" "$flag" "$reg" require_multiline:bolx="$bolx":nolx="$nolx"
- else
- ble/widget/vi-command/linewise-goto.impl "$nolx" "$flag" "$reg" bolx="$bolx":nolx="$nolx"
- fi
- return "$?"
- fi
- local count=$((arg<0?-arg:arg)) nmove=0
- if ((count)); then
- local beg end; ((nolx<ind?(beg=nolx,end=ind):(beg=ind,end=nolx)))
- ble/string#count-char "${_ble_edit_str:beg:end-beg}" $'\n'; nmove=$ret
- ((count-=nmove))
- fi
- if ((count==0)); then
- ble/keymap:vi/needs-eol-fix "$nolx" && ((nolx--))
- _ble_edit_ind=$nolx
- ble/keymap:vi/adjust-command-mode
- return 0
- fi
- if [[ $_ble_decode_keymap == vi_nmap && :$opts: == *:history:* ]] && ble/widget/vi-command/.history-relative-line $((arg>=0?count:-count)); then
- ble/widget/vi-command/first-non-space
- elif ((nmove)); then
- ble/keymap:vi/needs-eol-fix "$nolx" && ((nolx--))
- _ble_edit_ind=$nolx
- ble/keymap:vi/adjust-command-mode
- else
- ble/widget/vi-command/bell
- return 1
- fi
-}
-function ble/widget/vi-command/first-non-space {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/relative-first-non-space.impl 0 "$FLAG" "$REG" charwise:history
-}
-function ble/widget/vi-command/forward-first-non-space {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/relative-first-non-space.impl "$ARG" "$FLAG" "$REG" multiline:history
-}
-function ble/widget/vi-command/backward-first-non-space {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/relative-first-non-space.impl $((-ARG)) "$FLAG" "$REG" multiline:history
-}
-function ble/widget/vi-command/first-non-space-forward {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/relative-first-non-space.impl $((ARG-1)) "$FLAG" "$REG" history
-}
-function ble/widget/vi-command/forward-eol {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- if ((ARG>1)) && [[ ${_ble_edit_str:_ble_edit_ind} != *$'\n'* ]]; then
- ble/widget/vi-command/bell
- return 1
- fi
- local ret index
- ble-edit/content/find-logical-eol "$_ble_edit_ind" $((ARG-1)); index=$ret
- ble/keymap:vi/needs-eol-fix "$index" && ((index--))
- ble/widget/vi-command/inclusive-goto.impl "$index" "$FLAG" "$REG" nobell
- [[ $_ble_decode_keymap == vi_[xs]map ]] &&
- ble/keymap:vi/xmap/add-eol-extension # 末尾拡張
-}
-function ble/widget/vi-command/beginning-of-graphical-line {
- if ble/edit/use-textmap; then
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local x y index
- ble/textmap#getxy.cur "$_ble_edit_ind"
- ble/textmap#get-index-at 0 "$y"
- ble/keymap:vi/needs-eol-fix "$index" && ((index--))
- ble/widget/vi-command/exclusive-goto.impl "$index" "$FLAG" "$REG" nobell
- else
- ble/widget/vi-command/beginning-of-line
- fi
-}
-function ble/widget/vi-command/graphical-first-non-space {
- if ble/edit/use-textmap; then
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local x y index ret
- ble/textmap#getxy.cur "$_ble_edit_ind"
- ble/textmap#get-index-at 0 "$y"
- ble-edit/content/find-non-space "$index"
- ble/keymap:vi/needs-eol-fix "$ret" && ((ret--))
- ble/widget/vi-command/exclusive-goto.impl "$ret" "$FLAG" "$REG" nobell
- else
- ble/widget/vi-command/first-non-space
- fi
-}
-function ble/widget/vi-command/graphical-forward-eol {
- if ble/edit/use-textmap; then
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local x y index
- ble/textmap#getxy.cur "$_ble_edit_ind"
- ble/textmap#get-index-at $((_ble_textmap_cols-1)) $((y+ARG-1))
- ble/keymap:vi/needs-eol-fix "$index" && ((index--))
- ble/widget/vi-command/inclusive-goto.impl "$index" "$FLAG" "$REG" nobell
- else
- ble/widget/vi-command/forward-eol
- fi
-}
-function ble/widget/vi-command/middle-of-graphical-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local index
- if ble/edit/use-textmap; then
- local x y
- ble/textmap#getxy.cur "$_ble_edit_ind"
- ble/textmap#get-index-at $((_ble_textmap_cols/2)) "$y"
- ble/keymap:vi/needs-eol-fix "$index" && ((index--))
- else
- local ret
- ble-edit/content/find-logical-bol; local bol=$ret
- ble-edit/content/find-logical-eol; local eol=$ret
- ((index=(bol+${COLUMNS:-eol})/2,
- index>eol&&(index=eol),
- bol<eol&&index==eol&&(index--)))
- fi
- ble/widget/vi-command/exclusive-goto.impl "$index" "$FLAG" "$REG" nobell
-}
-function ble/widget/vi-command/last-non-space {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret
- ble-edit/content/find-logical-eol "$_ble_edit_ind" $((ARG-1)); local index=$ret
- if ((ARG>1)) && [[ ${_ble_edit_str:_ble_edit_ind:index-_ble_edit_ind} != *$'\n'* ]]; then
- ble/widget/vi-command/bell
- return 1
- fi
- local rex=$'([^ \t\n]?[ \t]+|[^ \t\n])$'
- [[ ${_ble_edit_str::index} =~ $rex ]] && ((index-=${#BASH_REMATCH}))
- ble/widget/vi-command/inclusive-goto.impl "$index" "$FLAG" "$REG" nobell
-}
-_ble_keymap_vi_previous_scroll=
-function ble/widget/vi_nmap/scroll.impl {
- local opts=$1
- local height=${_ble_canvas_panel_height[_ble_textarea_panel]}
- local ARG FLAG REG; ble/keymap:vi/get-arg "$_ble_keymap_vi_previous_scroll"
- _ble_keymap_vi_previous_scroll=$ARG
- [[ $ARG ]] || ((ARG=height/2))
- [[ :$opts: == *:backward:* ]] && ((ARG=-ARG))
- ble/widget/.update-textmap
- if [[ :$opts: == *:cursor:* ]]; then
- local x y index ret
- ble/textmap#getxy.cur "$_ble_edit_ind"
- ble/textmap#get-index-at 0 $((y+ARG))
- ble-edit/content/find-non-space "$index"
- ble/keymap:vi/needs-eol-fix "$ret" && ((ret--))
- _ble_edit_ind=$ret
- ble/keymap:vi/adjust-command-mode
- ((_ble_textmap_endy<height)) && return 0
- local ax ay
- ble/textmap#getxy.cur --prefix=a "$_ble_edit_ind"
- local max_scroll=$((_ble_textmap_endy+1-height))
- ((_ble_textarea_scroll_new+=ay-y))
- if ((_ble_textarea_scroll_new<0)); then
- _ble_textarea_scroll_new=0
- elif ((_ble_textarea_scroll_new>max_scroll)); then
- _ble_textarea_scroll_new=$max_scroll
- fi
- else
- ((_ble_textmap_endy<height)) && return 0
- local max_scroll=$((_ble_textmap_endy+1-height))
- ((_ble_textarea_scroll_new+=ARG))
- if ((_ble_textarea_scroll_new<0)); then
- _ble_textarea_scroll_new=0
- elif ((_ble_textarea_scroll_new>max_scroll)); then
- _ble_textarea_scroll_new=$max_scroll
- fi
- local ay=$((_ble_textarea_scroll_new+_ble_textmap_begy))
- local by=$((_ble_textarea_scroll_new+height-1))
- ((_ble_textarea_scroll_new&&ay++))
- ((_ble_textarea_scroll_new!=0&&ay<by&&ay++,
- _ble_textarea_scroll_new!=max_scroll&&ay<by&&by--))
- local x y
- ble/textmap#getxy.cur "$_ble_edit_ind"
- if ((y<ay?(y=ay,1):(y>by?(y=by,1):0))); then
- local index
- ble/textmap#get-index-at "$x" "$y"
- _ble_edit_ind=$index
- fi
- ble/keymap:vi/adjust-command-mode
- fi
-}
-function ble/widget/vi_nmap/forward-line-scroll {
- ble/widget/vi_nmap/scroll.impl forward:cursor
-}
-function ble/widget/vi_nmap/backward-line-scroll {
- ble/widget/vi_nmap/scroll.impl backward:cursor
-}
-function ble/widget/vi_nmap/forward-scroll {
- ble/widget/vi_nmap/scroll.impl forward
-}
-function ble/widget/vi_nmap/backward-scroll {
- ble/widget/vi_nmap/scroll.impl backward
-}
-function ble/widget/vi_nmap/pagedown {
- local height=${_ble_canvas_panel_height[_ble_textarea_panel]}
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/.update-textmap
- local x y
- ble/textmap#getxy.cur "$_ble_edit_ind"
- if ((y==_ble_textmap_endy)); then
- ble/widget/vi-command/bell
- return 1
- fi
- local vheight=$((height-_ble_textmap_begy-1))
- local ybase=$((_ble_textarea_scroll_new+height-1))
- local y1=$((ybase+(ARG-1)*(vheight-2)))
- local index ret
- ble/textmap#get-index-at 0 "$y1"
- ble-edit/content/bolp "$index" &&
- ble-edit/content/find-non-space "$index"; index=$ret
- _ble_edit_ind=$index
- local max_scroll=$((_ble_textmap_endy+1-height))
- ble/textmap#getxy.cur "$_ble_edit_ind"
- local scroll=$((y<=_ble_textmap_begy+1?0:(y-_ble_textmap_begy-1)))
- ((scroll>max_scroll&&(scroll=max_scroll)))
- _ble_textarea_scroll_new=$scroll
- ble/keymap:vi/adjust-command-mode
-}
-function ble/widget/vi_nmap/pageup {
- local height=${_ble_canvas_panel_height[_ble_textarea_panel]}
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/.update-textmap
- if ((!_ble_textarea_scroll_new)); then
- ble/widget/vi-command/bell
- return 1
- fi
- local vheight=$((height-_ble_textmap_begy-1))
- local ybase=$((_ble_textarea_scroll_new+_ble_textmap_begy+1))
- local y1=$((ybase-(ARG-1)*(vheight-2)))
- ((y1<_ble_textmap_begy&&(y1=_ble_textmap_begy)))
- local index ret
- ble/textmap#get-index-at 0 "$y1"
- ble-edit/content/bolp "$index" &&
- ble-edit/content/find-non-space "$index"; index=$ret
- _ble_edit_ind=$index
- local x y
- ble/textmap#getxy.cur "$_ble_edit_ind"
- local scroll=$((y-height+2))
- ((scroll<0&&(scroll=0)))
- _ble_textarea_scroll_new=$scroll
- ble/keymap:vi/adjust-command-mode
-}
-function ble/widget/vi_nmap/scroll-to-center.impl {
- local opts=$1
- ble/widget/.update-textmap
- local height=${_ble_canvas_panel_height[_ble_textarea_panel]}
- local ARG FLAG REG; ble/keymap:vi/get-arg ''
- if [[ ! $ARG && :$opts: == *:pagedown:* ]]; then
- local y1=$((_ble_textarea_scroll_new+height))
- local index
- ble/textmap#get-index-at 0 "$y1"
- ((_ble_edit_ind=index))
- fi
- local ret
- ble-edit/content/find-logical-bol "$_ble_edit_ind"; local bol1=$ret
- if [[ $ARG || :$opts: == *:nol:* ]]; then
- if [[ $ARG ]]; then
- ble-edit/content/find-logical-bol 0 $((ARG-1)); local bol2=$ret
- else
- local bol2=$bol1
- fi
- if [[ :$opts: == *:nol:* ]]; then
- ble-edit/content/find-non-space "$bol2"
- _ble_edit_ind=$ret
- elif ((bol1!=bol2)); then
- local b1x b1y p1x p1y dx dy
- ble/textmap#getxy.cur --prefix=b1 "$bol1"
- ble/textmap#getxy.cur --prefix=p1 "$_ble_edit_ind"
- ((dx=p1x,dy=p1y-b1y))
- local b2x b2y p2x p2y index
- ble/textmap#getxy.cur --prefix=b2 "$bol2"
- ((p2x=b2x,p2y=b2y+dy))
- ble/textmap#get-index-at "$p2x" "$p2y"
- if ble-edit/content/find-logical-bol "$index"; ((ret==bol2)); then
- _ble_edit_ind=$index
- else
- ble-edit/content/find-logical-eol "$bol2"
- _ble_edit_ind=$ret
- fi
- fi
- ble/keymap:vi/needs-eol-fix && ((_ble_edit_ind--))
- fi
- if ((_ble_textmap_endy+1>height)); then
- local max_scroll=$((_ble_textmap_endy+1-height))
- local b1x b1y
- ble/textmap#getxy.cur --prefix=b1 "$bol1"
- local scroll=
- if [[ :$opts: == *:top:* ]]; then
- ((scroll=b1y-(_ble_textmap_begy+2)))
- elif [[ :$opts: == *:bottom:* ]]; then
- ((scroll=b1y-(height-2)))
- else
- local vheight=$((height-_ble_textmap_begy-1))
- ((scroll=b1y-(_ble_textmap_begy+1+vheight/2)))
- fi
- if ((scroll<0)); then
- scroll=0
- elif ((scroll>max_scroll)); then
- scroll=$max_scroll
- fi
- _ble_textarea_scroll_new=$scroll
- fi
- ble/keymap:vi/adjust-command-mode
-}
-function ble/widget/vi_nmap/scroll-to-center-and-redraw {
- ble/widget/vi_nmap/scroll-to-center.impl
- ble/widget/redraw-line
-}
-function ble/widget/vi_nmap/scroll-to-top-and-redraw {
- ble/widget/vi_nmap/scroll-to-center.impl top
- ble/widget/redraw-line
-}
-function ble/widget/vi_nmap/scroll-to-bottom-and-redraw {
- ble/widget/vi_nmap/scroll-to-center.impl bottom
- ble/widget/redraw-line
-}
-function ble/widget/vi_nmap/scroll-to-center-non-space-and-redraw {
- ble/widget/vi_nmap/scroll-to-center.impl nol
- ble/widget/redraw-line
-}
-function ble/widget/vi_nmap/scroll-to-top-non-space-and-redraw {
- ble/widget/vi_nmap/scroll-to-center.impl top:nol
- ble/widget/redraw-line
-}
-function ble/widget/vi_nmap/scroll-to-bottom-non-space-and-redraw {
- ble/widget/vi_nmap/scroll-to-center.impl bottom:nol
- ble/widget/redraw-line
-}
-function ble/widget/vi_nmap/scroll-or-pagedown-and-redraw {
- ble/widget/vi_nmap/scroll-to-center.impl top:nol:pagedown
- ble/widget/redraw-line
-}
-function ble/widget/vi_nmap/paste.impl/block {
- local arg=${1:-1} type=$2
- local graphical=
- if [[ $type ]]; then
- [[ $type == graphical ]] && graphical=1
- else
- ble/edit/use-textmap && graphical=1
- fi
- local ret cols=$_ble_textmap_cols
- local -a afill; ble/string#split-words afill "${_ble_edit_kill_type:2}"
- local atext; ble/string#split-lines atext "$_ble_edit_kill_ring"
- local ntext=${#atext[@]}
- if [[ $graphical ]]; then
- ble-edit/content/find-logical-bol; local bol=$ret
- local bx by x y c
- ble/textmap#getxy.cur --prefix=b "$bol"
- ble/textmap#getxy.cur "$_ble_edit_ind"
- ((y-=by,c=y*cols+x))
- else
- ble-edit/content/find-logical-bol; local bol=$ret
- local c=$((_ble_edit_ind-bol))
- fi
- local -a ins_beg=() ins_end=() ins_text=()
- local i is_newline=
- for ((i=0;i<ntext;i++)); do
- if ((i>0)); then
- ble-edit/content/find-logical-bol "$bol" 1
- if ((bol==ret)); then
- is_newline=1
- else
- bol=$ret
- [[ $graphical ]] && ble/textmap#getxy.cur --prefix=b "$bol"
- fi
- fi
- local text=${atext[i]}
- local fill=$((afill[i]))
- if ((arg>1)); then
- ret=
- ((fill)) && ble/string#repeat ' ' "$fill"
- ble/string#repeat "$text$ret" "$arg"
- text=${ret::${#ret}-fill}
- fi
- local index iend=
- if [[ $is_newline ]]; then
- index=${#_ble_edit_str}
- ble/string#repeat ' ' "$c"
- text=$'\n'$ret$text
- elif [[ $graphical ]]; then
- ble-edit/content/find-logical-eol "$bol"; local eol=$ret
- ble/textmap#get-index-at "$x" $((by+y)); ((index>eol&&(index=eol)))
- local ax ay ac; ble/textmap#getxy.out --prefix=a "$index"
- ((ay-=by,ac=ay*cols+ax))
- if ((ac<c)); then
- ble/string#repeat ' ' $((c-ac))
- text=$ret$text
- if ((index<eol)) && [[ ${_ble_edit_str:index:1} == $'\t' ]]; then
- local rx ry rc; ble/textmap#getxy.out --prefix=r $((index+1))
- ((rc=(ry-by)*cols+rx))
- ble/string#repeat ' ' $((rc-c))
- text=$text$ret
- iend=$((index+1))
- fi
- fi
- if ((index<eol&&fill)); then
- ble/string#repeat ' ' "$fill"
- text=$text$ret
- fi
- else
- ble-edit/content/find-logical-eol "$bol"; local eol=$ret
- local index=$((bol+c))
- if ((index<eol)); then
- if ((fill)); then
- ble/string#repeat ' ' "$fill"
- text=$text$ret
- fi
- elif ((index>eol)); then
- ble/string#repeat ' ' $((index-eol))
- text=$ret$text
- index=$eol
- fi
- fi
- ble/array#push ins_beg "$index"
- ble/array#push ins_end "${iend:-$index}"
- ble/array#push ins_text "$text"
- done
- ble/keymap:vi/mark/start-edit-area
- local i=${#ins_beg[@]}
- while ((i--)); do
- local ibeg=${ins_beg[i]} iend=${ins_end[i]} text=${ins_text[i]}
- ble/widget/.replace-range "$ibeg" "$iend" "$text"
- done
- ble/keymap:vi/mark/end-edit-area
- ble/keymap:vi/repeat/record
- ble/keymap:vi/needs-eol-fix && ((_ble_edit_ind--))
- ble/keymap:vi/adjust-command-mode
-}
-function ble/widget/vi_nmap/paste.impl {
- local arg=$1 reg=$2 is_after=$3
- if [[ $reg ]]; then
- local _ble_edit_kill_ring _ble_edit_kill_type
- ble/keymap:vi/register#load "$reg"
- fi
- [[ $_ble_edit_kill_ring ]] || return 0
- local ret
- if [[ $_ble_edit_kill_type == L ]]; then
- ble/string#repeat "$_ble_edit_kill_ring" "$arg"
- local content=$ret
- local index dbeg dend
- if ((is_after)); then
- ble-edit/content/find-logical-eol; index=$ret
- if ((index==${#_ble_edit_str})); then
- content=$'\n'${content%$'\n'}
- ((dbeg=index+1,dend=index+${#content}))
- else
- ((index++,dbeg=index,dend=index+${#content}-1))
- fi
- else
- ble-edit/content/find-logical-bol
- ((index=ret,dbeg=index,dend=index+${#content}-1))
- fi
- ble/widget/.replace-range "$index" "$index" "$content"
- _ble_edit_ind=$dbeg
- ble/keymap:vi/mark/set-previous-edit-area "$dbeg" "$dend"
- ble/keymap:vi/repeat/record
- ble/widget/vi-command/first-non-space
- elif [[ $_ble_edit_kill_type == B:* ]]; then
- if ((is_after)) && ! ble-edit/content/eolp; then
- ((_ble_edit_ind++))
- fi
- ble/widget/vi_nmap/paste.impl/block "$arg"
- else
- if ((is_after)) && ! ble-edit/content/eolp; then
- ((_ble_edit_ind++))
- fi
- ble/string#repeat "$_ble_edit_kill_ring" "$arg"
- local beg=$_ble_edit_ind
- ble/widget/.insert-string "$ret"
- local end=$_ble_edit_ind
- ble/keymap:vi/mark/set-previous-edit-area "$beg" "$end"
- ble/keymap:vi/repeat/record
- [[ $_ble_keymap_vi_single_command ]] || ((_ble_edit_ind--))
- ble/keymap:vi/needs-eol-fix && ((_ble_edit_ind--))
- ble/keymap:vi/adjust-command-mode
- fi
- return 0
-}
-function ble/widget/vi_nmap/paste-after {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi_nmap/paste.impl "$ARG" "$REG" 1
-}
-function ble/widget/vi_nmap/paste-before {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi_nmap/paste.impl "$ARG" "$REG" 0
-}
-function ble/widget/vi_nmap/kill-forward-char {
- _ble_keymap_vi_opfunc=d
- ble/widget/vi-command/forward-char
-}
-function ble/widget/vi_nmap/kill-forward-char-and-insert {
- _ble_keymap_vi_opfunc=c
- ble/widget/vi-command/forward-char
-}
-function ble/widget/vi_nmap/kill-backward-char {
- _ble_keymap_vi_opfunc=d
- ble/widget/vi-command/backward-char
-}
-function ble/widget/vi_nmap/kill-forward-line {
- _ble_keymap_vi_opfunc=d
- ble/widget/vi-command/forward-eol
-}
-function ble/widget/vi_nmap/kill-forward-line-and-insert {
- _ble_keymap_vi_opfunc=c
- ble/widget/vi-command/forward-eol
-}
-function ble/widget/vi-command/forward-word.impl {
- local arg=$1 flag=$2 reg=$3 rex_word=$4
- local ifs=$_ble_term_IFS
- if [[ $flag == c && ${_ble_edit_str:_ble_edit_ind:1} != [$ifs] ]]; then
- ble/widget/vi-command/forward-word-end.impl "$arg" "$flag" "$reg" "$rex_word" allow_here
- return "$?"
- fi
- local b=$'[ \t]' n=$'\n'
- local rex="^((($rex_word)$n?|$b+$n?|$n)($b+$n)*$b*){0,$arg}" # 単語先頭または空行に止まる
- [[ ${_ble_edit_str:_ble_edit_ind} =~ $rex ]]
- local index=$((_ble_edit_ind+${#BASH_REMATCH}))
- if [[ $flag ]]; then
- local rematch1=${BASH_REMATCH[1]}
- if local rex="$n$b*\$"; [[ $rematch1 =~ $rex ]]; then
- local suffix_len=${#BASH_REMATCH}
- ((suffix_len<${#rematch1})) &&
- ((index-=suffix_len))
- fi
- fi
- ble/widget/vi-command/exclusive-goto.impl "$index" "$flag" "$reg"
-}
-function ble/widget/vi-command/forward-word-end.impl {
- local arg=$1 flag=$2 reg=$3 rex_word=$4 opts=$5
- local IFS=$_ble_term_IFS
- local rex="^([$IFS]*($rex_word)?){0,$arg}" # 単語末端に止まる。空行には止まらない
- local offset=1; [[ :$opts: == *:allow_here:* ]] && offset=0
- [[ ${_ble_edit_str:_ble_edit_ind+offset} =~ $rex ]]
- local index=$((_ble_edit_ind+offset+${#BASH_REMATCH}-1))
- ((index<_ble_edit_ind&&(index=_ble_edit_ind)))
- [[ ! $flag && $BASH_REMATCH && ${_ble_edit_str:index:1} == [$IFS] ]] && ble/widget/.bell
- ble/widget/vi-command/inclusive-goto.impl "$index" "$flag" "$reg"
-}
-function ble/widget/vi-command/backward-word.impl {
- local arg=$1 flag=$2 reg=$3 rex_word=$4
- local b=$'[ \t]' n=$'\n'
- local rex="((($rex_word)$n?|$b+$n?|$n)($b+$n)*$b*){0,$arg}\$" # 単語先頭または空行に止まる
- [[ ${_ble_edit_str::_ble_edit_ind} =~ $rex ]]
- local index=$((_ble_edit_ind-${#BASH_REMATCH}))
- ble/widget/vi-command/exclusive-goto.impl "$index" "$flag" "$reg"
-}
-function ble/widget/vi-command/backward-word-end.impl {
- local arg=$1 flag=$2 reg=$3 rex_word=$4
- local i=$'[ \t\n]' b=$'[ \t]' n=$'\n' w="($rex_word)"
- local rex1="(^|$w$n?|$n)($b+$n)*$b*"
- local rex="($rex1)($rex1){$((arg-1))}($rex_word|$i)\$" # 単語末端または空行に止まる
- [[ ${_ble_edit_str::_ble_edit_ind+1} =~ $rex ]]
- local index=$((_ble_edit_ind+1-${#BASH_REMATCH}))
- local rematch3=${BASH_REMATCH[3]} # 最初の ($rex_word)
- [[ $rematch3 ]] && ((index+=${#rematch3}-1))
- ble/widget/vi-command/inclusive-goto.impl "$index" "$flag" "$reg"
-}
-function ble/widget/vi-command/forward-vword {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/forward-word.impl "$ARG" "$FLAG" "$REG" "$_ble_keymap_vi_REX_WORD"
-}
-function ble/widget/vi-command/forward-vword-end {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/forward-word-end.impl "$ARG" "$FLAG" "$REG" "$_ble_keymap_vi_REX_WORD"
-}
-function ble/widget/vi-command/backward-vword {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/backward-word.impl "$ARG" "$FLAG" "$REG" "$_ble_keymap_vi_REX_WORD"
-}
-function ble/widget/vi-command/backward-vword-end {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/backward-word-end.impl "$ARG" "$FLAG" "$REG" "$_ble_keymap_vi_REX_WORD"
-}
-function ble/widget/vi-command/forward-uword {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/forward-word.impl "$ARG" "$FLAG" "$REG" $'[^ \t\n]+'
-}
-function ble/widget/vi-command/forward-uword-end {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/forward-word-end.impl "$ARG" "$FLAG" "$REG" $'[^ \t\n]+'
-}
-function ble/widget/vi-command/backward-uword {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/backward-word.impl "$ARG" "$FLAG" "$REG" $'[^ \t\n]+'
-}
-function ble/widget/vi-command/backward-uword-end {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/backward-word-end.impl "$ARG" "$FLAG" "$REG" $'[^ \t\n]+'
-}
-function ble/widget/vi-command/nth-column {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret index
- ble-edit/content/find-logical-bol; local bol=$ret
- ble-edit/content/find-logical-eol; local eol=$ret
- if ble/edit/use-textmap; then
- local bx by; ble/textmap#getxy.cur --prefix=b "$bol" # Note: 先頭行はプロンプトにより bx!=0
- local ex ey; ble/textmap#getxy.cur --prefix=e "$eol"
- local dstx=$((bx+ARG-1)) dsty=$by cols=${COLUMNS:-80}
- ((dsty+=dstx/cols,dstx%=cols))
- ((dsty>ey&&(dsty=ey,dstx=ex)))
- ble/textmap#get-index-at "$dstx" "$dsty" # local variable "index" is set here
- [[ $_ble_decode_keymap != vi_[xs]map ]] &&
- ble-edit/content/nonbol-eolp "$index" && ((index--))
- else
- [[ $_ble_decode_keymap != vi_[xs]map ]] &&
- ble-edit/content/nonbol-eolp "$eol" && ((eol--))
- ((index=bol+ARG-1,index>eol&&(index=eol)))
- fi
- ble/widget/vi-command/exclusive-goto.impl "$index" "$FLAG" "$REG" nobell
-}
-function ble/widget/vi-command/nth-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- [[ $FLAG ]] || ble/keymap:vi/mark/set-jump # ``
- ble/widget/vi-command/linewise-goto.impl 0:$((ARG-1)) "$FLAG" "$REG"
-}
-function ble/widget/vi-command/nth-last-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- [[ $FLAG ]] || ble/keymap:vi/mark/set-jump # ``
- ble/widget/vi-command/linewise-goto.impl ${#_ble_edit_str}:$((-(ARG-1))) "$FLAG" "$REG"
-}
-function ble/widget/vi-command/history-beginning {
- local ARG FLAG REG; ble/keymap:vi/get-arg 0
- if [[ $FLAG ]]; then
- if ((ARG)); then
- _ble_keymap_vi_oparg=$ARG
- else
- _ble_keymap_vi_oparg=
- fi
- _ble_keymap_vi_opfunc=$FLAG
- _ble_keymap_vi_reg=$REG
- ble/widget/vi-command/nth-line
- return "$?"
- fi
- if ((ARG)); then
- ble-edit/history/goto $((ARG-1))
- else
- ble/widget/history-beginning
- fi
- ble/keymap:vi/needs-eol-fix && ((_ble_edit_ind--))
- ble/keymap:vi/adjust-command-mode
- return 0
-}
-function ble/widget/vi-command/history-end {
- local ARG FLAG REG; ble/keymap:vi/get-arg 0
- if [[ $FLAG ]]; then
- _ble_keymap_vi_opfunc=$FLAG
- _ble_keymap_vi_reg=$REG
- if ((ARG)); then
- _ble_keymap_vi_oparg=$ARG
- ble/widget/vi-command/nth-line
- else
- _ble_keymap_vi_oparg=
- ble/widget/vi-command/nth-last-line
- fi
- return "$?"
- fi
- if ((ARG)); then
- ble-edit/history/goto $((ARG-1))
- else
- ble/widget/history-end
- fi
- ble/keymap:vi/needs-eol-fix && ((_ble_edit_ind--))
- ble/keymap:vi/adjust-command-mode
- return 0
-}
-function ble/widget/vi-command/last-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 0
- [[ $FLAG ]] || ble/keymap:vi/mark/set-jump # ``
- if ((ARG)); then
- ble/widget/vi-command/linewise-goto.impl 0:$((ARG-1)) "$FLAG" "$REG"
- else
- ble/widget/vi-command/linewise-goto.impl ${#_ble_edit_str}:0 "$FLAG" "$REG"
- fi
-}
-function ble/widget/vi-command/first-nol {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi-command/linewise-goto.impl 0:$((ARG-1)) "$FLAG" "$REG"
-}
-function ble/widget/vi-command/last-eol {
- local ARG FLAG REG; ble/keymap:vi/get-arg ''
- local ret index
- if [[ $ARG ]]; then
- ble-edit/content/find-logical-eol 0 $((ARG-1)); index=$ret
- else
- ble-edit/content/find-logical-eol ${#_ble_edit_str}; index=$ret
- fi
- ble/keymap:vi/needs-eol-fix "$index" && ((index--))
- ble/widget/vi-command/inclusive-goto.impl "$index" "$FLAG" "$REG" nobell
-}
-function ble/widget/vi_nmap/replace-char.impl {
- local key=$1 overwrite_mode=${2:-R}
- _ble_edit_overwrite_mode=
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret
- if ((key==(_ble_decode_Ctrl|91))); then # C-[
- ble/keymap:vi/adjust-command-mode
- return 27
- elif ! ble/keymap:vi/k2c "$key"; then
- ble/widget/vi-command/bell
- return 1
- fi
- local pos=$_ble_edit_ind
- ble/keymap:vi/mark/start-edit-area
- {
- local -a KEYS; KEYS=("$ret")
- local _ble_edit_arg=$ARG
- local _ble_edit_overwrite_mode=$overwrite_mode
- local ble_widget_self_insert_opts=nolineext
- ble/widget/self-insert
- ble/util/unlocal KEYS
- }
- ble/keymap:vi/mark/end-edit-area
- ble/keymap:vi/repeat/record
- ((pos<_ble_edit_ind&&_ble_edit_ind--))
- ble/keymap:vi/adjust-command-mode
- return 0
-}
-function ble/widget/vi_nmap/replace-char.hook {
- ble/widget/vi_nmap/replace-char.impl "$1" R
-}
-function ble/widget/vi_nmap/replace-char {
- _ble_edit_overwrite_mode=R
- ble/keymap:vi/async-read-char ble/widget/vi_nmap/replace-char.hook
-}
-function ble/widget/vi_nmap/virtual-replace-char.hook {
- ble/widget/vi_nmap/replace-char.impl "$1" 1
-}
-function ble/widget/vi_nmap/virtual-replace-char {
- _ble_edit_overwrite_mode=1
- ble/keymap:vi/async-read-char ble/widget/vi_nmap/virtual-replace-char.hook
-}
-function ble/widget/vi_nmap/connect-line-with-space {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret
- ble-edit/content/find-logical-eol; local eol1=$ret
- ble-edit/content/find-logical-eol "$_ble_edit_ind" $((ARG<=1?1:ARG-1)); local eol2=$ret
- ble-edit/content/find-logical-bol "$eol2"; local bol2=$ret
- if ((eol1<eol2)); then
- local text=${_ble_edit_str:eol1:eol2-eol1}
- text=${text//$'\n'/' '}
- ble/widget/.replace-range "$eol1" "$eol2" "$text"
- ble/keymap:vi/mark/set-previous-edit-area "$eol1" "$eol2"
- ble/keymap:vi/repeat/record
- _ble_edit_ind=$((bol2-1))
- ble/keymap:vi/adjust-command-mode
- return 0
- else
- ble/widget/vi-command/bell
- return 1
- fi
-}
-function ble/widget/vi_nmap/connect-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret
- ble-edit/content/find-logical-eol; local eol1=$ret
- ble-edit/content/find-logical-eol "$_ble_edit_ind" $((ARG<=1?1:ARG-1)); local eol2=$ret
- ble-edit/content/find-logical-bol "$eol2"; local bol2=$ret
- if ((eol1<eol2)); then
- local text=${_ble_edit_str:eol1:bol2-eol1}
- text=${text//$'\n'}
- ble/widget/.replace-range "$eol1" "$bol2" "$text"
- local delta=$((${#text}-(bol2-eol1)))
- ble/keymap:vi/mark/set-previous-edit-area "$eol1" $((eol2+delta))
- ble/keymap:vi/repeat/record
- _ble_edit_ind=$((bol2+delta))
- ble/keymap:vi/adjust-command-mode
- return 0
- else
- ble/widget/vi-command/bell
- return 1
- fi
-}
-function ble/widget/vi_nmap/insert-mode-at-forward-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret
- ble-edit/content/find-logical-bol; local bol=$ret
- ble-edit/content/find-logical-eol; local eol=$ret
- ble-edit/content/find-non-space "$bol"; local indent=${_ble_edit_str:bol:ret-bol}
- _ble_edit_ind=$eol
- ble/widget/.insert-string $'\n'"$indent"
- ble/widget/vi_nmap/.insert-mode "$ARG"
- ble/keymap:vi/repeat/record
- return 0
-}
-function ble/widget/vi_nmap/insert-mode-at-backward-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret
- ble-edit/content/find-logical-bol; local bol=$ret
- ble-edit/content/find-non-space "$bol"; local indent=${_ble_edit_str:bol:ret-bol}
- _ble_edit_ind=$bol
- ble/widget/.insert-string "$indent"$'\n'
- _ble_edit_ind=$((bol+${#indent}))
- ble/widget/vi_nmap/.insert-mode "$ARG"
- ble/keymap:vi/repeat/record
- return 0
-}
-_ble_keymap_vi_char_search=
-function ble/widget/vi-command/search-char.impl/core {
- local opts=$1 key=$2
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret c
- [[ $opts != *p* ]]; local isprev=$?
- [[ $opts != *r* ]]; local isrepeat=$?
- if ((isrepeat)); then
- c=$key
- elif ((key==(_ble_decode_Ctrl|91))); then # C-[ -> cancel
- return 27
- else
- ble/keymap:vi/k2c "$key" || return 1
- ble/util/c2s "$ret"; local c=$ret
- fi
- [[ $c ]] || return 1
- ((isrepeat)) || _ble_keymap_vi_char_search=$c$opts
- local index
- if [[ $opts == *b* ]]; then
- ble-edit/content/find-logical-bol; local bol=$ret
- local base=$_ble_edit_ind
- ((isrepeat&&isprev&&base--,base>bol)) || return 1
- local line=${_ble_edit_str:bol:base-bol}
- ble/string#last-index-of "$line" "$c" "$ARG"
- ((ret>=0)) || return 1
- ((index=bol+ret,isprev&&index++))
- ble/widget/vi-command/exclusive-goto.impl "$index" "$FLAG" "$REG" nobell
- return "$?"
- else
- ble-edit/content/find-logical-eol; local eol=$ret
- local base=$((_ble_edit_ind+1))
- ((isrepeat&&isprev&&base++,base<eol)) || return 1
- local line=${_ble_edit_str:base:eol-base}
- ble/string#index-of "$line" "$c" "$ARG"
- ((ret>=0)) || return 1
- ((index=base+ret,isprev&&index--))
- ble/widget/vi-command/inclusive-goto.impl "$index" "$FLAG" "$REG" nobell
- return "$?"
- fi
-}
-function ble/widget/vi-command/search-char.impl {
- if ble/widget/vi-command/search-char.impl/core "$1" "$2"; then
- ble/keymap:vi/adjust-command-mode
- return 0
- else
- ble/widget/vi-command/bell
- return 1
- fi
-}
-function ble/widget/vi-command/search-forward-char {
- ble/keymap:vi/async-read-char ble/widget/vi-command/search-char.impl f
-}
-function ble/widget/vi-command/search-forward-char-prev {
- ble/keymap:vi/async-read-char ble/widget/vi-command/search-char.impl fp
-}
-function ble/widget/vi-command/search-backward-char {
- ble/keymap:vi/async-read-char ble/widget/vi-command/search-char.impl b
-}
-function ble/widget/vi-command/search-backward-char-prev {
- ble/keymap:vi/async-read-char ble/widget/vi-command/search-char.impl bp
-}
-function ble/widget/vi-command/search-char-repeat {
- [[ $_ble_keymap_vi_char_search ]] || ble/widget/.bell
- local c=${_ble_keymap_vi_char_search::1} opts=${_ble_keymap_vi_char_search:1}
- ble/widget/vi-command/search-char.impl "r$opts" "$c"
-}
-function ble/widget/vi-command/search-char-reverse-repeat {
- [[ $_ble_keymap_vi_char_search ]] || ble/widget/.bell
- local c=${_ble_keymap_vi_char_search::1} opts=${_ble_keymap_vi_char_search:1}
- if [[ $opts == *b* ]]; then
- opts=f${opts//b}
- else
- opts=b${opts//f}
- fi
- ble/widget/vi-command/search-char.impl "r$opts" "$c"
-}
-function ble/widget/vi-command/search-matchpair/.search-forward {
- ble/string#index-of-chars "$_ble_edit_str" "$ch1$ch2" $((index+1))
-}
-function ble/widget/vi-command/search-matchpair/.search-backward {
- ble/string#last-index-of-chars "$_ble_edit_str" "$ch1$ch2" "$index"
-}
-function ble/widget/vi-command/search-matchpair-or {
- local ARG FLAG REG; ble/keymap:vi/get-arg -1
- if ((ARG>=0)); then
- _ble_keymap_vi_oparg=$ARG
- _ble_keymap_vi_opfunc=$FLAG
- _ble_keymap_vi_reg=$REG
- ble/widget/"$@"
- return "$?"
- fi
- local open='({[' close=')}]'
- local ret
- ble-edit/content/find-logical-eol; local eol=$ret
- if ! ble/string#index-of-chars "${_ble_edit_str::eol}" '(){}[]' "$_ble_edit_ind"; then
- ble/keymap:vi/adjust-command-mode
- return 1
- fi
- local index1=$ret ch1=${_ble_edit_str:ret:1}
- if [[ $ch1 == ["$open"] ]]; then
- local i=${open%%"$ch"*}; i=${#i}
- local ch2=${close:i:1}
- local searcher=ble/widget/vi-command/search-matchpair/.search-forward
- else
- local i=${close%%"$ch"*}; i=${#i}
- local ch2=${open:i:1}
- local searcher=ble/widget/vi-command/search-matchpair/.search-backward
- fi
- local index=$index1 count=1
- while "$searcher"; do
- index=$ret
- if [[ ${_ble_edit_str:ret:1} == "$ch1" ]]; then
- ((++count))
- else
- ((--count==0)) && break
- fi
- done
- if ((count)); then
- ble/keymap:vi/adjust-command-mode
- return 1
- fi
- [[ $FLAG ]] || ble/keymap:vi/mark/set-jump # ``
- ble/widget/vi-command/inclusive-goto.impl "$index" "$FLAG" "$REG" nobell
-}
-function ble/widget/vi-command/percentage-line {
- local ARG FLAG REG; ble/keymap:vi/get-arg 0
- local ret; ble/string#count-char "$_ble_edit_str" $'\n'; local nline=$((ret+1))
- local iline=$(((ARG*nline+99)/100))
- ble/widget/vi-command/linewise-goto.impl 0:$((iline-1)) "$FLAG" "$REG"
-}
-function ble/widget/vi-command/nth-byte {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ((ARG--))
- local offset=0 text=$_ble_edit_str len=${#_ble_edit_str}
- local left nleft ret
- while ((ARG>0&&len>1)); do
- left=${text::len/2}
- ble/util/strlen "$left"; nleft=$ret
- if ((ARG<nleft)); then
- text=$left
- ((len/=2))
- else
- text=${text:len/2}
- ((offset+=len/2,
- ARG-=nleft,
- len-=len/2))
- fi
- done
- ble/keymap:vi/needs-eol-fix "$offset" && ((offset--))
- ble/widget/vi-command/exclusive-goto.impl "$offset" "$FLAG" "$REG" nobell
-}
-_ble_keymap_vi_text_object=
-function ble/keymap:vi/text-object/word.extend-forward {
- local rex
- flags=
- [[ ${_ble_edit_str:beg:1} == ["$ifs"] ]] && flags=${flags}A
- if [[ $_ble_decode_keymap != vi_[xs]map ]]; then
- flags=${flags}I
- elif ((_ble_edit_mark==_ble_edit_ind)); then
- flags=${flags}I
- fi
- local rex_unit
- local W='('$rex_word')' b='['$space']' n=$nl
- if [[ $type == i* ]]; then
- rex_unit='^'$W'|^'$b'+|^'$n
- elif [[ $type == a* ]]; then
- rex_unit='^'$W$b'*|^'$b'+'$W'|^'$b'*'$n'('$b'+'$n')*('$n'|'$b'*'$W')'
- else
- return 1
- fi
- local i rematch=
- for ((i=0;i<arg;i++)); do
- if ((i==0)) && [[ $flags == *I* ]]; then
- rex='('$rex_word')$|['$space']*['$ifs']$'
- [[ ${_ble_edit_str::beg+1} =~ $rex ]] &&
- ((beg-=${#BASH_REMATCH}-1,end=beg))
- else
- [[ ${_ble_edit_str:end:1} == $'\n' ]] && ((end++))
- fi
- [[ ${_ble_edit_str:end} =~ $rex_unit ]] || return 1
- rematch=$BASH_REMATCH
- ((end+=${#rematch}))
- [[ $type == a* && $rematch == *$'\n\n' ]] && ((end--))
- if ((i==0)) && [[ $flags == *I* ]] || ((i==arg-1)); then
- [[ $type == i* && $rematch == *"$nl" ]] && ((end--))
- fi
- done
- [[ ${_ble_edit_str:end-1:1} == *["$ifs"] ]] && flags=${flags}Z
- if [[ $type == a* && $flags != *[AZ]* ]]; then
- if rex='['$space']+$'; [[ ${_ble_edit_str::beg} =~ $rex ]]; then
- local p=$((beg-${#BASH_REMATCH}))
- ble-edit/content/bolp "$p" || beg=$p
- fi
- fi
- return 0
-}
-function ble/keymap:vi/text-object/word.extend-backward {
- local rex_unit=
- local W='('$rex_word')' b='['$space']' n=$nl
- if [[ $type == i* ]]; then
- rex_unit='('$W'|'$b'+)'$n'?$|'$n'$'
- elif [[ $type == a* ]]; then
- rex_unit=$b'*'$W$n'?$|'$W'?'$b'*('$n'('$b'+'$n')*'$b'*)?('$b$n'?|'$n')$'
- else
- return 1
- fi
- local count=$arg
- while ((count--)); do
- [[ ${_ble_edit_str::beg} =~ $rex_unit ]] || return 1
- ((beg-=${#BASH_REMATCH}))
- local match=${BASH_REMATCH%"$nl"}
- if ((beg==0&&${#match}>=2)); then
- if [[ $type == i* ]]; then
- [[ $match == ["$space"]* ]] && beg=1
- elif [[ $type == a* ]]; then
- [[ $match == *[!"$ifs"] ]] && beg=1
- fi
- fi
- done
- return 0
-}
-function ble/keymap:vi/text-object/word.impl {
- local arg=$1 flag=$2 reg=$3 type=$4
- local space=$' \t' nl=$'\n' ifs=$_ble_term_IFS
- ((arg==0)) && return 0
- local rex_word
- if [[ $type == ?W ]]; then
- rex_word="[^$ifs]+"
- else
- rex_word=$_ble_keymap_vi_REX_WORD
- fi
- local index=$_ble_edit_ind
- if [[ $_ble_decode_keymap == vi_[xs]map ]]; then
- if ((index<_ble_edit_mark)); then
- local beg=$index
- if ble/keymap:vi/text-object/word.extend-backward; then
- _ble_edit_ind=$beg
- else
- _ble_edit_ind=0
- ble/widget/.bell
- fi
- ble/keymap:vi/adjust-command-mode
- return 0
- fi
- fi
- local beg=$index end=$index flags=
- if ! ble/keymap:vi/text-object/word.extend-forward; then
- index=${#_ble_edit_str}
- ble-edit/content/nonbol-eolp "$index" && ((index--))
- _ble_edit_ind=$index
- ble/widget/vi-command/bell
- return 1
- fi
- if [[ $_ble_decode_keymap == vi_[xs]map ]]; then
- ((end--))
- ble-edit/content/nonbol-eolp "$end" && ((end--))
- ((beg<_ble_edit_mark)) && _ble_edit_mark=$beg
- [[ $_ble_edit_mark_active == vi_line ]] &&
- _ble_edit_mark_active=vi_char
- _ble_edit_ind=$end
- ble/keymap:vi/adjust-command-mode
- return 0
- else
- ble/widget/vi-command/exclusive-range.impl "$beg" "$end" "$flag" "$reg"
- fi
-}
-function ble/keymap:vi/text-object:quote/.next {
- local index=${1:-$((_ble_edit_ind+1))} nl=$'\n'
- local rex="^[^$nl$quote]*$quote"
- [[ ${_ble_edit_str:index} =~ $rex ]] || return 1
- ((ret=index+${#BASH_REMATCH}-1))
- return 0
-}
-function ble/keymap:vi/text-object:quote/.prev {
- local index=${1:-_ble_edit_ind} nl=$'\n'
- local rex="$quote[^$nl$quote]*\$"
- [[ ${_ble_edit_str::index} =~ $rex ]] || return 1
- ((ret=index-${#BASH_REMATCH}))
- return 0
-}
-function ble/keymap:vi/text-object/quote.impl {
- local arg=$1 flag=$2 reg=$3 type=$4
- local ret quote=${type:1}
- if [[ $_ble_decode_keymap == vi_[xs]map ]]; then
- if ble/keymap:vi/text-object:quote/.xmap; then
- ble/keymap:vi/adjust-command-mode
- return 0
- else
- ble/widget/vi-command/bell
- return 1
- fi
- fi
- local beg= end=
- if [[ ${_ble_edit_str:_ble_edit_ind:1} == "$quote" ]]; then
- ble-edit/content/find-logical-bol; local bol=$ret
- ble/string#count-char "${_ble_edit_str:bol:_ble_edit_ind-bol}" "$quote"
- if ((ret%2==1)); then
- ((end=_ble_edit_ind+1))
- ble/keymap:vi/text-object:quote/.prev && beg=$ret
- else
- ((beg=_ble_edit_ind))
- ble/keymap:vi/text-object:quote/.next && end=$((ret+1))
- fi
- elif ble/keymap:vi/text-object:quote/.prev && beg=$ret; then
- ble/keymap:vi/text-object:quote/.next && end=$((ret+1))
- elif ble/keymap:vi/text-object:quote/.next && beg=$ret; then
- ble/keymap:vi/text-object:quote/.next $((beg+1)) && end=$((ret+1))
- fi
- if [[ $beg && $end ]]; then
- [[ $type == i* || arg -gt 1 ]] && ((beg++,end--))
- ble/widget/vi-command/exclusive-range.impl "$beg" "$end" "$flag" "$reg"
- else
- ble/widget/vi-command/bell
- return 1
- fi
-}
-function ble/keymap:vi/text-object:quote/.expand-xmap-range {
- local inclusive=$1
- ((end++))
- if ((inclusive==2)); then
- local rex
- rex=$'^[ \t]+'; [[ ${_ble_edit_str:end} =~ $rex ]] && ((end+=${#BASH_REMATCH}))
- elif ((inclusive==0&&end-beg>2)); then
- ((beg++,end--))
- fi
-}
-function ble/keymap:vi/text-object:quote/.xmap {
- local min=$_ble_edit_ind max=$_ble_edit_mark
- ((min>max)) && local min=$max max=$min
- [[ ${_ble_edit_str:min:max+1-min} == *$'\n'* ]] && return 1
- local inclusive=0
- if [[ $type == a* ]]; then
- inclusive=2
- elif ((arg>1)); then
- inclusive=1
- fi
- local ret
- if ((_ble_edit_ind==_ble_edit_mark)); then
- ble/keymap:vi/text-object:quote/.prev $((_ble_edit_ind+1)) ||
- ble/keymap:vi/text-object:quote/.next $((_ble_edit_ind+1)) || return 1
- local beg=$ret
- ble/keymap:vi/text-object:quote/.next $((beg+1)) || return 1
- local end=$ret
- ble/keymap:vi/text-object:quote/.expand-xmap-range "$inclusive"
- _ble_edit_mark=$beg
- _ble_edit_ind=$((end-1))
- return 0
- elif ((_ble_edit_ind>_ble_edit_mark)); then
- local updates_mark=
- if [[ ${_ble_edit_str:_ble_edit_ind:1} == "$quote" ]]; then
- ble/keymap:vi/text-object:quote/.next $((_ble_edit_ind+1)) || return 1; local beg=$ret
- if ble/keymap:vi/text-object:quote/.next $((beg+1)); then
- local end=$ret
- else
- local end=$beg beg=$_ble_edit_ind
- fi
- else
- ble-edit/content/find-logical-bol; local bol=$ret
- ble/string#count-char "${_ble_edit_str:bol:_ble_edit_ind-bol}" "$quote"
- if ((ret%2==0)); then
- ble/keymap:vi/text-object:quote/.next $((_ble_edit_ind+1)) || return 1; local beg=$ret
- ble/keymap:vi/text-object:quote/.next $((beg+1)) || return 1; local end=$ret
- else
- ble/keymap:vi/text-object:quote/.prev "$_ble_edit_ind" || return 1; local beg=$ret
- ble/keymap:vi/text-object:quote/.next $((_ble_edit_ind+1)) || return 1; local end=$ret
- fi
- local i1=$((_ble_edit_mark?_ble_edit_mark-1:0))
- [[ ${_ble_edit_str:i1:_ble_edit_ind-i1} != *"$quote"* ]] && updates_mark=1
- fi
- ble/keymap:vi/text-object:quote/.expand-xmap-range "$inclusive"
- [[ $updates_mark ]] && _ble_edit_mark=$beg
- _ble_edit_ind=$((end-1))
- return 0
- else
- ble-edit/content/find-logical-bol; local bol=$ret nl=$'\n'
- local rex="^([^$nl$quote]*$quote[^$nl$quote]*$quote)*[^$nl$quote]*$quote"
- [[ ${_ble_edit_str:bol:_ble_edit_ind-bol} =~ $rex ]] || return 1
- local beg=$((bol+${#BASH_REMATCH}-1))
- ble/keymap:vi/text-object:quote/.next $((beg+1)) || return 1
- local end=$ret
- ble/keymap:vi/text-object:quote/.expand-xmap-range "$inclusive"
- [[ ${_ble_edit_str:_ble_edit_ind:_ble_edit_mark+2-_ble_edit_ind} != *"$quote"* ]] && _ble_edit_mark=$((end-1))
- _ble_edit_ind=$beg
- return 0
- fi
-}
-function ble/keymap:vi/text-object/block.impl {
- local arg=$1 flag=$2 reg=$3 type=$4
- local ret paren=${type:1} lparen=${type:1:1} rparen=${type:2:1}
- local axis=$_ble_edit_ind
- [[ ${_ble_edit_str:axis:1} == "$lparen" ]] && ((axis++))
- local count=$arg beg=$axis
- while ble/string#last-index-of-chars "$_ble_edit_str" "$paren" "$beg"; do
- beg=$ret
- if [[ ${_ble_edit_str:beg:1} == "$lparen" ]]; then
- ((--count==0)) && break
- else
- ((++count))
- fi
- done
- if ((count)); then
- ble/widget/vi-command/bell
- return 1
- fi
- local count=$arg end=$axis
- while ble/string#index-of-chars "$_ble_edit_str" "$paren" "$end"; do
- end=$((ret+1))
- if [[ ${_ble_edit_str:end-1:1} == "$rparen" ]]; then
- ((--count==0)) && break
- else
- ((++count))
- fi
- done
- if ((count)); then
- ble/widget/vi-command/bell
- return 1
- fi
- local linewise=
- if [[ $type == *i* ]]; then
- ((beg++,end--))
- [[ ${_ble_edit_str:beg:1} == $'\n' ]] && ((beg++))
- ((beg<end)) && ble-edit/content/bolp "$end" && ((end--))
- ((beg<end)) && ble-edit/content/bolp "$beg" && ble-edit/content/eolp "$end" && linewise=1
- fi
- if [[ $_ble_decode_keymap == vi_[xs]map ]]; then
- _ble_edit_mark=$beg
- ble/widget/vi-command/exclusive-goto.impl "$end"
- elif [[ $linewise ]]; then
- ble/widget/vi-command/linewise-range.impl "$beg" "$end" "$flag" "$reg" goto_bol
- else
- ble/widget/vi-command/exclusive-range.impl "$beg" "$end" "$flag" "$reg"
- fi
-}
-function ble/keymap:vi/text-object:tag/.find-end-tag {
- local ifs=$_ble_term_IFS ret rex
- rex="^<([^$ifs/>!]+)"; [[ ${_ble_edit_str:beg} =~ $rex ]] || return 1
- ble/string#escape-for-extended-regex "${BASH_REMATCH[1]}"; local tagname=$ret
- rex="^</?$tagname([$ifs]+([^>]*[^/])?)?>"
- end=$beg
- local count=0
- while ble/string#index-of-chars "$_ble_edit_str" '<' "$end" && end=$((ret+1)); do
- [[ ${_ble_edit_str:end-1} =~ $rex ]] || continue
- ((end+=${#BASH_REMATCH}-1))
- if [[ ${BASH_REMATCH::2} == '</' ]]; then
- ((--count==0)) && return 0
- else
- ((++count))
- fi
- done
- return 1
-}
-function ble/keymap:vi/text-object/tag.impl {
- local arg=$1 flag=$2 reg=$3 type=$4
- local ret rex
- local pivot=$_ble_edit_ind ret=$_ble_edit_ind
- if [[ ${_ble_edit_str:ret:1} == '<' ]] || ble/string#last-index-of-chars "${_ble_edit_str::_ble_edit_ind}" '<>'; then
- if rex='^<[^/][^>]*>' && [[ ${_ble_edit_str:ret} =~ $rex ]]; then
- ((pivot=ret+${#BASH_REMATCH}))
- else
- ((pivot=ret+1))
- fi
- fi
- local ifs=$_ble_term_IFS
- local beg=$pivot count=$arg
- rex="<([^$ifs/>!]+([$ifs]+([^>]*[^/])?)?|/[^>]*)>\$"
- while ble/string#last-index-of-chars "${_ble_edit_str::beg}" '>' && beg=$ret; do
- [[ ${_ble_edit_str::beg+1} =~ $rex ]] || continue
- ((beg-=${#BASH_REMATCH}-1))
- if [[ ${BASH_REMATCH::2} == '</' ]]; then
- ((++count))
- else
- if ((--count==0)); then
- if ble/keymap:vi/text-object:tag/.find-end-tag "$beg" && ((_ble_edit_ind<end)); then
- break
- else
- ((count++))
- fi
- fi
- fi
- done
- if ((count)); then
- ble/widget/vi-command/bell
- return 1
- fi
- if [[ $type == i* ]]; then
- rex='^<[^>]*>'; [[ ${_ble_edit_str:beg:end-beg} =~ $rex ]] && ((beg+=${#BASH_REMATCH}))
- rex='<[^>]*>$'; [[ ${_ble_edit_str:beg:end-beg} =~ $rex ]] && ((end-=${#BASH_REMATCH}))
- fi
- if [[ $_ble_decode_keymap == vi_[xs]map ]]; then
- _ble_edit_mark=$beg
- ble/widget/vi-command/exclusive-goto.impl "$end"
- else
- ble/widget/vi-command/exclusive-range.impl "$beg" "$end" "$flag" "$reg"
- fi
-}
-function ble/keymap:vi/text-object:sentence/.beg {
- beg= is_interval=
- local pivot=$_ble_edit_ind rex=
- if ble-edit/content/bolp && ble-edit/content/eolp; then
- if rex=$'^\n+[^\n]'; [[ ${_ble_edit_str:pivot} =~ $rex ]]; then
- beg=$((pivot+${#BASH_REMATCH}-2))
- else
- if rex=$'\n+$'; [[ ${_ble_edit_str::pivot} =~ $rex ]]; then
- ((pivot-=${#BASH_REMATCH}))
- fi
- fi
- fi
- if [[ ! $beg ]]; then
- rex="^.*((^$LF?|$LF$LF)([ $HT]*)|[.!?][])'\"]*([ $HT$LF]+))"
- if [[ ${_ble_edit_str::pivot+1} =~ $rex ]]; then
- beg=${#BASH_REMATCH}
- if ((pivot<beg)); then
- local rematch34=${BASH_REMATCH[3]}${BASH_REMATCH[4]}
- if [[ $rematch34 ]]; then
- beg=$((pivot+1-${#rematch34})) is_interval=1
- else
- beg=$pivot
- fi
- fi
- else
- beg=0
- fi
- fi
-}
-function ble/keymap:vi/text-object:sentence/.next {
- if [[ $is_interval ]]; then
- is_interval=
- local rex=$'[ \t]*((\n[ \t]+)*\n[ \t]*)?'
- [[ ${_ble_edit_str:end} =~ $rex ]]
- local index=$((end+${#BASH_REMATCH}))
- ((end<index)) && [[ ${_ble_edit_str:index-1:1} == $'\n' ]] && ((index--))
- ((end=index))
- else
- is_interval=1
- if local rex=$'^\n+'; [[ ${_ble_edit_str:end} =~ $rex ]]; then
- ((end+=${#BASH_REMATCH}))
- elif rex="(([.!?][])\"']*)[ $HT$LF]|$LF$LF).*\$"; [[ ${_ble_edit_str:end} =~ $rex ]]; then
- local rematch2=${BASH_REMATCH[2]}
- end=$((${#_ble_edit_str}-${#BASH_REMATCH}+${#rematch2}))
- else
- local index=${#_ble_edit_str}
- ((end<index)) && [[ ${_ble_edit_str:index-1:1} == $'\n' ]] && ((index--))
- ((end=index))
- fi
- fi
-}
-function ble/keymap:vi/text-object/sentence.impl {
- local arg=$1 flag=$2 reg=$3 type=$4
- local LF=$'\n' HT=$'\t'
- local rex
- local beg is_interval
- ble/keymap:vi/text-object:sentence/.beg
- local end=$beg i n=$arg
- [[ $type != i* ]] && ((n*=2))
- for ((i=0;i<n;i++)); do
- ble/keymap:vi/text-object:sentence/.next
- done
- ((beg<end)) && [[ ${_ble_edit_str:end-1:1} == $'\n' ]] && ((end--))
- if [[ $type != i* && ! $is_interval ]]; then
- local ifs=$_ble_term_IFS
- if ((end)) && [[ ${_ble_edit_str:end-1:1} != ["$ifs"] ]]; then
- rex="^.*(^$LF?|$LF$LF|[.!?][])'\"]*([ $HT$LF]))([ $HT$LF]*)\$"
- if [[ ${_ble_edit_str::beg} =~ $rex ]]; then
- local rematch2=${BASH_REMATCH[2]}
- local rematch3=${BASH_REMATCH[3]}
- ((beg-=${#rematch2}+${#rematch3}))
- [[ ${_ble_edit_str:beg:1} == $'\n' ]] && ((beg++))
- fi
- fi
- fi
- if [[ $_ble_decode_keymap == vi_[xs]map ]]; then
- _ble_edit_mark=$beg
- ble/widget/vi-command/exclusive-goto.impl "$end"
- elif ble-edit/content/bolp "$beg" && [[ ${_ble_edit_str:end:1} == $'\n' ]]; then
- ble/widget/vi-command/linewise-range.impl "$beg" "$end" "$flag" "$reg" goto_bol
- else
- ble/widget/vi-command/exclusive-range.impl "$beg" "$end" "$flag" "$reg"
- fi
-}
-function ble/keymap:vi/text-object/paragraph.impl {
- local arg=$1 flag=$2 reg=$3 type=$4
- local rex ret
- local beg= empty_start=
- ble-edit/content/find-logical-bol; local bol=$ret
- ble-edit/content/find-non-space "$bol"; local nol=$ret
- if rex=$'[ \t]*(\n|$)' ble-edit/content/eolp "$nol"; then
- empty_start=1
- rex=$'(^|\n)([ \t]*\n)*$'
- [[ ${_ble_edit_str::bol} =~ $rex ]]
- local rematch1=${BASH_REMATCH[1]} # Note: for bash-3.1 ${#arr[n]} bug
- ((beg=bol-(${#BASH_REMATCH}-${#rematch1})))
- else
- if rex=$'^(.*\n)?[ \t]*\n'; [[ ${_ble_edit_str::bol} =~ $rex ]]; then
- ((beg=${#BASH_REMATCH}))
- else
- ((beg=0))
- fi
- fi
- local end=$beg
- local rex_empty_line=$'([ \t]*\n|[ \t]+$)' rex_paragraph_line=$'([ \t]*[^ \t\n][^\n]*(\n|$))'
- if [[ $type == i* ]]; then
- rex="$rex_empty_line+|$rex_paragraph_line+"
- elif [[ $empty_start ]]; then
- rex="$rex_empty_line*$rex_paragraph_line+"
- else
- rex="$rex_paragraph_line+$rex_empty_line*"
- fi
- local i
- for ((i=0;i<arg;i++)); do
- if [[ ${_ble_edit_str:end} =~ $rex ]]; then
- ((end+=${#BASH_REMATCH}))
- else
- ble/widget/vi-command/bell
- return 1
- fi
- done
- if [[ $type != i* && ! $empty_start ]]; then
- if rex=$'(^|\n)[ \t]*\n$'; ! [[ ${_ble_edit_str::end} =~ $rex ]]; then
- if rex=$'(^|\n)([ \t]*\n)*$'; [[ ${_ble_edit_str::beg} =~ $rex ]]; then
- local rematch1=${BASH_REMATCH[1]}
- ((beg-=${#BASH_REMATCH}-${#rematch1}))
- fi
- fi
- fi
- ((beg<end)) && [[ ${_ble_edit_str:end-1:1} == $'\n' ]] && ((end--))
- if [[ $_ble_decode_keymap == vi_[xs]map ]]; then
- _ble_edit_mark=$beg
- ble/widget/vi-command/exclusive-goto.impl "$end"
- else
- ble/widget/vi-command/linewise-range.impl "$beg" "$end" "$flag" "$reg"
- fi
-}
-function ble/keymap:vi/text-object.impl {
- local arg=$1 flag=$2 reg=$3 type=$4
- case "$type" in
- ([ia][wW]) ble/keymap:vi/text-object/word.impl "$arg" "$flag" "$reg" "$type" ;;
- ([ia][\"\'\`]) ble/keymap:vi/text-object/quote.impl "$arg" "$flag" "$reg" "$type" ;;
- ([ia]['b()']) ble/keymap:vi/text-object/block.impl "$arg" "$flag" "$reg" "${type::1}()" ;;
- ([ia]['B{}']) ble/keymap:vi/text-object/block.impl "$arg" "$flag" "$reg" "${type::1}{}" ;;
- ([ia]['<>']) ble/keymap:vi/text-object/block.impl "$arg" "$flag" "$reg" "${type::1}<>" ;;
- ([ia]['][']) ble/keymap:vi/text-object/block.impl "$arg" "$flag" "$reg" "${type::1}[]" ;;
- ([ia]t) ble/keymap:vi/text-object/tag.impl "$arg" "$flag" "$reg" "$type" ;;
- ([ia]s) ble/keymap:vi/text-object/sentence.impl "$arg" "$flag" "$reg" "$type" ;;
- ([ia]p) ble/keymap:vi/text-object/paragraph.impl "$arg" "$flag" "$reg" "$type" ;;
- (*)
- ble/widget/vi-command/bell
- return 1;;
- esac
-}
-function ble/keymap:vi/text-object.hook {
- local key=$1
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- if ! ble-decode-key/ischar "$key"; then
- ble/widget/vi-command/bell
- return 1
- fi
- local ret; ble/util/c2s "$key"
- local type=$_ble_keymap_vi_text_object$ret
- ble/keymap:vi/text-object.impl "$ARG" "$FLAG" "$REG" "$type"
- return 0
-}
-function ble/keymap:vi/.check-text-object {
- local n=${#KEYS[@]}; ((n&&n--))
- ble-decode-key/ischar "${KEYS[n]}" || return 1
- local ret; ble/util/c2s "${KEYS[n]}"; local c=$ret
- [[ $c == [ia] ]] || return 1
- [[ $_ble_keymap_vi_opfunc || $_ble_decode_keymap == vi_[xs]map ]] || return 1
- _ble_keymap_vi_text_object=$c
- _ble_decode_key__hook=ble/keymap:vi/text-object.hook
- return 0
-}
-function ble/widget/vi-command/text-object {
- ble/keymap:vi/.check-text-object && return 0
- ble/widget/vi-command/bell
- return 1
-}
-_ble_keymap_vi_commandline_history=()
-_ble_keymap_vi_commandline_history_edit=()
-_ble_keymap_vi_commandline_history_dirt=()
-_ble_keymap_vi_commandline_history_index=0
-_ble_keymap_vi_cmap_is_cancel_key[63|_ble_decode_Ctrl]=1 # C-?
-_ble_keymap_vi_cmap_is_cancel_key[127]=1 # DEL
-_ble_keymap_vi_cmap_is_cancel_key[104|_ble_decode_Ctrl]=1 # C-h
-_ble_keymap_vi_cmap_is_cancel_key[8]=1 # BS
-function ble/keymap:vi/commandline/before-command.hook {
- if [[ ! $_ble_edit_str ]] && ((_ble_keymap_vi_cmap_is_cancel_key[KEYS[0]])); then
- ble/widget/vi_cmap/cancel
- ble/decode/widget/suppress-widget
- fi
-}
-function ble/widget/vi-command/commandline {
- ble/keymap:vi/clear-arg
- ble/keymap:vi/async-commandline-mode ble/widget/vi-command/commandline.hook
- _ble_edit_PS1=:
- ble/history/set-prefix _ble_keymap_vi_commandline
- _ble_keymap_vi_cmap_before_command=ble/keymap:vi/commandline/before-command.hook
- return 147
-}
-function ble/widget/vi-command/commandline.hook {
- local command
- ble/string#split-words command "$1"
- local cmd="ble/widget/vi-command:${command[0]}"
- if ble/is-function "$cmd"; then
- "$cmd" "${command[@]:1}"; local ext=$?
- else
- ble/widget/vi-command/bell "unknown command $1"; local ext=1
- fi
- [[ $1 ]] && _ble_keymap_vi_register[58]=/$result # ":
- return "$ext"
-}
-function ble/widget/vi-command:w {
- if [[ $1 ]]; then
- ble/builtin/history -a "$1"
- local file=$1
- else
- ble/builtin/history -a
- local file=${HISTFILE:-'~/.bash_history'}
- fi
- local wc
- ble/util/assign wc 'ble/bin/wc "$file"'
- ble/string#split-words wc "$wc"
- ble/edit/info/show text "\"$file\" ${wc[0]}L, ${wc[2]}C written"
- ble/keymap:vi/adjust-command-mode
- return 0
-}
-function ble/widget/vi-command:q! {
- ble/widget/exit force
- return 1
-}
-function ble/widget/vi-command:q {
- ble/widget/exit
- ble/keymap:vi/adjust-command-mode # ジョブがあるときは終了しないので。
- return 1
-}
-function ble/widget/vi-command:wq {
- ble/widget/vi-command:w "$@"
- ble/widget/exit
- ble/keymap:vi/adjust-command-mode
- return 1
-}
-_ble_keymap_vi_search_obackward=
-_ble_keymap_vi_search_ohistory=
-_ble_keymap_vi_search_needle=
-_ble_keymap_vi_search_activate=
-_ble_keymap_vi_search_matched=
-_ble_keymap_vi_search_history=()
-_ble_keymap_vi_search_history_edit=()
-_ble_keymap_vi_search_history_dirt=()
-_ble_keymap_vi_search_history_index=0
-bleopt/declare -v keymap_vi_search_match_current ''
-function ble/highlight/layer:region/mark:vi_search/get-selection {
- ble/highlight/layer:region/mark:vi_char/get-selection
-}
-function ble/keymap:vi/search/matched {
- [[ $_ble_keymap_vi_search_matched || $_ble_edit_mark_active == vi_search || $_ble_keymap_vi_search_activate ]]
-}
-function ble/keymap:vi/search/clear-matched {
- _ble_keymap_vi_search_activate=
- _ble_keymap_vi_search_matched=
- [[ $_ble_edit_mark_active == vi_search ]] && _ble_edit_mark_active=
-}
-function ble/keymap:vi/search/invoke-search {
- local needle=$1
- local dir=+; ((opt_backward)) && dir=B
- local ind=$_ble_edit_ind
- if ((opt_optional_next)); then
- if ((!opt_backward)); then
- ((_ble_edit_ind<${#_ble_edit_str}&&_ble_edit_ind++))
- fi
- elif ((opt_locate)) || ! ble/keymap:vi/search/matched; then
- if ((opt_locate)) || [[ $bleopt_keymap_vi_search_match_current ]]; then
- if ((opt_backward)); then
- ble-edit/content/eolp || ((_ble_edit_ind++))
- fi
- else
- if ((!opt_backward)); then
- ble-edit/content/eolp || ((_ble_edit_ind++))
- fi
- fi
- else
- if ((!opt_backward)); then
- if [[ $_ble_decode_keymap == vi_[xs]map ]]; then
- if ble-edit/isearch/search "$@" && ((beg==_ble_edit_ind)); then
- _ble_edit_ind=$end
- else
- ((_ble_edit_ind<${#_ble_edit_str}&&_ble_edit_ind++))
- fi
- else
- ((_ble_edit_ind=_ble_edit_mark))
- ble-edit/content/eolp || ((_ble_edit_ind++))
- fi
- else
- dir=-
- fi
- fi
- ble-edit/isearch/search "$needle" "$dir":regex; local ret=$?
- _ble_edit_ind=$ind
- return "$ret"
-}
-function ble/widget/vi-command/search.core {
- local beg= end= is_empty_match=
- if ble/keymap:vi/search/invoke-search "$needle"; then
- if ((beg<end)); then
- ble-edit/content/bolp "$end" || ((end--))
- _ble_edit_ind=$beg # eol 補正は search.impl 側で最後に行う
- [[ $_ble_decode_keymap != vi_[xs]map ]] && _ble_edit_mark=$end
- _ble_keymap_vi_search_activate=vi_search
- return 0
- else
- opt_history=
- is_empty_match=1
- fi
- fi
- if ((opt_history)) && [[ $_ble_history_load_done || opt_backward -ne 0 ]]; then
- ble/history/initialize
- local index; ble/history/get-index
- [[ $start ]] || start=$index
- if ((opt_backward)); then
- ((index--))
- else
- ((index++))
- fi
- local _ble_edit_isearch_dir=+; ((opt_backward)) && _ble_edit_isearch_dir=-
- local _ble_edit_isearch_str=$needle
- local isearch_ntask=$ntask
- local isearch_time=0
- local isearch_progress_callback=ble-edit/isearch/.show-status-with-progress.fib
- if ((opt_backward)); then
- ble/history/isearch-backward-blockwise regex:progress
- else
- ble/history/isearch-forward regex:progress
- fi; local r=$?
- ble/edit/info/default
- if ((r==0)); then
- local new_index; ble/history/get-index -v new_index
- [[ $index != "$new_index" ]] &&
- ble-edit/history/goto "$index"
- if ((opt_backward)); then
- local i=${#_ble_edit_str}
- ble/keymap:vi/needs-eol-fix "$i" && ((i--))
- _ble_edit_ind=$i
- else
- _ble_edit_ind=0
- fi
- opt_locate=1 opt_history=0 ble/widget/vi-command/search.core
- return "$?"
- fi
- fi
- if ((!opt_optional_next)); then
- if [[ $is_empty_match ]]; then
- ble/widget/.bell "search: empty match"
- else
- ble/widget/.bell "search: not found"
- fi
- if [[ $_ble_edit_mark_active == vi_search ]]; then
- _ble_keymap_vi_search_activate=vi_search
- fi
- fi
- return 1
-}
-function ble/widget/vi-command/search.impl {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local opts=$1 needle=$2
- [[ :$opts: != *:repeat:* ]]; local opt_repeat=$? # 再検索 n N
- [[ :$opts: != *:history:* ]]; local opt_history=$? # 履歴検索が有効か
- [[ :$opts: != *:-:* ]]; local opt_backward=$? # 逆方向
- local opt_locate=0
- local opt_optional_next=0
- if ((opt_repeat)); then
- if [[ $_ble_keymap_vi_search_needle ]]; then
- needle=$_ble_keymap_vi_search_needle
- ((opt_backward^=_ble_keymap_vi_search_obackward,
- opt_history=_ble_keymap_vi_search_ohistory))
- else
- ble/widget/vi-command/bell 'no previous search'
- return 1
- fi
- else
- ble/keymap:vi/search/clear-matched
- if [[ $needle ]]; then
- _ble_keymap_vi_search_needle=$needle
- _ble_keymap_vi_search_obackward=$opt_backward
- _ble_keymap_vi_search_ohistory=$opt_history
- elif [[ $_ble_keymap_vi_search_needle ]]; then
- needle=$_ble_keymap_vi_search_needle
- _ble_keymap_vi_search_obackward=$opt_backward
- _ble_keymap_vi_search_ohistory=$opt_history
- else
- ble/widget/vi-command/bell 'no previous search'
- return 1
- fi
- fi
- local original_ind=$_ble_edit_ind
- if [[ $FLAG || $_ble_decode_keymap == vi_[xs]map ]]; then
- opt_history=0
- else
- local old_hindex; ble/history/get-index -v old_hindex
- fi
- local start= # 初めの履歴番号。search.core 内で最初に履歴を読み込んだあとで設定される。
- local ntask=$ARG
- while ((ntask)); do
- ble/widget/vi-command/search.core || break
- ((ntask--))
- done
- if [[ $FLAG ]]; then
- if ((ntask)); then
- _ble_keymap_vi_search_activate=
- _ble_edit_ind=$original_ind
- ble/keymap:vi/adjust-command-mode
- return 1
- else
- if ((_ble_edit_ind==original_index)); then
- opt_optional_next=1 ble/widget/vi-command/search.core
- fi
- local index=$_ble_edit_ind
- _ble_keymap_vi_search_activate=
- _ble_edit_ind=$original_ind
- ble/widget/vi-command/exclusive-goto.impl "$index" "$FLAG" "$REG" nobell
- fi
- else
- if ((ntask<ARG)); then
- if ((opt_history)); then
- local new_hindex; ble/history/get-index -v new_hindex
- ((new_hindex==old_hindex))
- fi && ble/keymap:vi/mark/set-local-mark 96 "$original_index" # ``
- if ble/keymap:vi/needs-eol-fix; then
- if ((!opt_backward&&_ble_edit_ind<_ble_edit_mark)); then
- ((_ble_edit_ind++))
- else
- ((_ble_edit_ind--))
- fi
- fi
- fi
- ble/keymap:vi/adjust-command-mode
- return 0
- fi
-}
-function ble/widget/vi-command/search-forward {
- ble/keymap:vi/async-commandline-mode 'ble/widget/vi-command/search.impl +:history'
- _ble_edit_PS1='/'
- ble/history/set-prefix _ble_keymap_vi_search
- _ble_keymap_vi_cmap_before_command=ble/keymap:vi/commandline/before-command.hook
- return 147
-}
-function ble/widget/vi-command/search-backward {
- ble/keymap:vi/async-commandline-mode 'ble/widget/vi-command/search.impl -:history'
- _ble_edit_PS1='?'
- ble/history/set-prefix _ble_keymap_vi_search
- _ble_keymap_vi_cmap_before_command=ble/keymap:vi/commandline/before-command.hook
- return 147
-}
-function ble/widget/vi-command/search-repeat {
- ble/widget/vi-command/search.impl repeat:+
-}
-function ble/widget/vi-command/search-reverse-repeat {
- ble/widget/vi-command/search.impl repeat:-
-}
-function ble/widget/vi-command/search-word.impl {
- local opts=$1
- local rex=$'^([^[:alnum:]_\n]*)([[:alnum:]_]*)'
- if ! [[ ${_ble_edit_str:_ble_edit_ind} =~ $rex ]]; then
- ble/keymap:vi/clear-arg
- ble/widget/vi-command/bell 'word is not found'
- return 1
- fi
- local end=$((_ble_edit_ind+${#BASH_REMATCH}))
- local word=${BASH_REMATCH[2]}
- if [[ ! ${BASH_REMATCH[1]} ]]; then
- rex=$'[[:alnum:]_]+$'
- [[ ${_ble_edit_str::_ble_edit_ind} =~ $rex ]] &&
- word=$BASH_REMATCH$word
- fi
- local needle=$word
- rex='\<'$needle; [[ $word =~ $rex ]] && needle=$rex
- rex=$needle'\>'; [[ $word =~ $rex ]] && needle=$rex
- if [[ $opts == backward ]]; then
- ble/widget/vi-command/search.impl -:history "$needle"
- else
- local original_ind=$_ble_edit_ind
- _ble_edit_ind=$((end-1))
- ble/widget/vi-command/search.impl +:history "$needle" && return 0
- _ble_edit_ind=$original_ind
- return 1
- fi
-}
-function ble/widget/vi-command/search-word-forward {
- ble/widget/vi-command/search-word.impl forward
-}
-function ble/widget/vi-command/search-word-backward {
- ble/widget/vi-command/search-word.impl backward
-}
-function ble/widget/vi_nmap/command-help {
- ble/keymap:vi/clear-arg
- ble/widget/command-help; local ext=$?
- ble/keymap:vi/adjust-command-mode
- return "$ext"
-}
-function ble/widget/vi_xmap/command-help.core {
- ble/keymap:vi/clear-arg
- local get_selection=ble/highlight/layer:region/mark:$_ble_edit_mark_active/get-selection
- ble/is-function "$get_selection" || return 1
- local selection
- "$get_selection" || return 1
- ((${#selection[*]}==2)) || return 1
- local comp_cword=0 comp_line=$_ble_edit_str comp_point=$_ble_edit_ind
- local -a comp_words; comp_words=("$cmd")
- local cmd=${_ble_edit_str:selection[0]:selection[1]-selection[0]}
- ble/widget/command-help.impl "$cmd"; local ext=$?
- ble/keymap:vi/adjust-command-mode
- return "$ext"
-}
-function ble/widget/vi_xmap/command-help {
- if ! ble/widget/vi_xmap/command-help.core; then
- ble/widget/vi-command/bell
- return 1
- fi
-}
-function ble/keymap:vi/set-up-command-map {
- ble-bind -f 0 vi-command/append-arg
- ble-bind -f 1 vi-command/append-arg
- ble-bind -f 2 vi-command/append-arg
- ble-bind -f 3 vi-command/append-arg
- ble-bind -f 4 vi-command/append-arg
- ble-bind -f 5 vi-command/append-arg
- ble-bind -f 6 vi-command/append-arg
- ble-bind -f 7 vi-command/append-arg
- ble-bind -f 8 vi-command/append-arg
- ble-bind -f 9 vi-command/append-arg
- ble-bind -f y 'vi-command/operator y'
- ble-bind -f d 'vi-command/operator d'
- ble-bind -f c 'vi-command/operator c'
- ble-bind -f '<' 'vi-command/operator indent-left'
- ble-bind -f '>' 'vi-command/operator indent-right'
- ble-bind -f '!' 'vi-command/operator filter'
- ble-bind -f 'g ~' 'vi-command/operator toggle_case'
- ble-bind -f 'g u' 'vi-command/operator u'
- ble-bind -f 'g U' 'vi-command/operator U'
- ble-bind -f 'g ?' 'vi-command/operator rot13'
- ble-bind -f 'g q' 'vi-command/operator fold'
- ble-bind -f 'g w' 'vi-command/operator fold-preserve-point'
- ble-bind -f 'g @' 'vi-command/operator map'
- ble-bind -f paste_begin vi-command/bracketed-paste
- ble-bind -f 'home' vi-command/beginning-of-line
- ble-bind -f '$' vi-command/forward-eol
- ble-bind -f 'end' vi-command/forward-eol
- ble-bind -f '^' vi-command/first-non-space
- ble-bind -f '_' vi-command/first-non-space-forward
- ble-bind -f '+' vi-command/forward-first-non-space
- ble-bind -f 'C-m' vi-command/forward-first-non-space
- ble-bind -f 'RET' vi-command/forward-first-non-space
- ble-bind -f '-' vi-command/backward-first-non-space
- ble-bind -f 'g 0' vi-command/beginning-of-graphical-line
- ble-bind -f 'g home' vi-command/beginning-of-graphical-line
- ble-bind -f 'g ^' vi-command/graphical-first-non-space
- ble-bind -f 'g $' vi-command/graphical-forward-eol
- ble-bind -f 'g end' vi-command/graphical-forward-eol
- ble-bind -f 'g m' vi-command/middle-of-graphical-line
- ble-bind -f 'g _' vi-command/last-non-space
- ble-bind -f h vi-command/backward-char
- ble-bind -f l vi-command/forward-char
- ble-bind -f left vi-command/backward-char
- ble-bind -f right vi-command/forward-char
- ble-bind -f 'C-?' 'vi-command/backward-char wrap'
- ble-bind -f 'DEL' 'vi-command/backward-char wrap'
- ble-bind -f 'C-h' 'vi-command/backward-char wrap'
- ble-bind -f 'BS' 'vi-command/backward-char wrap'
- ble-bind -f SP 'vi-command/forward-char wrap'
- ble-bind -f j vi-command/forward-line
- ble-bind -f down vi-command/forward-line
- ble-bind -f C-n vi-command/forward-line
- ble-bind -f C-j vi-command/forward-line
- ble-bind -f k vi-command/backward-line
- ble-bind -f up vi-command/backward-line
- ble-bind -f C-p vi-command/backward-line
- ble-bind -f 'g j' vi-command/graphical-forward-line
- ble-bind -f 'g down' vi-command/graphical-forward-line
- ble-bind -f 'g k' vi-command/graphical-backward-line
- ble-bind -f 'g up' vi-command/graphical-backward-line
- ble-bind -f w vi-command/forward-vword
- ble-bind -f W vi-command/forward-uword
- ble-bind -f b vi-command/backward-vword
- ble-bind -f B vi-command/backward-uword
- ble-bind -f e vi-command/forward-vword-end
- ble-bind -f E vi-command/forward-uword-end
- ble-bind -f 'g e' vi-command/backward-vword-end
- ble-bind -f 'g E' vi-command/backward-uword-end
- ble-bind -f C-right vi-command/forward-vword
- ble-bind -f S-right vi-command/forward-vword
- ble-bind -f C-left vi-command/backward-vword
- ble-bind -f S-left vi-command/backward-vword
- ble-bind -f 'g o' vi-command/nth-byte
- ble-bind -f '|' vi-command/nth-column
- ble-bind -f H vi-command/nth-line
- ble-bind -f L vi-command/nth-last-line
- ble-bind -f 'g g' vi-command/history-beginning
- ble-bind -f G vi-command/history-end
- ble-bind -f C-home vi-command/first-nol
- ble-bind -f C-end vi-command/last-eol
- ble-bind -f 'f' vi-command/search-forward-char
- ble-bind -f 'F' vi-command/search-backward-char
- ble-bind -f 't' vi-command/search-forward-char-prev
- ble-bind -f 'T' vi-command/search-backward-char-prev
- ble-bind -f ';' vi-command/search-char-repeat
- ble-bind -f ',' vi-command/search-char-reverse-repeat
- ble-bind -f '%' 'vi-command/search-matchpair-or vi-command/percentage-line'
- ble-bind -f 'C-\ C-n' nop
- ble-bind -f ':' vi-command/commandline
- ble-bind -f '/' vi-command/search-forward
- ble-bind -f '?' vi-command/search-backward
- ble-bind -f 'n' vi-command/search-repeat
- ble-bind -f 'N' vi-command/search-reverse-repeat
- ble-bind -f '*' vi-command/search-word-forward
- ble-bind -f '#' vi-command/search-word-backward
- ble-bind -f '`' 'vi-command/goto-mark'
- ble-bind -f \' 'vi-command/goto-mark line'
- ble-bind -c 'C-z' fg
-}
-function ble/widget/vi_omap/operator-rot13-or-search-backward {
- if [[ $_ble_keymap_vi_opfunc == rot13 ]]; then
- ble/widget/vi-command/operator rot13
- else
- ble/widget/vi-command/search-backward
- fi
-}
-function ble/widget/vi_omap/switch-visual-mode.impl {
- local new_mode=$1
- local old=$_ble_keymap_vi_opfunc
- [[ $old ]] || return 1
- local new=$old:
- new=${new/:vi_char:/:}
- new=${new/:vi_line:/:}
- new=${new/:vi_block:/:}
- [[ $new_mode ]] && new=$new:$new_mode
- _ble_keymap_vi_opfunc=$new
-}
-function ble/widget/vi_omap/switch-to-charwise {
- ble/widget/vi_omap/switch-visual-mode.impl vi_char
-}
-function ble/widget/vi_omap/switch-to-linewise {
- ble/widget/vi_omap/switch-visual-mode.impl vi_line
-}
-function ble/widget/vi_omap/switch-to-blockwise {
- ble/widget/vi_omap/switch-visual-mode.impl vi_block
-}
-function ble-decode/keymap:vi_omap/define {
- ble/keymap:vi/set-up-command-map
- ble-bind -f __default__ vi_omap/__default__
- ble-bind -f __line_limit__ nop
- ble-bind -f 'ESC' vi_omap/cancel
- ble-bind -f 'C-[' vi_omap/cancel
- ble-bind -f 'C-c' vi_omap/cancel
- ble-bind -f a vi-command/text-object
- ble-bind -f i vi-command/text-object
- ble-bind -f v vi_omap/switch-to-charwise
- ble-bind -f V vi_omap/switch-to-linewise
- ble-bind -f C-v vi_omap/switch-to-blockwise
- ble-bind -f C-q vi_omap/switch-to-blockwise
- ble-bind -f '~' 'vi-command/operator toggle_case'
- ble-bind -f 'u' 'vi-command/operator u'
- ble-bind -f 'U' 'vi-command/operator U'
- ble-bind -f '?' 'vi_omap/operator-rot13-or-search-backward'
- ble-bind -f 'q' 'vi-command/operator fold'
-}
-function ble/widget/vi-command/exit-on-empty-line {
- if [[ $_ble_edit_str ]]; then
- ble/widget/vi_nmap/forward-scroll
- return "$?"
- else
- ble/widget/exit
- ble/keymap:vi/adjust-command-mode # ジョブがあるときは終了しないので。
- return 1
- fi
-}
-function ble/widget/vi-command/show-line-info {
- local index count
- ble/history/get-index -v index
- ble/history/get-count -v count
- local hist_ratio=$(((100*index+count-1)/count))%
- local hist_stat=$'!\e[32m'$index$'\e[m / \e[32m'$count$'\e[m (\e[32m'$hist_ratio$'\e[m)'
- local ret
- ble/string#count-char "$_ble_edit_str" $'\n'; local nline=$((ret+1))
- ble/string#count-char "${_ble_edit_str::_ble_edit_ind}" $'\n'; local iline=$((ret+1))
- local line_ratio=$(((100*iline+nline-1)/nline))%
- local line_stat=$'line \e[34m'$iline$'\e[m / \e[34m'$nline$'\e[m --\e[34m'$line_ratio$'\e[m--'
- ble/edit/info/show ansi "\"$hist_stat\" $line_stat"
- ble/keymap:vi/adjust-command-mode
- return 0
-}
-function ble/widget/vi-command/cancel {
- if [[ $_ble_keymap_vi_single_command ]]; then
- _ble_keymap_vi_single_command=
- _ble_keymap_vi_single_command_overwrite=
- ble/keymap:vi/update-mode-name
- else
- local joblist; ble/util/joblist
- if ((${#joblist[*]})); then
- ble/array#push joblist $'Type \e[35m:q!\e[m and press \e[35m<Enter>\e[m to abandon all \e[31mjobs\e[m and exit Bash'
- IFS=$'\n' builtin eval 'ble/edit/info/show ansi "${joblist[*]}"'
- else
- ble/edit/info/show ansi $'Type \e[35m:q\e[m and press \e[35m<Enter>\e[m to exit Bash'
- fi
- fi
- ble/widget/vi-command/bell
- return 0
-}
-bleopt/declare -v keymap_vi_imap_undo ''
-_ble_keymap_vi_undo_suppress=
-function ble/keymap:vi/undo/add {
- [[ $_ble_keymap_vi_undo_suppress ]] && return 0
- [[ $1 == more && $bleopt_keymap_vi_imap_undo != more ]] && return 0
- ble-edit/undo/add
-}
-function ble/widget/vi_nmap/undo {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local _ble_keymap_vi_undo_suppress=1
- ble/keymap:vi/mark/start-edit-area
- if ble-edit/undo/undo "$ARG"; then
- ble/keymap:vi/needs-eol-fix && ((_ble_edit_ind--))
- ble/keymap:vi/mark/end-edit-area
- ble/keymap:vi/adjust-command-mode
- else
- ble/widget/vi-command/bell
- return 1
- fi
-}
-function ble/widget/vi_nmap/redo {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local _ble_keymap_vi_undo_suppress=1
- ble/keymap:vi/mark/start-edit-area
- if ble-edit/undo/redo "$ARG"; then
- ble/keymap:vi/needs-eol-fix && ((_ble_edit_ind--))
- ble/keymap:vi/mark/end-edit-area
- ble/keymap:vi/adjust-command-mode
- else
- ble/widget/vi-command/bell
- return 1
- fi
-}
-function ble/widget/vi_nmap/revert {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local _ble_keymap_vi_undo_suppress=1
- ble/keymap:vi/mark/start-edit-area
- if ble-edit/undo/revert-toggle "$ARG"; then
- ble/keymap:vi/needs-eol-fix && ((_ble_edit_ind--))
- ble/keymap:vi/mark/end-edit-area
- ble/keymap:vi/adjust-command-mode
- else
- ble/widget/vi-command/bell
- return 1
- fi
-}
-function ble/widget/vi_nmap/increment.impl {
- local delta=$1
- ((delta==0)) && return 0
- local line=${_ble_edit_str:_ble_edit_ind}
- line=${line%%$'\n'*}
- local rex='^([^0-9]*)[0-9]+'
- if ! [[ $line =~ $rex ]]; then
- [[ $line ]] && ble/widget/.bell 'number not found'
- ble/keymap:vi/adjust-command-mode
- return 0
- fi
- local rematch1=${BASH_REMATCH[1]}
- local beg=$((_ble_edit_ind+${#rematch1}))
- local end=$((_ble_edit_ind+${#BASH_REMATCH}))
- rex='-?[0-9]*$'; [[ ${_ble_edit_str::beg} =~ $rex ]]
- ((beg-=${#BASH_REMATCH}))
- local number=${_ble_edit_str:beg:end-beg}
- local abs=${number#-}
- if [[ $abs == 0?* ]]; then
- if [[ $number == -* ]]; then
- number=-$((10#0$abs))
- else
- number=$((10#0$abs))
- fi
- fi
- ((number+=delta))
- if [[ $abs == 0?* ]]; then
- local wsign=$((number<0?1:0))
- local zpad=$((wsign+${#abs}-${#number}))
- if ((zpad>0)); then
- local ret; ble/string#repeat 0 "$zpad"
- number=${number::wsign}$ret${number:wsign}
- fi
- fi
- ble/widget/.replace-range "$beg" "$end" "$number"
- ble/keymap:vi/mark/set-previous-edit-area "$beg" $((beg+${#number}))
- ble/keymap:vi/repeat/record
- _ble_edit_ind=$((beg+${#number}-1))
- ble/keymap:vi/adjust-command-mode
- return 0
-}
-function ble/widget/vi_nmap/increment {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi_nmap/increment.impl "$ARG"
-}
-function ble/widget/vi_nmap/decrement {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/widget/vi_nmap/increment.impl $((-ARG))
-}
-function ble/widget/vi_nmap/__line_limit__.edit {
- ble/keymap:vi/clear-arg
- ble/widget/vi_nmap/.insert-mode
- ble/keymap:vi/repeat/clear-insert
- ble/widget/edit-and-execute-command.impl "$1"
-}
-function ble/widget/vi_nmap/__line_limit__ {
- ble/widget/__line_limit__ vi_nmap/__line_limit__.edit
-}
-function ble-decode/keymap:vi_nmap/define {
- ble/keymap:vi/set-up-command-map
- ble-bind -f __default__ vi-command/decompose-meta
- ble-bind -f __line_limit__ vi_nmap/__line_limit__
- ble-bind -f 'ESC' vi-command/bell
- ble-bind -f 'C-[' vi-command/bell
- ble-bind -f 'C-c' vi-command/cancel
- ble-bind -f a vi_nmap/append-mode
- ble-bind -f A vi_nmap/append-mode-at-end-of-line
- ble-bind -f i vi_nmap/insert-mode
- ble-bind -f insert vi_nmap/insert-mode
- ble-bind -f I vi_nmap/insert-mode-at-first-non-space
- ble-bind -f 'g I' vi_nmap/insert-mode-at-beginning-of-line
- ble-bind -f o vi_nmap/insert-mode-at-forward-line
- ble-bind -f O vi_nmap/insert-mode-at-backward-line
- ble-bind -f R vi_nmap/replace-mode
- ble-bind -f 'g R' vi_nmap/virtual-replace-mode
- ble-bind -f 'g i' vi_nmap/insert-mode-at-previous-point
- ble-bind -f '~' vi_nmap/forward-char-toggle-case
- ble-bind -f Y vi_nmap/copy-current-line
- ble-bind -f S vi_nmap/kill-current-line-and-insert
- ble-bind -f D vi_nmap/kill-forward-line
- ble-bind -f C vi_nmap/kill-forward-line-and-insert
- ble-bind -f p vi_nmap/paste-after
- ble-bind -f P vi_nmap/paste-before
- ble-bind -f x vi_nmap/kill-forward-char
- ble-bind -f s vi_nmap/kill-forward-char-and-insert
- ble-bind -f X vi_nmap/kill-backward-char
- ble-bind -f delete vi_nmap/kill-forward-char
- ble-bind -f 'r' vi_nmap/replace-char
- ble-bind -f 'g r' vi_nmap/virtual-replace-char # vim で実際に試すとこの機能はない
- ble-bind -f J vi_nmap/connect-line-with-space
- ble-bind -f 'g J' vi_nmap/connect-line
- ble-bind -f v vi_nmap/charwise-visual-mode
- ble-bind -f V vi_nmap/linewise-visual-mode
- ble-bind -f C-v vi_nmap/blockwise-visual-mode
- ble-bind -f C-q vi_nmap/blockwise-visual-mode
- ble-bind -f 'g v' vi-command/previous-visual-area
- ble-bind -f 'g h' vi_nmap/charwise-select-mode
- ble-bind -f 'g H' vi_nmap/linewise-select-mode
- ble-bind -f 'g C-h' vi_nmap/blockwise-select-mode
- ble-bind -f . vi_nmap/repeat
- ble-bind -f K vi_nmap/command-help
- ble-bind -f f1 vi_nmap/command-help
- ble-bind -f 'C-d' vi_nmap/forward-line-scroll
- ble-bind -f 'C-u' vi_nmap/backward-line-scroll
- ble-bind -f 'C-e' vi_nmap/forward-scroll
- ble-bind -f 'C-y' vi_nmap/backward-scroll
- ble-bind -f 'C-f' vi_nmap/pagedown
- ble-bind -f 'next' vi_nmap/pagedown
- ble-bind -f 'C-b' vi_nmap/pageup
- ble-bind -f 'prior' vi_nmap/pageup
- ble-bind -f 'z t' vi_nmap/scroll-to-top-and-redraw
- ble-bind -f 'z z' vi_nmap/scroll-to-center-and-redraw
- ble-bind -f 'z b' vi_nmap/scroll-to-bottom-and-redraw
- ble-bind -f 'z RET' vi_nmap/scroll-to-top-non-space-and-redraw
- ble-bind -f 'z C-m' vi_nmap/scroll-to-top-non-space-and-redraw
- ble-bind -f 'z +' vi_nmap/scroll-or-pagedown-and-redraw
- ble-bind -f 'z -' vi_nmap/scroll-to-bottom-non-space-and-redraw
- ble-bind -f 'z .' vi_nmap/scroll-to-center-non-space-and-redraw
- ble-bind -f m vi-command/set-mark
- ble-bind -f '"' vi-command/register
- ble-bind -f 'C-g' vi-command/show-line-info
- ble-bind -f 'q' vi_nmap/record-register
- ble-bind -f '@' vi_nmap/play-register
- ble-bind -f u vi_nmap/undo
- ble-bind -f C-r vi_nmap/redo
- ble-bind -f U vi_nmap/revert
- ble-bind -f C-a vi_nmap/increment
- ble-bind -f C-x vi_nmap/decrement
- ble-bind -f 'Z Z' 'vi-command:q'
- ble-bind -f 'Z Q' 'vi-command:q'
- ble-bind -f 'C-j' 'accept-line'
- ble-bind -f 'C-RET' 'accept-line'
- ble-bind -f 'C-m' 'accept-single-line-or vi-command/forward-first-non-space'
- ble-bind -f 'RET' 'accept-single-line-or vi-command/forward-first-non-space'
- ble-bind -f 'C-l' 'clear-screen'
- ble-bind -f 'C-d' 'vi-command/exit-on-empty-line' # overwrites vi_nmap/forward-scroll
- ble-bind -f 'auto_complete_enter' auto-complete-enter
- ble-bind -f M-left 'vi-command/backward-vword'
- ble-bind -f M-right 'vi-command/forward-vword'
- ble-bind -f C-delete 'vi-rlfunc/kill-word'
- ble-bind -f '#' 'vi-rlfunc/insert-comment'
- ble-bind -f '&' 'vi_nmap/@edit tilde-expand'
-}
-function ble/widget/vi-rlfunc/.is-uppercase {
- local n=${#KEYS[@]}
- local code=$((KEYS[n?n-1:0]&_ble_decode_MaskChar))
- ((0x41<=code&&code<=0x5a))
-}
-function ble/widget/vi-rlfunc/delete-to {
- if ble/widget/vi-rlfunc/.is-uppercase; then
- ble/widget/vi_nmap/kill-forward-line
- else
- ble/widget/vi-command/operator d
- fi
-}
-function ble/widget/vi-rlfunc/change-to {
- if ble/widget/vi-rlfunc/.is-uppercase; then
- ble/widget/vi_nmap/kill-forward-line-and-insert
- else
- ble/widget/vi-command/operator c
- fi
-}
-function ble/widget/vi-rlfunc/yank-to {
- if ble/widget/vi-rlfunc/.is-uppercase; then
- ble/widget/vi_nmap/copy-current-line
- else
- ble/widget/vi-command/operator y
- fi
-}
-function ble/widget/vi-rlfunc/char-search {
- local n=${#KEYS[@]}
- local code=$((KEYS[n?n-1:0]&_ble_decode_MaskChar))
- ((code==0)) && return 1
- ble/util/c2s "$code"
- case $ret in
- ('f') ble/widget/vi-command/search-forward-char ;;
- ('F') ble/widget/vi-command/search-backward-char ;;
- ('t') ble/widget/vi-command/search-forward-char-prev ;;
- ('T') ble/widget/vi-command/search-backward-char-prev ;;
- (';') ble/widget/vi-command/search-char-repeat ;;
- (',') ble/widget/vi-command/search-char-reverse-repeat ;;
- (*) return 1 ;;
- esac
-}
-function ble/widget/vi-rlfunc/next-word {
- if ble/widget/vi-rlfunc/.is-uppercase; then
- ble/widget/vi-command/forward-uword
- else
- ble/widget/vi-command/forward-vword
- fi
-}
-function ble/widget/vi-rlfunc/prev-word {
- if ble/widget/vi-rlfunc/.is-uppercase; then
- ble/widget/vi-command/backward-uword
- else
- ble/widget/vi-command/backward-vword
- fi
-}
-function ble/widget/vi-rlfunc/end-word {
- if ble/widget/vi-rlfunc/.is-uppercase; then
- ble/widget/vi-command/forward-uword-end
- else
- ble/widget/vi-command/forward-vword-end
- fi
-}
-function ble/widget/vi-rlfunc/put {
- if ble/widget/vi-rlfunc/.is-uppercase; then
- ble/widget/vi_nmap/paste-before
- else
- ble/widget/vi_nmap/paste-after
- fi
-}
-function ble/widget/vi-rlfunc/search {
- local n=${#KEYS[@]}
- local code=$((KEYS[n?n-1:0]&_ble_decode_MaskChar))
- if ((code==63)); then
- ble/widget/vi-command/search-backward
- else
- ble/widget/vi-command/search-forward
- fi
-}
-function ble/widget/vi-rlfunc/search-again {
- if ble/widget/vi-rlfunc/.is-uppercase; then
- ble/widget/vi-command/search-reverse-repeat
- else
- ble/widget/vi-command/search-repeat
- fi
-}
-function ble/widget/vi-rlfunc/subst {
- if ble/widget/vi-rlfunc/.is-uppercase; then
- ble/widget/vi_nmap/kill-current-line-and-insert
- else
- ble/widget/vi_nmap/kill-forward-char-and-insert
- fi
-}
-function ble/widget/vi-rlfunc/kill-word {
- _ble_keymap_vi_opfunc=d
- ble/widget/vi-command/forward-vword-end
-}
-function ble/widget/vi-rlfunc/unix-line-discard {
- _ble_keymap_vi_opfunc=d
- ble/widget/vi-command/beginning-of-line
-}
-function ble/widget/vi-rlfunc/insert-comment {
- local ARG FLAG REG; ble/keymap:vi/get-arg ''
- ble/keymap:vi/mark/start-edit-area
- ble/widget/insert-comment/.insert "$ARG"
- ble/keymap:vi/mark/end-edit-area
- ble/widget/vi_nmap/accept-line
-}
-function ble/widget/vi-rlfunc/quoted-insert-char.hook {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/keymap:vi/mark/start-edit-area
- _ble_edit_arg=$ARG ble/widget/quoted-insert-char.hook
- ble/keymap:vi/mark/end-edit-area
- ble/keymap:vi/repeat/record
- ble/keymap:vi/adjust-command-mode
- return 0
-}
-function ble/widget/vi-rlfunc/quoted-insert-char {
- _ble_edit_mark_active=
- _ble_decode_char__hook=ble/widget/vi-rlfunc/quoted-insert-char.hook
- return 147
-}
-function ble/widget/vi-rlfunc/quoted-insert.hook {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/keymap:vi/mark/start-edit-area
- _ble_edit_arg=$ARG ble/widget/quoted-insert.hook
- ble/keymap:vi/mark/end-edit-area
- ble/keymap:vi/repeat/record
- ble/keymap:vi/adjust-command-mode
- return 0
-}
-function ble/widget/vi-rlfunc/quoted-insert {
- _ble_edit_mark_active=
- _ble_decode_key__hook=ble/widget/vi-rlfunc/quoted-insert.hook
- return 147
-}
-function ble/widget/vi-rlfunc/eof-maybe {
- if [[ ! $_ble_edit_str ]]; then
- ble/widget/exit
- ble/keymap:vi/adjust-command-mode # ジョブがあるときは終了しないので。
- return 1
- elif ble-edit/is-single-complete-line; then
- ble/widget/vi_nmap/accept-line
- else
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- ble/keymap:vi/mark/start-edit-area
- _ble_edit_ind=${#_ble_edit_str}
- _ble_edit_arg=$ARG
- ble/widget/self-insert
- ble/keymap:vi/mark/end-edit-area
- ble/keymap:vi/adjust-command-mode
- fi
-}
-function ble/widget/vi-rlfunc/yank-arg {
- ble/widget/vi_nmap/append-mode
- ble/keymap:vi/imap-repeat/reset
- local -a KEYS; KEYS=(32)
- ble/widget/self-insert
- ble/util/unlocal KEYS
- ble/widget/insert-last-argument
- return "$?"
-}
-function ble/widget/vi-command/forward-byte {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local index=$_ble_edit_ind
- ble/widget/.locate-forward-byte "$ARG" || [[ $FLAG ]] || ble/widget/.bell
- ble/widget/vi-command/exclusive-goto.impl "$index" "$FLAG" "$REG"
-}
-function ble/widget/vi-command/backward-byte {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local index=$_ble_edit_ind
- ble/widget/.locate-forward-byte $((-ARG)) || [[ $FLAG ]] || ble/widget/.bell
- ble/widget/vi-command/exclusive-goto.impl "$index" "$FLAG" "$REG"
-}
-function ble/widget/vi_nmap/capitalize-XWORD { ble/widget/filter-word.impl XWORD ble/string#capitalize; }
-function ble/widget/vi_nmap/downcase-XWORD { ble/widget/filter-word.impl XWORD ble/string#tolower; }
-function ble/widget/vi_nmap/upcase-XWORD { ble/widget/filter-word.impl XWORD ble/string#toupper; }
-function ble/widget/vi_nmap/@edit {
- ble/keymap:vi/clear-arg
- ble/keymap:vi/repeat/record
- ble/keymap:vi/mark/start-edit-area
- ble/widget/"$@"
- ble/keymap:vi/mark/end-edit-area
- ble/keymap:vi/adjust-command-mode
-}
-function ble/widget/vi_nmap/@adjust {
- ble/keymap:vi/clear-arg
- ble/widget/"$@"
- ble/keymap:vi/adjust-command-mode
-}
-function ble/widget/vi_nmap/@motion {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local _ble_edit_ind=$_ble_edit_ind _ble_edit_arg=$ARG
- if ble/widget/"$@"; then
- local index=$_ble_edit_ind
- ble/util/unlocal _ble_edit_ind
- ble/widget/vi-command/exclusive-goto.impl "$index" "$FLAG" "$REG" nobell
- else
- ble/keymap:vi/adjust-command-mode
- fi
-}
-function ble/keymap:vi/xmap/has-eol-extension {
- [[ $_ble_edit_mark_active == *+ ]]
-}
-function ble/keymap:vi/xmap/add-eol-extension {
- [[ $_ble_edit_mark_active ]] &&
- _ble_edit_mark_active=${_ble_edit_mark_active%+}+
-}
-function ble/keymap:vi/xmap/remove-eol-extension {
- [[ $_ble_edit_mark_active ]] &&
- _ble_edit_mark_active=${_ble_edit_mark_active%+}
-}
-function ble/keymap:vi/xmap/switch-type {
- local suffix; [[ $_ble_edit_mark_active == *+ ]] && suffix=+
- _ble_edit_mark_active=$1$suffix
-}
-function ble/keymap:vi/get-graphical-rectangle {
- local p=${1:-$_ble_edit_mark} q=${2:-$_ble_edit_ind}
- local ret
- ble-edit/content/find-logical-bol "$p"; p0=$ret
- ble-edit/content/find-logical-bol "$q"; q0=$ret
- local p0x p0y q0x q0y
- ble/textmap#getxy.out --prefix=p0 "$p0"
- ble/textmap#getxy.out --prefix=q0 "$q0"
- local plx ply qlx qly
- ble/textmap#getxy.cur --prefix=pl "$p"
- ble/textmap#getxy.cur --prefix=ql "$q"
- local prx=$plx pry=$ply qrx=$qlx qry=$qly
- ble-edit/content/eolp "$p" && ((prx++)) || ble/textmap#getxy.out --prefix=pr $((p+1))
- ble-edit/content/eolp "$q" && ((qrx++)) || ble/textmap#getxy.out --prefix=qr $((q+1))
- ((ply-=p0y,qly-=q0y,pry-=p0y,qry-=q0y,
- (ply<qly||ply==qly&&plx<qlx)?(lx=plx,ly=ply):(lx=qlx,ly=qly),
- (pry>qry||pry==qry&&prx>qrx)?(rx=prx,ry=pry):(rx=qrx,ry=qry)))
-}
-function ble/keymap:vi/get-logical-rectangle {
- local p=${1:-$_ble_edit_mark} q=${2:-$_ble_edit_ind}
- local ret
- ble-edit/content/find-logical-bol "$p"; p0=$ret
- ble-edit/content/find-logical-bol "$q"; q0=$ret
- ((p-=p0,q-=q0,p<=q)) || local p=$q q=$p
- lx=$p rx=$((q+1)) ly=0 ry=0
-}
-function ble/keymap:vi/get-rectangle {
- if ble/edit/use-textmap; then
- ble/keymap:vi/get-graphical-rectangle "$@"
- else
- ble/keymap:vi/get-logical-rectangle "$@"
- fi
-}
-function ble/keymap:vi/get-rectangle-height {
- local p0 q0 lx ly rx ry
- ble/keymap:vi/get-rectangle "$@"
- ble/string#count-char "${_ble_edit_str:p0:q0-p0}" $'\n'
- ((ret++))
- return 0
-}
-function ble/keymap:vi/extract-graphical-block-by-geometry {
- local bol1=$1 bol2=$2 x1=$3 x2=$4 y1=0 y2=0 opts=$5
- ((bol1<=bol2||(bol1=$2,bol2=$1)))
- [[ $x1 == *:* ]] && local x1=${x1%%:*} y1=${x1#*:}
- [[ $x2 == *:* ]] && local x2=${x2%%:*} y2=${x2#*:}
- local cols=$_ble_textmap_cols
- local c1=$((cols*y1+x1)) c2=$((cols*y2+x2))
- sub_x1=$c1 sub_x2=$c2
- local ret index lx ly rx ly
- ble-edit/content/find-logical-eol "$bol2"; local eol2=$ret
- local lines; ble/string#split-lines lines "${_ble_edit_str:bol1:eol2-bol1}"
- sub_ranges=()
- local min_sfill=0
- local line bol=$bol1 eol bolx boly
- local c1l c1r c2l c2r
- for line in "${lines[@]}"; do
- ((eol=bol+${#line}))
- if [[ :$opts: == *:first_line:* ]] && ((${#sub_ranges[@]})); then
- ble/array#push sub_ranges :::::
- elif [[ :$opts: == *:skip_middle:* ]] && ((0<${#sub_ranges[@]}&&${#sub_ranges[@]}<${#lines[@]}-1)); then
- ble/array#push sub_ranges :::::
- else
- ble/textmap#getxy.out --prefix=bol "$bol"
- ble/textmap#hit out "$x1" $((boly+y1)) "$bol" "$eol"
- local smin=$index x1l=$lx y1l=$ly x1r=$rx y1r=$ry
- if ble/keymap:vi/xmap/has-eol-extension; then
- local eolx eoly; ble/textmap#getxy.out --prefix=eol "$eol"
- local smax=$eol x2l=$eolx y2l=$eoly x2r=$eolx y2r=$eoly
- else
- ble/textmap#hit out "$x2" $((boly+y2)) "$bol" "$eol"
- local smax=$index x2l=$lx y2l=$ly x2r=$rx y2r=$ry
- fi
- local sfill=0 slpad=0 srpad=0
- local stext=${_ble_edit_str:smin:smax-smin}
- if ((smin<smax)); then
- ((c1l=(y1l-boly)*cols+x1l))
- if ((c1l<c1)); then
- ((slpad=c1-c1l))
- ble/util/assert '! ble-edit/content/eolp "$smin"'
- ((c1r=(y1r-boly)*cols+x1r))
- ble/util/assert '((c1r>c1))' || ((c1r=c1))
- ble/string#repeat ' ' $((c1r-c1))
- stext=$ret${stext:1}
- fi
- ((c2l=(y2l-boly)*cols+x2l))
- if ((c2l<c2)); then
- if ((smax==eol)); then
- ((sfill=c2-c2l))
- else
- ble/string#repeat ' ' $((c2-c2l))
- stext=$stext$ret
- ((smax++))
- ((c2r=(y2r-boly)*cols+x2r))
- ble/util/assert '((c2r>c2))' || ((c2r=c2))
- ((srpad=c2r-c2))
- fi
- elif ((c2l>c2)); then
- ((sfill=c2-c2l,
- sfill<min_sfill&&(min_sfill=sfill)))
- fi
- else
- if ((smin==eol)); then
- ((sfill=c2-c1))
- elif ((c2>c1)); then
- ble/string#repeat ' ' $((c2-c1))
- stext=$ret${stext:1}
- ((smax++))
- ((c1l=(y1l-boly)*cols+x1l,slpad=c1-c1l))
- ((c1r=(y1r-boly)*cols+x1r,srpad=c1r-c1))
- fi
- fi
- ble/array#push sub_ranges "$smin:$smax:$slpad:$srpad:$sfill:$stext"
- fi
- ((bol=eol+1))
- done
- if ((min_sfill<0)); then
- local isub=${#sub_ranges[@]}
- while ((isub--)); do
- local sub=${sub_ranges[isub]}
- local sub45=${sub#*:*:*:*:}
- local sfill=${sub45%%:*}
- sub_ranges[isub]=${sub::${#sub}-${#sub45}}$((sfill-min_sfill))${sub45:${#sfill}}
- done
- fi
-}
-function ble/keymap:vi/extract-graphical-block {
- local opts=$3
- local p0 q0 lx ly rx ry
- ble/keymap:vi/get-graphical-rectangle "$@"
- ble/keymap:vi/extract-graphical-block-by-geometry "$p0" "$q0" "$lx:$ly" "$rx:$ry" "$opts"
-}
-function ble/keymap:vi/extract-logical-block-by-geometry {
- local bol1=$1 bol2=$2 x1=$3 x2=$4 opts=$5
- ((bol1<=bol2||(bol1=$2,bol2=$1)))
- sub_x1=$c1 sub_x2=$c2
- local ret min_sfill=0
- local bol=$bol1 eol smin smax slpad srpad sfill
- sub_ranges=()
- while :; do
- ble-edit/content/find-logical-eol "$bol"; eol=$ret
- slpad=0 srpad=0 sfill=0
- ((smin=bol+x1,smin>eol&&(smin=eol)))
- if ble/keymap:vi/xmap/has-eol-extension; then
- ((smax=eol,
- sfill=bol+x2-eol,
- sfill<min_sfill&&(min_sfill=sfill)))
- else
- ((smax=bol+x2,smax>eol&&(sfill=smax-eol,smax=eol)))
- fi
- local stext=${_ble_edit_str:smin:smax-smin}
- ble/array#push sub_ranges "$smin:$smax:$slpad:$srpad:$sfill:$stext"
- ((bol>=bol2)) && break
- ble-edit/content/find-logical-bol "$bol" 1; bol=$ret
- done
- if ((min_sfill<0)); then
- local isub=${#sub_ranges[@]}
- while ((isub--)); do
- local sub=${sub_ranges[isub]}
- local sub45=${sub#*:*:*:*:}
- local sfill=${sub45%%:*}
- sub_ranges[isub]=${sub::${#sub}-${#sub45}}$((sfill-min_sfill))${sub45:${#sfill}}
- done
- fi
-}
-function ble/keymap:vi/extract-logical-block {
- local opts=$3
- local p0 q0 lx ly rx ry
- ble/keymap:vi/get-logical-rectangle "$@"
- ble/keymap:vi/extract-logical-block-by-geometry "$p0" "$q0" "$lx" "$rx" "$opts"
-}
-function ble/keymap:vi/extract-block {
- if ble/edit/use-textmap; then
- ble/keymap:vi/extract-graphical-block "$@"
- else
- ble/keymap:vi/extract-logical-block "$@"
- fi
-}
-function ble/highlight/layer:region/mark:vi_char/get-selection {
- local rmin rmax
- if ((_ble_edit_mark<_ble_edit_ind)); then
- rmin=$_ble_edit_mark rmax=$_ble_edit_ind
- else
- rmin=$_ble_edit_ind rmax=$_ble_edit_mark
- fi
- ble-edit/content/eolp "$rmax" || ((rmax++))
- selection=("$rmin" "$rmax")
-}
-function ble/highlight/layer:region/mark:vi_line/get-selection {
- local rmin rmax
- if ((_ble_edit_mark<_ble_edit_ind)); then
- rmin=$_ble_edit_mark rmax=$_ble_edit_ind
- else
- rmin=$_ble_edit_ind rmax=$_ble_edit_mark
- fi
- local ret
- ble-edit/content/find-logical-bol "$rmin"; rmin=$ret
- ble-edit/content/find-logical-eol "$rmax"; rmax=$ret
- selection=("$rmin" "$rmax")
-}
-function ble/highlight/layer:region/mark:vi_block/get-selection {
- local sub_ranges sub_x1 sub_x2
- ble/keymap:vi/extract-block
- selection=()
- local sub
- for sub in "${sub_ranges[@]}"; do
- ble/string#split sub : "$sub"
- ((sub[0]<sub[1])) || continue
- ble/array#push selection "${sub[0]}" "${sub[1]}"
- done
-}
-function ble/highlight/layer:region/mark:vi_char+/get-selection {
- ble/highlight/layer:region/mark:vi_char/get-selection
-}
-function ble/highlight/layer:region/mark:vi_line+/get-selection {
- ble/highlight/layer:region/mark:vi_line/get-selection
-}
-function ble/highlight/layer:region/mark:vi_block+/get-selection {
- ble/highlight/layer:region/mark:vi_block/get-selection
-}
-function ble/highlight/layer:region/mark:vi_char/get-face { [[ $_ble_edit_overwrite_mode ]] && face=region_target; }
-function ble/highlight/layer:region/mark:vi_char+/get-face { ble/highlight/layer:region/mark:vi_char/get-face; }
-function ble/highlight/layer:region/mark:vi_line/get-face { ble/highlight/layer:region/mark:vi_char/get-face; }
-function ble/highlight/layer:region/mark:vi_line+/get-face { ble/highlight/layer:region/mark:vi_char/get-face; }
-function ble/highlight/layer:region/mark:vi_block/get-face { ble/highlight/layer:region/mark:vi_char/get-face; }
-function ble/highlight/layer:region/mark:vi_block+/get-face { ble/highlight/layer:region/mark:vi_char/get-face; }
-_ble_keymap_vi_xmap_prev_edit=vi_char:1:1
-ble/array#push _ble_textarea_local_VARNAMES \
- _ble_keymap_vi_xmap_prev_edit
-function ble/widget/vi_xmap/.save-visual-state {
- local nline nchar mark_type=${_ble_edit_mark_active%+}
- if [[ $mark_type == vi_block ]]; then
- local p0 q0 lx rx ly ry
- if ble/edit/use-textmap; then
- local cols=$_ble_textmap_cols
- ble/keymap:vi/get-graphical-rectangle
- ((lx+=ly*cols,rx+=ry*cols))
- else
- ble/keymap:vi/get-logical-rectangle
- fi
- nchar=$((rx-lx))
- local ret
- ((p0<=q0)) || local p0=$q0 q0=$p0
- ble/string#count-char "${_ble_edit_str:p0:q0-p0}" $'\n'
- nline=$((ret+1))
- else
- local ret
- local p=$_ble_edit_mark q=$_ble_edit_ind
- ((p<=q)) || local p=$q q=$p
- ble/string#count-char "${_ble_edit_str:p:q-p}" $'\n'
- nline=$((ret+1))
- local base
- if ((nline==1)) && [[ $mark_type != vi_line ]]; then
- base=$p
- else
- ble-edit/content/find-logical-bol "$q"; base=$ret
- fi
- if ble/edit/use-textmap; then
- local cols=$_ble_textmap_cols
- local bx by x y
- ble/textmap#getxy.cur --prefix=b "$base"
- ble/textmap#getxy.cur "$q"
- nchar=$((x-bx+(y-by)*cols+1))
- else
- nchar=$((q-base+1))
- fi
- fi
- _ble_keymap_vi_xmap_prev_edit=$_ble_edit_mark_active:$nchar:$nline
-}
-function ble/widget/vi_xmap/.restore-visual-state {
- local arg=$1; ((arg>0)) || arg=1
- local prev; ble/string#split prev : "$_ble_keymap_vi_xmap_prev_edit"
- _ble_edit_mark_active=${prev[0]:-vi_char}
- local nchar=${prev[1]:-1}
- local nline=${prev[2]:-1}
- ((nchar<1&&(nchar=1),nline<1&&(nline=1)))
- local is_x_relative=0
- if [[ ${_ble_edit_mark_active%+} == vi_block ]]; then
- ((is_x_relative=1,nchar*=arg,nline*=arg))
- elif [[ ${_ble_edit_mark_active%+} == vi_line ]]; then
- ((nline*=arg,is_x_relative=1,nchar=1))
- else
- ((nline==1?(is_x_relative=1,nchar*=arg):(nline*=arg)))
- fi
- ((nchar--,nline--))
- local index ret
- ble-edit/content/find-logical-bol "$_ble_edit_ind" 0; local b1=$ret
- ble-edit/content/find-logical-bol "$_ble_edit_ind" "$nline"; local b2=$ret
- ble-edit/content/find-logical-eol "$b2"; local e2=$ret
- if ble/keymap:vi/xmap/has-eol-extension; then
- index=$e2
- elif ble/edit/use-textmap; then
- local cols=$_ble_textmap_cols
- local b1x b1y b2x b2y x y
- ble/textmap#getxy.out --prefix=b1 "$b1"
- ble/textmap#getxy.out --prefix=b2 "$b2"
- if ((is_x_relative)); then
- ble/textmap#getxy.out "$_ble_edit_ind"
- local c=$((x+(y-b1y)*cols+nchar))
- else
- local c=$nchar
- fi
- ((y=c/cols,x=c%cols))
- local lx ly rx ry
- ble/textmap#hit out "$x" $((b2y+y)) "$b2" "$e2"
- else
- local c=$((is_x_relative?_ble_edit_ind-b1+nchar:nchar))
- ((index=b2+c,index>e2&&(index=e2)))
- fi
- _ble_edit_mark=$_ble_edit_ind
- _ble_edit_ind=$index
-}
-_ble_keymap_vi_xmap_prev_visual=
-ble/array#push _ble_textarea_local_VARNAMES \
- _ble_keymap_vi_xmap_prev_visual
-function ble/keymap:vi/xmap/set-previous-visual-area {
- local beg end
- local mark_type=${_ble_edit_mark_active%+}
- if [[ $mark_type == vi_block ]]; then
- local sub_ranges sub_x1 sub_x2
- ble/keymap:vi/extract-block
- local nrange=${#sub_ranges[*]}
- ((nrange)) || return 1
- local beg=${sub_ranges[0]%%:*}
- local sub2_slice1=${sub_ranges[nrange-1]#*:}
- local end=${sub2_slice1%%:*}
- ((beg<end)) && ! ble-edit/content/bolp "$end" && ((end--))
- else
- local beg=$_ble_edit_mark end=$_ble_edit_ind
- ((beg<=end)) || local beg=$end end=$beg
- if [[ $mark_type == vi_line ]]; then
- local ret
- ble-edit/content/find-logical-bol "$beg"; beg=$ret
- ble-edit/content/find-logical-eol "$end"; end=$ret
- ble-edit/content/bolp "$end" || ((end--))
- fi
- fi
- _ble_keymap_vi_xmap_prev_visual=$_ble_edit_mark_active
- ble/keymap:vi/mark/set-local-mark 60 "$beg" # `<
- ble/keymap:vi/mark/set-local-mark 62 "$end" # `>
-}
-function ble/widget/vi-command/previous-visual-area {
- local mark=$_ble_keymap_vi_xmap_prev_visual
- local ret beg= end=
- ble/keymap:vi/mark/get-local-mark 60 && beg=$ret # `<
- ble/keymap:vi/mark/get-local-mark 62 && end=$ret # `>
- [[ $beg && $end ]] || return 1
- if [[ $_ble_decode_keymap == vi_[xs]map ]]; then
- ble/keymap:vi/clear-arg
- ble/keymap:vi/xmap/set-previous-visual-area
- _ble_edit_ind=$end
- _ble_edit_mark=$beg
- _ble_edit_mark_active=$mark
- ble/keymap:vi/update-mode-name
- else
- ble/keymap:vi/clear-arg
- ble/widget/vi-command/visual-mode.impl vi_xmap "$mark"
- _ble_edit_ind=$end
- _ble_edit_mark=$beg
- fi
- return 0
-}
-function ble/widget/vi-command/visual-mode.impl {
- local keymap=$1 visual_type=$2
- local ARG FLAG REG; ble/keymap:vi/get-arg 0
- if [[ $FLAG ]]; then
- ble/widget/vi-command/bell
- return 1
- fi
- _ble_edit_overwrite_mode=
- _ble_edit_mark=$_ble_edit_ind
- _ble_edit_mark_active=$visual_type
- _ble_keymap_vi_xmap_insert_data= # ※矩形挿入の途中で更に xmap に入ったときはキャンセル
- ((ARG)) && ble/widget/vi_xmap/.restore-visual-state "$ARG"
- ble/decode/keymap/push "$keymap"
- ble/keymap:vi/update-mode-name
- return 0
-}
-function ble/widget/vi_nmap/charwise-visual-mode {
- ble/widget/vi-command/visual-mode.impl vi_xmap vi_char
-}
-function ble/widget/vi_nmap/linewise-visual-mode {
- ble/widget/vi-command/visual-mode.impl vi_xmap vi_line
-}
-function ble/widget/vi_nmap/blockwise-visual-mode {
- ble/widget/vi-command/visual-mode.impl vi_xmap vi_block
-}
-function ble/widget/vi_nmap/charwise-select-mode {
- ble/widget/vi-command/visual-mode.impl vi_smap vi_char
-}
-function ble/widget/vi_nmap/linewise-select-mode {
- ble/widget/vi-command/visual-mode.impl vi_smap vi_line
-}
-function ble/widget/vi_nmap/blockwise-select-mode {
- ble/widget/vi-command/visual-mode.impl vi_smap vi_block
-}
-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/keymap:vi/update-mode-name
- ble/keymap:vi/adjust-command-mode
- fi
- return 0
-}
-function ble/widget/vi_xmap/cancel {
- _ble_keymap_vi_single_command=
- _ble_keymap_vi_single_command_overwrite=
- ble-edit/content/nonbol-eolp && ((_ble_edit_ind--))
- ble/widget/vi_xmap/exit
-}
-function ble/widget/vi_xmap/switch-visual-mode.impl {
- local visual_type=$1
- local ARG FLAG REG; ble/keymap:vi/get-arg 0
- if [[ $FLAG ]]; then
- ble/widget/.bell
- return 1
- fi
- if [[ ${_ble_edit_mark_active%+} == "$visual_type" ]]; then
- ble/widget/vi_xmap/cancel
- else
- ble/keymap:vi/xmap/switch-type "$visual_type"
- ble/keymap:vi/update-mode-name
- return 0
- fi
-}
-function ble/widget/vi_xmap/switch-to-charwise {
- ble/widget/vi_xmap/switch-visual-mode.impl vi_char
-}
-function ble/widget/vi_xmap/switch-to-linewise {
- ble/widget/vi_xmap/switch-visual-mode.impl vi_line
-}
-function ble/widget/vi_xmap/switch-to-blockwise {
- ble/widget/vi_xmap/switch-visual-mode.impl vi_block
-}
-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/keymap:vi/update-mode-name
- fi
-}
-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/keymap:vi/update-mode-name
- fi
-}
-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
- fi
- if [[ ${_ble_edit_mark_active%+} != vi_block ]]; then
- ble/widget/vi_xmap/switch-to-blockwise
- else
- xble/keymap:vi/update-mode-name
- fi
-}
-bleopt/declare -v keymap_vi_keymodel ''
-function ble/widget/vi_smap/@nomarked {
- [[ ,$bleopt_keymap_vi_keymodel, == *,stopsel,* ]] &&
- ble/widget/vi_xmap/exit
- ble/widget/"$@"
-}
-function ble/widget/vi_smap/self-insert {
- ble/widget/vi-command/operator c
- ble/widget/self-insert
-}
-function ble/widget/vi_xmap/exchange-points {
- ble/keymap:vi/xmap/remove-eol-extension
- ble/widget/exchange-point-and-mark
- return 0
-}
-function ble/widget/vi_xmap/exchange-boundaries {
- if [[ ${_ble_edit_mark_active%+} == vi_block ]]; then
- ble/keymap:vi/xmap/remove-eol-extension
- local sub_ranges sub_x1 sub_x2
- ble/keymap:vi/extract-block '' '' skip_middle
- local nline=${#sub_ranges[@]}
- ble/util/assert '((nline))'
- local data1; ble/string#split data1 : "${sub_ranges[0]}"
- local lpos1=${data1[0]} rpos1=$((data1[4]?data1[1]:data1[1]-1))
- if ((nline==1)); then
- local lpos2=$lpos1 rpos2=$rpos1
- else
- local data2; ble/string#split data2 : "${sub_ranges[nline-1]}"
- local lpos2=${data2[0]} rpos2=$((data2[4]?data2[1]:data2[1]-1))
- fi
- if ! ((lpos2<=_ble_edit_ind&&_ble_edit_ind<=rpos2)); then
- local lpos1=$lpos2 lpos2=$lpos1
- local rpos1=$rpos2 rpos2=$rpos1
- fi
- _ble_edit_mark=$((_ble_edit_mark==lpos1?rpos1:lpos1))
- _ble_edit_ind=$((_ble_edit_ind==lpos2?rpos2:lpos2))
- return 0
- else
- ble/widget/vi_xmap/exchange-points
- fi
-}
-function ble/widget/vi_xmap/visual-replace-char.hook {
- local key=$1
- _ble_edit_overwrite_mode=
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local ret
- if [[ $FLAG ]]; then
- ble/widget/.bell
- return 1
- elif ((key==(_ble_decode_Ctrl|91))); then # C-[ -> cancel
- return 27
- elif ! ble/keymap:vi/k2c "$key"; then
- ble/widget/.bell
- return 1
- fi
- local c=$ret
- ble/util/c2s "$c"; local s=$ret
- local old_mark_active=$_ble_edit_mark_active # save
- local mark_type=${_ble_edit_mark_active%+}
- ble/widget/vi_xmap/.save-visual-state
- ble/widget/vi_xmap/exit # Note: _ble_edit_mark_active will be cleared here
- if [[ $mark_type == vi_block ]]; then
- ble/util/c2w "$c"; local w=$ret
- ((w<=0)) && w=1
- local sub_ranges sub_x1 sub_x2
- _ble_edit_mark_active=$old_mark_active ble/keymap:vi/extract-block
- local n=${#sub_ranges[@]}
- if ((n==0)); then
- ble/widget/.bell
- return 1
- fi
- local width=$((sub_x2-sub_x1))
- local count=$((width/w))
- ble/string#repeat "$s" "$count"; local ins=$ret
- local pad=$((width-count*w))
- if ((pad)); then
- ble/string#repeat ' ' "$pad"; ins=$ins$ret
- fi
- local i=$n sub smin=0
- ble/keymap:vi/mark/start-edit-area
- while ((i--)); do
- ble/string#split sub : "${sub_ranges[i]}"
- local smin=${sub[0]} smax=${sub[1]}
- local slpad=${sub[2]} srpad=${sub[3]} sfill=${sub[4]}
- local ins1=$ins
- ((sfill)) && ins1=${ins1::(width-sfill)/w}
- ((slpad)) && { ble/string#repeat ' ' "$slpad"; ins1=$ret$ins1; }
- ((srpad)) && { ble/string#repeat ' ' "$srpad"; ins1=$ins1$ret; }
- ble/widget/.replace-range "$smin" "$smax" "$ins1"
- done
- local beg=$smin
- ble/keymap:vi/needs-eol-fix "$beg" && ((beg--))
- _ble_edit_ind=$beg
- ble/keymap:vi/mark/end-edit-area
- ble/keymap:vi/repeat/record
- else
- local beg=$_ble_edit_mark end=$_ble_edit_ind
- ((beg<=end)) || local beg=$end end=$beg
- if [[ $mark_type == vi_line ]]; then
- ble-edit/content/find-logical-bol "$beg"; local beg=$ret
- ble-edit/content/find-logical-eol "$end"; local end=$ret
- else
- ble-edit/content/eolp "$end" || ((end++))
- fi
- local ins=${_ble_edit_str:beg:end-beg}
- ins=${ins//[!$'\n']/"$s"}
- ble/widget/.replace-range "$beg" "$end" "$ins"
- ble/keymap:vi/needs-eol-fix "$beg" && ((beg--))
- _ble_edit_ind=$beg
- ble/keymap:vi/mark/set-previous-edit-area "$beg" "$end"
- ble/keymap:vi/repeat/record
- fi
- return 0
-}
-function ble/widget/vi_xmap/visual-replace-char {
- _ble_edit_overwrite_mode=R
- ble/keymap:vi/async-read-char ble/widget/vi_xmap/visual-replace-char.hook
-}
-function ble/widget/vi_xmap/linewise-operator.impl {
- local op=$1 opts=$2
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- if [[ $FLAG ]]; then
- ble/widget/.bell 'wrong keymap: xmap ではオペレータは設定されないはず'
- return 1
- fi
- local mark_type=${_ble_edit_mark_active%+}
- local beg=$_ble_edit_mark end=$_ble_edit_ind
- ((beg<=end)) || local beg=$end end=$beg
- local call_operator=
- if [[ :$opts: != *:force_line:* && $mark_type == vi_block ]]; then
- call_operator=ble/keymap:vi/call-operator-blockwise
- _ble_edit_mark_active=vi_block
- [[ :$opts: == *:extend:* ]] && _ble_edit_mark_active=vi_block+
- else
- call_operator=ble/keymap:vi/call-operator-linewise
- _ble_edit_mark_active=vi_line
- fi
- local ble_keymap_vi_mark_active=$_ble_edit_mark_active
- ble/widget/vi_xmap/.save-visual-state
- ble/widget/vi_xmap/exit
- "$call_operator" "$op" "$beg" "$end" "$ARG" "$REG"; local ext=$?
- ((ext==147)) && return 147
- ((ext)) && ble/widget/.bell
- ble/keymap:vi/adjust-command-mode
- return "$ext"
-}
-function ble/widget/vi_xmap/replace-block-lines { ble/widget/vi_xmap/linewise-operator.impl c extend; }
-function ble/widget/vi_xmap/delete-block-lines { ble/widget/vi_xmap/linewise-operator.impl d extend; }
-function ble/widget/vi_xmap/delete-lines { ble/widget/vi_xmap/linewise-operator.impl d force_line; }
-function ble/widget/vi_xmap/copy-block-or-lines { ble/widget/vi_xmap/linewise-operator.impl y; }
-function ble/widget/vi_xmap/connect-line.impl {
- local name=$1
- local ARG FLAG REG; ble/keymap:vi/get-arg 1 # ignored
- local beg=$_ble_edit_mark end=$_ble_edit_ind
- ((beg<=end)) || local beg=$end end=$beg
- local ret; ble/string#count-char "${_ble_edit_str:beg:end-beg}" $'\n'; local nline=$((ret+1))
- ble/widget/vi_xmap/.save-visual-state
- ble/widget/vi_xmap/exit # Note: _ble_edit_mark_active will be cleared here
- _ble_edit_ind=$beg
- _ble_edit_arg=$nline
- _ble_keymap_vi_oparg=
- _ble_keymap_vi_opfunc=
- _ble_keymap_vi_reg=
- "ble/widget/$name"
-}
-function ble/widget/vi_xmap/connect-line-with-space {
- ble/widget/vi_xmap/connect-line.impl vi_nmap/connect-line-with-space
-}
-function ble/widget/vi_xmap/connect-line {
- ble/widget/vi_xmap/connect-line.impl vi_nmap/connect-line
-}
-_ble_keymap_vi_xmap_insert_data=
-_ble_keymap_vi_xmap_insert_dbeg=-1
-ble/array#push _ble_textarea_local_VARNAMES \
- _ble_keymap_vi_xmap_insert_data \
- _ble_keymap_vi_xmap_insert_dbeg
-function ble/keymap:vi/xmap/update-dirty-range {
- [[ $_ble_keymap_vi_insert_leave == ble/widget/vi_xmap/block-insert-mode.onleave ]] &&
- ((_ble_keymap_vi_xmap_insert_dbeg<0||beg<_ble_keymap_vi_xmap_insert_dbeg)) &&
- _ble_keymap_vi_xmap_insert_dbeg=$beg
-}
-function ble/widget/vi_xmap/block-insert-mode.impl {
- local type=$1
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local nline=${#sub_ranges[@]}
- ble/util/assert '((nline))'
- local index ins_x
- if [[ $type == append ]]; then
- local sub=${sub_ranges[0]#*:}
- local smax=${sub%%:*}
- index=$smax
- if ble/keymap:vi/xmap/has-eol-extension; then
- ins_x='$'
- else
- ins_x=$sub_x2
- fi
- else
- local sub=${sub_ranges[0]}
- local smin=${sub%%:*}
- index=$smin
- ins_x=$sub_x1
- fi
- ble/widget/vi_xmap/cancel
- _ble_edit_ind=$index
- ble/widget/vi_nmap/.insert-mode "$ARG"
- ble/keymap:vi/repeat/record
- ble/keymap:vi/mark/set-local-mark 1 "$_ble_edit_ind"
- _ble_keymap_vi_xmap_insert_dbeg=-1
- local ret display_width
- ble/string#count-char "${_ble_edit_str::_ble_edit_ind}" $'\n'; local iline=$ret
- ble-edit/content/find-logical-bol; local bol=$ret
- ble-edit/content/find-logical-eol; local eol=$ret
- if ble/edit/use-textmap; then
- local bx by ex ey
- ble/textmap#getxy.out --prefix=b "$bol"
- ble/textmap#getxy.out --prefix=e "$eol"
- ((display_width=ex+_ble_textmap_cols*(ey-by)))
- else
- ((display_width=eol-bol))
- fi
- _ble_keymap_vi_xmap_insert_data=$iline:$ins_x:$display_width:$nline
- _ble_keymap_vi_insert_leave=ble/widget/vi_xmap/block-insert-mode.onleave
- return 0
-}
-function ble/widget/vi_xmap/block-insert-mode.onleave {
- local data=$_ble_keymap_vi_xmap_insert_data
- [[ $data ]] || continue
- _ble_keymap_vi_xmap_insert_data=
- ble/string#split data : "$data"
- local ret
- ble-edit/content/find-logical-bol; local bol=$ret
- ble/string#count-char "${_ble_edit_str::bol}" $'\n'; ((ret==data[0])) || return 1 # 行番号
- ble/keymap:vi/mark/get-local-mark 1 || return 1; local mark=$ret # `[
- ble-edit/content/find-logical-bol "$mark"; ((bol==ret)) || return 1 # 記録行 `[ と同じか
- local has_textmap=
- if ble/edit/use-textmap; then
- local cols=$_ble_textmap_cols
- has_textmap=1
- fi
- local new_width delta
- ble-edit/content/find-logical-eol; local eol=$ret
- if [[ $has_textmap ]]; then
- local bx by ex ey
- ble/textmap#getxy.out --prefix=b "$bol"
- ble/textmap#getxy.out --prefix=e "$eol"
- ((new_width=ex+cols*(ey-by)))
- else
- ((new_width=eol-bol))
- fi
- ((delta=new_width-data[2]))
- ((delta>0)) || return 1 # 縮んだ場合は処理しない
- local x1=${data[1]}
- [[ $x1 == '$' ]] && ((x1=data[2]))
- ((x1>new_width&&(x1=new_width)))
- if ((bol<=_ble_keymap_vi_xmap_insert_dbeg&&_ble_keymap_vi_xmap_insert_dbeg<=eol)); then
- local px py
- if [[ $has_textmap ]]; then
- ble/textmap#getxy.out --prefix=p "$_ble_keymap_vi_xmap_insert_dbeg"
- ((px+=cols*(py-by)))
- else
- ((px=_ble_keymap_vi_xmap_insert_dbeg-bol))
- fi
- ((px>x1&&(x1=px)))
- fi
- local x2=$((x1+delta))
- local ins= p1 p2
- if [[ $has_textmap ]]; then
- local index lx ly rx ry
- ble/textmap#hit out $((x1%cols)) $((by+x1/cols)) "$bol" "$eol"; p1=$index
- ble/textmap#hit out $((x2%cols)) $((by+x2/cols)) "$bol" "$eol"; p2=$index
- ((lx+=(ly-by)*cols,rx+=(ry-by)*cols,lx!=rx&&p2++))
- else
- ((p1=bol+x1,p2=bol+x2))
- fi
- ins=${_ble_edit_str:p1:p2-p1}
- local -a ins_beg=() ins_text=()
- local iline=1 nline=${data[3]} strlen=${#_ble_edit_str}
- for ((iline=1;iline<nline;iline++)); do
- local index= lpad=
- if ((eol<strlen)); then
- bol=$((eol+1))
- ble-edit/content/find-logical-eol "$bol"; eol=$ret
- else
- bol=$eol lpad=$'\n'
- fi
- if [[ ${data[1]} == '$' ]]; then
- index=$eol
- elif [[ $has_textmap ]]; then
- ble/textmap#getxy.out --prefix=b "$bol"
- ble/textmap#hit out $((x1%cols)) $((by+x1/cols)) "$bol" "$eol" # -> index
- local nfill
- if ((index==eol&&(nfill=x1-lx+(ly-by)*cols)>0)); then
- ble/string#repeat ' ' "$nfill"; lpad=$lpad$ret
- fi
- else
- index=$((bol+x1))
- if ((index>eol)); then
- ble/string#repeat ' ' $((index-eol)); lpad=$lpad$ret
- ((index=eol))
- fi
- fi
- ble/array#push ins_beg "$index"
- ble/array#push ins_text "$lpad$ins"
- done
- local i=${#ins_beg[@]}
- ble/keymap:vi/mark/start-edit-area
- ble/keymap:vi/mark/commit-edit-area "$p1" "$p2"
- while ((i--)); do
- local index=${ins_beg[i]} text=${ins_text[i]}
- ble/widget/.replace-range "$index" "$index" "$text"
- done
- ble/keymap:vi/mark/end-edit-area
- local index
- if ble/keymap:vi/mark/get-local-mark 60 && index=$ret; then
- ble/widget/vi-command/goto-mark.impl "$index"
- else
- ble-edit/content/find-logical-bol; index=$ret
- fi
- ble-edit/content/eolp || ((index++))
- _ble_edit_ind=$index
- return 0
-}
-function ble/widget/vi_xmap/insert-mode {
- local mark_type=${_ble_edit_mark_active%+}
- if [[ $mark_type == vi_block ]]; then
- local sub_ranges sub_x1 sub_x2
- ble/keymap:vi/extract-block '' '' first_line
- ble/widget/vi_xmap/block-insert-mode.impl insert
- else
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local beg=$_ble_edit_mark end=$_ble_edit_ind
- ((beg<=end)) || local beg=$end end=$beg
- if [[ $mark_type == vi_line ]]; then
- local ret
- ble-edit/content/find-logical-bol "$beg"; beg=$ret
- fi
- ble/widget/vi_xmap/cancel
- _ble_edit_ind=$beg
- ble/widget/vi_nmap/.insert-mode "$ARG"
- ble/keymap:vi/repeat/record
- return 0
- fi
-}
-function ble/widget/vi_xmap/append-mode {
- local mark_type=${_ble_edit_mark_active%+}
- if [[ $mark_type == vi_block ]]; then
- local sub_ranges sub_x1 sub_x2
- ble/keymap:vi/extract-block '' '' first_line
- ble/widget/vi_xmap/block-insert-mode.impl append
- else
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- local beg=$_ble_edit_mark end=$_ble_edit_ind
- ((beg<=end)) || local beg=$end end=$beg
- if [[ $mark_type == vi_line ]]; then
- if ((_ble_edit_mark>_ble_edit_ind)); then
- local ret
- ble-edit/content/find-logical-bol "$end"; end=$ret
- fi
- fi
- ble-edit/content/eolp "$end" || ((end++))
- ble/widget/vi_xmap/cancel
- _ble_edit_ind=$end
- ble/widget/vi_nmap/.insert-mode "$ARG"
- ble/keymap:vi/repeat/record
- return 0
- fi
-}
-function ble/widget/vi_xmap/paste.impl {
- local opts=$1
- [[ :$opts: != *:after:* ]]; local is_after=$?
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- [[ $REG ]] && ble/keymap:vi/register#load "$REG"
- local mark_type=${_ble_edit_mark_active%+}
- local kill_ring=$_ble_edit_kill_ring
- local kill_type=$_ble_edit_kill_type
- local adjustment=
- if [[ $mark_type == vi_block ]]; then
- if [[ $kill_type == L ]]; then
- if ((is_after)); then
- local ret; ble/keymap:vi/get-rectangle-height; local nline=$ret
- adjustment=lastline:$nline
- fi
- elif [[ $kill_type == B:* ]]; then
- is_after=0
- else
- is_after=0
- if [[ $kill_ring != *$'\n'* ]]; then
- ((${#kill_ring}>=2)) && adjustment=index:$((${#kill_ring}*ARG-1))
- local ret; ble/keymap:vi/get-rectangle-height; local nline=$ret
- ble/string#repeat "$kill_ring"$'\n' "$nline"; kill_ring=${ret%$'\n'}
- ble/string#repeat '0 ' "$nline"; kill_type=B:${ret% }
- fi
- fi
- elif [[ $mark_type == vi_line ]]; then
- if [[ $kill_type == L ]]; then
- is_after=0
- elif [[ $kill_type == B:* ]]; then
- is_after=0 kill_type=L kill_ring=$kill_ring$'\n'
- else
- is_after=0 kill_type=L
- [[ $kill_ring == *$'\n' ]] && kill_ring=$kill_ring$'\n'
- fi
- else
- is_after=0
- [[ $kill_type == L ]] && adjustment=newline
- fi
- ble/keymap:vi/mark/start-edit-area
- local _ble_keymap_vi_mark_suppress_edit=1
- {
- ble/widget/vi-command/operator d; local ext=$? # _ble_edit_kill_{ring,type} is set here
- if [[ $adjustment == newline ]]; then
- local -a KEYS=(10)
- ble/widget/self-insert
- elif [[ $adjustment == lastline:* ]]; then
- local ret
- ble-edit/content/find-logical-bol "$_ble_edit_ind" $((${adjustment#*:}-1))
- _ble_edit_ind=$ret
- fi
- local _ble_edit_kill_ring=$kill_ring
- local _ble_edit_kill_type=$kill_type
- ble/widget/vi_nmap/paste.impl "$ARG" '' "$is_after"
- if [[ $adjustment == index:* ]]; then
- local index=$((_ble_edit_ind+${adjustment#*:}))
- ((index>${#_ble_edit_str}&&(index=${#_ble_edit_str})))
- ble/keymap:vi/needs-eol-fix "$index" && ((index--))
- _ble_edit_ind=$index
- fi
- }
- ble/util/unlocal _ble_keymap_vi_mark_suppress_edit
- ble/keymap:vi/mark/end-edit-area
- ble/keymap:vi/repeat/record
- return "$ext"
-}
-function ble/widget/vi_xmap/paste-after {
- ble/widget/vi_xmap/paste.impl after
-}
-function ble/widget/vi_xmap/paste-before {
- ble/widget/vi_xmap/paste.impl before
-}
-function ble/widget/vi_xmap/increment.impl {
- local opts=$1
- local ARG FLAG REG; ble/keymap:vi/get-arg 1
- if [[ $FLAG ]]; then
- ble/widget/.bell
- return 1
- fi
- local delta=$ARG
- [[ :$opts: == *:decrease:* ]] && ((delta=-delta))
- local progress=0
- [[ :$opts: == *:progressive:* ]] && progress=$delta
- local old_mark_active=$_ble_edit_mark_active # save
- local mark_type=${_ble_edit_mark_active%+}
- ble/widget/vi_xmap/.save-visual-state
- ble/widget/vi_xmap/exit # Note: _ble_edit_mark_active will be cleared here
- if [[ $mark_type == vi_block ]]; then
- local sub_ranges sub_x1 sub_x2
- _ble_edit_mark_active=$old_mark_active ble/keymap:vi/extract-block
- if ((${#sub_ranges[@]}==0)); then
- ble/widget/.bell
- return 1
- fi
- else
- local beg=$_ble_edit_mark end=$_ble_edit_ind
- ((beg<=end)) || local beg=$end end=$beg
- if [[ $mark_type == vi_line ]]; then
- local ret
- ble-edit/content/find-logical-bol "$beg"; local beg=$ret
- ble-edit/content/find-logical-eol "$end"; local end=$ret
- else
- ble-edit/content/eolp "$end" || ((end++))
- fi
- local -a lines
- ble/string#split-lines lines "${_ble_edit_str:beg:end-beg}"
- local line index=$beg
- local -a sub_ranges
- for line in "${lines[@]}"; do
- [[ $line ]] && ble/array#push sub_ranges "$index:::::$line"
- ((index+=${#line}+1))
- done
- ((${#sub_ranges[@]})) || return 0
- fi
- local sub rex_number='^([^0-9]*)([0-9]+)' shift=0 dmin=-1 dmax=-1
- for sub in "${sub_ranges[@]}"; do
- local stext=${sub#*:*:*:*:*:}
- [[ $stext =~ $rex_number ]] || continue
- local rematch1=${BASH_REMATCH[1]}
- local rematch2=${BASH_REMATCH[2]}
- local offset=${#rematch1} length=${#rematch2}
- local number=$((10#0$rematch2))
- [[ $rematch1 == *- ]] && ((number=-number,offset--,length++))
- ((number+=delta,delta+=progress))
- if [[ $rematch2 == 0?* ]]; then
- local wsign=$((number<0?1:0))
- local zpad=$((wsign+${#rematch2}-${#number}))
- if ((zpad>0)); then
- local ret; ble/string#repeat 0 "$zpad"
- number=${number::wsign}$ret${number:wsign}
- fi
- fi
- local smin=${sub%%:*}
- local beg=$((shift+smin+offset))
- local end=$((beg+length))
- ble/widget/.replace-range "$beg" "$end" "$number"
- ((shift+=${#number}-length,
- dmin<0&&(dmin=beg),
- dmax=beg+${#number}))
- done
- local beg=${sub_ranges[0]%%:*}
- ble/keymap:vi/needs-eol-fix "$beg" && ((beg--))
- _ble_edit_ind=$beg
- ((dmin>=0)) && ble/keymap:vi/mark/set-previous-edit-area "$dmin" "$dmax"
- ble/keymap:vi/repeat/record
- return 0
-}
-function ble/widget/vi_xmap/increment { ble/widget/vi_xmap/increment.impl increase; }
-function ble/widget/vi_xmap/decrement { ble/widget/vi_xmap/increment.impl decrease; }
-function ble/widget/vi_xmap/progressive-increment { ble/widget/vi_xmap/increment.impl progressive:increase; }
-function ble/widget/vi_xmap/progressive-decrement { ble/widget/vi_xmap/increment.impl progressive:decrease; }
-function ble-decode/keymap:vi_xmap/define {
- ble/keymap:vi/set-up-command-map
- ble-bind -f __default__ vi-command/decompose-meta
- ble-bind -f 'ESC' vi_xmap/exit
- ble-bind -f 'C-[' vi_xmap/exit
- ble-bind -f 'C-c' vi_xmap/cancel
- ble-bind -f '"' vi-command/register
- ble-bind -f a vi-command/text-object
- ble-bind -f i vi-command/text-object
- ble-bind -f 'C-\ C-n' vi_xmap/cancel
- ble-bind -f 'C-\ C-g' vi_xmap/cancel
- ble-bind -f v vi_xmap/switch-to-charwise
- ble-bind -f V vi_xmap/switch-to-linewise
- ble-bind -f C-v vi_xmap/switch-to-blockwise
- ble-bind -f C-q vi_xmap/switch-to-blockwise
- ble-bind -f 'g v' vi-command/previous-visual-area
- ble-bind -f C-g vi_xmap/switch-to-select
- ble-bind -f o vi_xmap/exchange-points
- ble-bind -f O vi_xmap/exchange-boundaries
- ble-bind -f '~' 'vi-command/operator toggle_case'
- ble-bind -f 'u' 'vi-command/operator u'
- ble-bind -f 'U' 'vi-command/operator U'
- ble-bind -f 's' 'vi-command/operator c'
- ble-bind -f 'x' 'vi-command/operator d'
- ble-bind -f delete 'vi-command/operator d'
- ble-bind -f r vi_xmap/visual-replace-char
- ble-bind -f C vi_xmap/replace-block-lines
- ble-bind -f D vi_xmap/delete-block-lines
- ble-bind -f X vi_xmap/delete-block-lines
- ble-bind -f S vi_xmap/delete-lines
- ble-bind -f R vi_xmap/delete-lines
- ble-bind -f Y vi_xmap/copy-block-or-lines
- ble-bind -f J vi_xmap/connect-line-with-space
- ble-bind -f 'g J' vi_xmap/connect-line
- ble-bind -f I vi_xmap/insert-mode
- ble-bind -f A vi_xmap/append-mode
- ble-bind -f p vi_xmap/paste-after
- ble-bind -f P vi_xmap/paste-before
- ble-bind -f 'C-a' vi_xmap/increment
- ble-bind -f 'C-x' vi_xmap/decrement
- ble-bind -f 'g C-a' vi_xmap/progressive-increment
- ble-bind -f 'g C-x' vi_xmap/progressive-decrement
- ble-bind -f f1 vi_xmap/command-help
- ble-bind -f K vi_xmap/command-help
-}
-function ble-decode/keymap:vi_smap/define {
- ble-bind -f __default__ vi-command/decompose-meta
- ble-bind -f 'ESC' vi_xmap/exit
- ble-bind -f 'C-[' vi_xmap/exit
- ble-bind -f 'C-c' vi_xmap/cancel
- ble-bind -f 'C-\ C-n' nop
- ble-bind -f 'C-\ C-n' vi_xmap/cancel
- ble-bind -f 'C-\ C-g' vi_xmap/cancel
- ble-bind -f C-v vi_xmap/switch-to-visual-blockwise
- ble-bind -f C-q vi_xmap/switch-to-visual-blockwise
- ble-bind -f C-g vi_xmap/switch-to-visual
- ble-bind -f delete 'vi-command/operator d'
- ble-bind -f 'C-?' 'vi-command/operator d'
- ble-bind -f 'DEL' 'vi-command/operator d'
- ble-bind -f 'C-h' 'vi-command/operator d'
- ble-bind -f 'BS' 'vi-command/operator d'
- ble-bind -f __defchar__ vi_smap/self-insert
- ble-bind -f paste_begin vi-command/bracketed-paste
- ble-bind -f 'C-a' vi_xmap/increment
- ble-bind -f 'C-x' vi_xmap/decrement
- ble-bind -f f1 vi_xmap/command-help
- ble-bind -c 'C-z' fg
- ble-bind -f home 'vi_smap/@nomarked vi-command/beginning-of-line'
- ble-bind -f end 'vi_smap/@nomarked vi-command/forward-eol'
- ble-bind -f C-m 'vi_smap/@nomarked vi-command/forward-first-non-space'
- ble-bind -f RET 'vi_smap/@nomarked vi-command/forward-first-non-space'
- ble-bind -f S-home 'vi-command/beginning-of-line'
- ble-bind -f S-end 'vi-command/forward-eol'
- ble-bind -f S-C-m 'vi-command/forward-first-non-space'
- ble-bind -f S-RET 'vi-command/forward-first-non-space'
- ble-bind -f C-right 'vi_smap/@nomarked vi-command/forward-vword'
- ble-bind -f C-left 'vi_smap/@nomarked vi-command/backward-vword'
- ble-bind -f S-C-right 'vi-command/forward-vword'
- ble-bind -f S-C-left 'vi-command/backward-vword'
- ble-bind -f left 'vi_smap/@nomarked vi-command/backward-char'
- ble-bind -f right 'vi_smap/@nomarked vi-command/forward-char'
- ble-bind -f 'C-?' 'vi_smap/@nomarked vi-command/backward-char wrap'
- ble-bind -f 'DEL' 'vi_smap/@nomarked vi-command/backward-char wrap'
- ble-bind -f 'C-h' 'vi_smap/@nomarked vi-command/backward-char wrap'
- ble-bind -f 'BS' 'vi_smap/@nomarked vi-command/backward-char wrap'
- ble-bind -f SP 'vi_smap/@nomarked vi-command/forward-char wrap'
- ble-bind -f S-left 'vi-command/backward-char'
- ble-bind -f S-right 'vi-command/forward-char'
- ble-bind -f 'S-C-?' 'vi-command/backward-char wrap'
- ble-bind -f 'S-DEL' 'vi-command/backward-char wrap'
- ble-bind -f 'S-C-h' 'vi-command/backward-char wrap'
- ble-bind -f 'S-BS' 'vi-command/backward-char wrap'
- ble-bind -f S-SP 'vi-command/forward-char wrap'
- ble-bind -f down 'vi_smap/@nomarked vi-command/forward-line'
- ble-bind -f C-n 'vi_smap/@nomarked vi-command/forward-line'
- ble-bind -f C-j 'vi_smap/@nomarked vi-command/forward-line'
- ble-bind -f up 'vi_smap/@nomarked vi-command/backward-line'
- ble-bind -f C-p 'vi_smap/@nomarked vi-command/backward-line'
- ble-bind -f C-home 'vi_smap/@nomarked vi-command/first-nol'
- ble-bind -f C-end 'vi_smap/@nomarked vi-command/last-eol'
- ble-bind -f S-down 'vi-command/forward-line'
- ble-bind -f S-C-n 'vi-command/forward-line'
- ble-bind -f S-C-j 'vi-command/forward-line'
- ble-bind -f S-up 'vi-command/backward-line'
- ble-bind -f S-C-p 'vi-command/backward-line'
- ble-bind -f S-C-home 'vi-command/first-nol'
- ble-bind -f S-C-end 'vi-command/last-eol'
-}
-function ble/widget/vi_imap/__attach__ {
- ble/keymap:vi/update-mode-name
- return 0
-}
-function ble/widget/vi_imap/__detach__ {
- ble/edit/info/default clear
- ble/keymap:vi/clear-arg
- ble/keymap:vi/search/clear-matched
- return 0
-}
-function ble/widget/vi_imap/accept-single-line-or {
- if ble-edit/is-single-complete-line; then
- ble/keymap:vi/imap-repeat/reset
- ble/widget/accept-line
- else
- ble/widget/"$@"
- fi
-}
-function ble/widget/vi_imap/delete-region-or {
- if [[ $_ble_edit_mark_active ]]; then
- ble/keymap:vi/imap-repeat/reset
- if ((_ble_edit_ind!=_ble_edit_mark)); then
- ble/keymap:vi/undo/add more
- ble/widget/delete-region
- ble/keymap:vi/undo/add more
- fi
- else
- ble/widget/"$@"
- fi
-}
-function ble/widget/vi_imap/overwrite-mode {
- ble-edit/content/clear-arg
- if [[ $_ble_edit_overwrite_mode ]]; then
- _ble_edit_overwrite_mode=
- else
- _ble_edit_overwrite_mode=${_ble_keymap_vi_insert_overwrite:-R}
- fi
- ble/keymap:vi/update-mode-name
- return 0
-}
-function ble/widget/vi_imap/delete-backward-word {
- local space=$' \t' nl=$'\n'
- local rex="($_ble_keymap_vi_REX_WORD)[$space]*\$|[$space]+\$|$nl\$"
- if [[ ${_ble_edit_str::_ble_edit_ind} =~ $rex ]]; then
- local index=$((_ble_edit_ind-${#BASH_REMATCH}))
- if ((index!=_ble_edit_ind)); then
- ble/keymap:vi/undo/add more
- ble/widget/.delete-range "$index" "$_ble_edit_ind"
- ble/keymap:vi/undo/add more
- fi
- return 0
- else
- ble/widget/.bell
- return 1
- fi
-}
-function ble/widget/vi_imap/quoted-insert-char {
- ble/keymap:vi/imap-repeat/pop
- _ble_edit_mark_active=
- _ble_decode_char__hook=ble/widget/vi_imap/quoted-insert-char.hook
- return 147
-}
-function ble/widget/vi_imap/quoted-insert-char.hook {
- ble/keymap:vi/imap/invoke-widget ble/widget/self-insert "$1"
-}
-function ble/widget/vi_imap/quoted-insert {
- ble/keymap:vi/imap-repeat/pop
- _ble_edit_mark_active=
- _ble_decode_key__hook=ble/widget/vi_imap/quoted-insert.hook
- return 147
-}
-function ble/widget/vi_imap/quoted-insert.hook {
- ble/keymap:vi/imap/invoke-widget ble/widget/quoted-insert.hook "$1"
-}
-function ble/widget/vi_imap/bracketed-paste {
- ble/keymap:vi/imap-repeat/pop
- ble/widget/bracketed-paste
- _ble_edit_bracketed_paste_proc=ble/widget/vi_imap/bracketed-paste.proc
- return 147
-}
-function ble/widget/vi_imap/bracketed-paste.proc {
- local WIDGET=ble/widget/batch-insert
- local -a KEYS; KEYS=("$@")
- ble/keymap:vi/imap-repeat/push
- builtin eval -- "$WIDGET"
-}
-_ble_keymap_vi_brackated_paste_mark_active=
-function ble/widget/vi-command/bracketed-paste {
- local ARG FLAG REG; ble/keymap:vi/get-arg 1 # discard args
- _ble_keymap_vi_brackated_paste_mark_active=$_ble_edit_mark_active
- _ble_edit_mark_active=
- ble/widget/bracketed-paste
- _ble_edit_bracketed_paste_proc=ble/widget/vi-command/bracketed-paste.proc
- return 147
-}
-function ble/widget/vi-command/bracketed-paste.proc {
- if [[ $_ble_decode_keymap == vi_nmap ]]; then
- local isbol index=$_ble_edit_ind
- ble-edit/content/bolp && isbol=1
- ble/decode/widget/call-interactively 'ble/widget/vi_nmap/append-mode' 97
- [[ $isbol ]] && ((_ble_edit_ind=index)) # 行頭にいたときは戻る
- ble/widget/vi_imap/bracketed-paste.proc "$@"
- ble/keymap:vi/imap/invoke-widget \
- ble/widget/vi_imap/normal-mode $((_ble_decode_Ctrl|0x5b))
- elif [[ $_ble_decode_keymap == vi_[xs]map ]]; then
- local _ble_edit_mark_active=$_ble_keymap_vi_brackated_paste_mark_active
- ble/decode/widget/call-interactively 'ble/widget/vi-command/operator c' 99 || return 1
- ble/widget/vi_imap/bracketed-paste.proc "$@"
- ble/keymap:vi/imap/invoke-widget \
- ble/widget/vi_imap/normal-mode $((_ble_decode_Ctrl|0x5b))
- elif [[ $_ble_decode_keymap == vi_omap ]]; then
- ble/widget/vi_omap/cancel
- ble/widget/.bell
- return 1
- else # vi_omap
- ble/widget/.bell
- return 1
- fi
-}
-function ble/widget/vi_imap/insert-digraph.hook {
- local -a KEYS; KEYS=("$1")
- ble/widget/self-insert
-}
-function ble/widget/vi_imap/insert-digraph {
- ble/decode/keymap/push vi_digraph
- _ble_keymap_vi_digraph__hook=ble/widget/vi_imap/insert-digraph.hook
- return 0
-}
-function ble/widget/vi_imap/newline {
- local ret
- ble-edit/content/find-logical-bol; local bol=$ret
- ble-edit/content/find-non-space "$bol"; local nol=$ret
- ble/widget/default/newline
- ((bol<nol)) && ble/widget/.insert-string "${_ble_edit_str:bol:nol-bol}"
- return 0
-}
-function ble/widget/vi_imap/delete-backward-indent-or {
- local rex=$'(^|\n)([ \t]+)$'
- if [[ ${_ble_edit_str::_ble_edit_ind} =~ $rex ]]; then
- local rematch2=${BASH_REMATCH[2]} # Note: for bash-3.1 ${#arr[n]} bug
- if [[ $rematch2 ]]; then
- ble/keymap:vi/undo/add more
- ble/widget/.delete-range $((_ble_edit_ind-${#rematch2})) "$_ble_edit_ind"
- ble/keymap:vi/undo/add more
- fi
- return 0
- else
- ble/widget/"$@"
- fi
-}
-function ble-decode/keymap:vi_imap/define {
- local ble_bind_nometa=1
- ble-decode/keymap:safe/bind-common
- ble-decode/keymap:safe/bind-history
- ble-bind -f 'C-d' 'delete-region-or delete-forward-char-or-exit'
- ble-bind -f 'SP' 'magic-space'
- ble-bind -f 'C-j' 'accept-line'
- ble-bind -f 'C-RET' 'accept-line'
- ble-bind -f 'C-m' 'accept-single-line-or-newline'
- ble-bind -f 'RET' 'accept-single-line-or-newline'
- ble-bind -f 'C-x C-e' 'edit-and-execute-command'
- ble-bind -f 'C-g' 'bell'
- ble-bind -f 'C-x C-g' 'bell'
- ble-bind -f 'C-l' 'clear-screen'
- ble-bind -f 'f1' 'command-help'
- ble-bind -f 'C-x C-v' 'display-shell-version'
- ble-bind -c 'C-z' 'fg'
- ble-bind -f insert 'vi_imap/overwrite-mode'
- ble-bind -f 'C-q' 'vi_imap/quoted-insert'
- ble-bind -f 'C-v' 'vi_imap/quoted-insert'
- ble-bind -f 'C-RET' 'newline'
- ble-bind -f paste_begin 'vi_imap/bracketed-paste'
- ble-bind -f 'C-?' 'vi_imap/delete-region-or vi_imap/delete-backward-indent-or delete-backward-char'
- ble-bind -f 'DEL' 'vi_imap/delete-region-or vi_imap/delete-backward-indent-or delete-backward-char'
- ble-bind -f 'C-h' 'vi_imap/delete-region-or vi_imap/delete-backward-indent-or delete-backward-char'
- ble-bind -f 'BS' 'vi_imap/delete-region-or vi_imap/delete-backward-indent-or delete-backward-char'
- ble-bind -f 'C-w' 'vi_imap/delete-backward-word'
- ble-decode/keymap:vi_imap/bind-complete
- ble-bind -f 'C-\' bell
- ble-bind -f 'C-^' bell
- ble-bind -f __attach__ vi_imap/__attach__
- ble-bind -f __detach__ vi_imap/__detach__
- ble-bind -f __default__ vi_imap/__default__
- ble-bind -f __before_widget__ vi_imap/__before_widget__
- ble-bind -f __line_limit__ __line_limit__
- ble-bind -f 'ESC' 'vi_imap/normal-mode'
- ble-bind -f 'C-[' 'vi_imap/normal-mode'
- ble-bind -f 'C-c' 'vi_imap/normal-mode-without-insert-leave'
- ble-bind -f 'C-o' 'vi_imap/single-command-mode'
-}
-function ble-decode/keymap:vi_imap/define-meta-bindings {
- local ble_bind_keymap=vi_imap
- ble-bind -f 'M-^' 'history-expand-line'
- ble-bind -f 'C-M-l' 'redraw-line'
- ble-bind -f 'M-#' 'insert-comment'
- ble-bind -f 'M-C-e' 'shell-expand-line'
- ble-bind -f 'M-&' 'tilde-expand'
- ble-bind -f 'C-M-g' 'bell'
- ble-bind -c 'M-z' 'fg'
- ble-bind -f 'M-C-m' 'newline'
- ble-bind -f 'M-RET' 'newline'
- ble-bind -f 'M-SP' 'set-mark'
- ble-bind -f 'M-w' 'copy-region-or copy-uword'
- ble-bind -f 'M-y' 'yank-pop'
- ble-bind -f 'M-S-y' 'yank-pop backward'
- ble-bind -f 'M-Y' 'yank-pop backward'
- ble-bind -f 'M-\' 'delete-horizontal-space'
- ble-bind -f 'M-right' '@nomarked forward-sword'
- ble-bind -f 'M-left' '@nomarked backward-sword'
- ble-bind -f 'S-M-right' '@marked forward-sword'
- ble-bind -f 'S-M-left' '@marked backward-sword'
- ble-bind -f 'M-d' 'kill-forward-cword'
- ble-bind -f 'M-h' 'kill-backward-cword'
- ble-bind -f 'M-delete' 'copy-forward-sword'
- ble-bind -f 'M-C-?' 'copy-backward-sword'
- ble-bind -f 'M-DEL' 'copy-backward-sword'
- ble-bind -f 'M-C-h' 'copy-backward-sword'
- ble-bind -f 'M-BS' 'copy-backward-sword'
- ble-bind -f 'M-f' '@nomarked forward-cword'
- ble-bind -f 'M-b' '@nomarked backward-cword'
- ble-bind -f 'M-F' '@marked forward-cword'
- ble-bind -f 'M-B' '@marked backward-cword'
- ble-bind -f 'M-S-f' '@marked forward-cword'
- ble-bind -f 'M-S-b' '@marked backward-cword'
- ble-bind -f 'M-c' 'capitalize-eword'
- ble-bind -f 'M-l' 'downcase-eword'
- ble-bind -f 'M-u' 'upcase-eword'
- ble-bind -f 'M-t' 'transpose-ewords'
- ble-bind -f 'M-m' '@nomarked non-space-beginning-of-line'
- ble-bind -f 'S-M-m' '@marked non-space-beginning-of-line'
- ble-bind -f 'M-M' '@marked non-space-beginning-of-line'
- ble-bind -f 'M-<' 'history-beginning'
- ble-bind -f 'M->' 'history-end'
- ble-bind -f 'M-.' 'insert-last-argument'
- ble-bind -f 'M-_' 'insert-last-argument'
- ble-bind -f 'M-C-y' 'insert-nth-argument'
- ble-bind -f 'M-?' 'complete show_menu'
- ble-bind -f 'M-*' 'complete insert_all'
- ble-bind -f 'M-{' 'complete insert_braces'
- ble-bind -f 'M-/' 'complete context=filename'
- ble-bind -f 'M-~' 'complete context=username'
- ble-bind -f 'M-$' 'complete context=variable'
- ble-bind -f 'M-@' 'complete context=hostname'
- ble-bind -f 'M-!' 'complete context=command'
- ble-bind -f "M-'" 'sabbrev-expand'
- ble-bind -f 'M-g' 'complete context=glob'
- ble-bind -f 'M-C-i' 'complete context=dynamic-history'
- ble-bind -f 'M-TAB' 'complete context=dynamic-history'
-}
-_ble_keymap_vi_cmap_hook=
-_ble_keymap_vi_cmap_cancel_hook=
-_ble_keymap_vi_cmap_before_command=
-_ble_keymap_vi_cmap_history=()
-_ble_keymap_vi_cmap_history_edit=()
-_ble_keymap_vi_cmap_history_dirt=()
-_ble_keymap_vi_cmap_history_index=0
-function ble/keymap:vi/async-commandline-mode {
- local hook=$1
- _ble_keymap_vi_cmap_hook=$hook
- _ble_keymap_vi_cmap_cancel_hook=
- _ble_keymap_vi_cmap_before_command=
- ble/textarea#render
- ble/textarea#save-state _ble_keymap_vi_cmap
- ble/util/save-vars _ble_keymap_vi_cmap _ble_canvas_panel_focus
- _ble_keymap_vi_cmap_history_prefix=$_ble_history_prefix
- ble/decode/keymap/push vi_cmap
- ble/keymap:vi/update-mode-name
- _ble_textarea_panel=1
- _ble_canvas_panel_focus=1
- ble/textarea#invalidate
- _ble_edit_PS1=$PS2
- _ble_prompt_ps1_data=(0 '' '' 0 0 0 32 0 '' '')
- _ble_edit_dirty_observer=()
- ble/widget/.newline/clear-content
- _ble_edit_arg=
- ble-edit/undo/clear-all
- ble/history/set-prefix _ble_keymap_vi_cmap
- _ble_syntax_lang=text
- _ble_highlight_layer__list=(plain region overwrite_mode)
-}
-function ble/widget/vi_cmap/accept {
- local hook=${_ble_keymap_vi_cmap_hook}
- _ble_keymap_vi_cmap_hook=
- local result=$_ble_edit_str
- [[ $result ]] && ble/history/add "$result" # Note: cancel でも登録する
- local -a DRAW_BUFF=()
- ble/canvas/panel#set-height.draw "$_ble_textarea_panel" 0
- ble/canvas/bflush.draw
- ble/textarea#restore-state _ble_keymap_vi_cmap
- ble/textarea#clear-state _ble_keymap_vi_cmap
- ble/util/restore-vars _ble_keymap_vi_cmap _ble_canvas_panel_focus
- [[ $_ble_edit_overwrite_mode ]] && ble/util/buffer "$_ble_term_civis"
- ble/history/set-prefix "$_ble_keymap_vi_cmap_history_prefix"
- ble/decode/keymap/pop
- ble/keymap:vi/update-mode-name
- if [[ $hook ]]; then
- builtin eval -- "$hook \"\$result\""
- else
- ble/keymap:vi/adjust-command-mode
- return 0
- fi
-}
-function ble/widget/vi_cmap/cancel {
- _ble_keymap_vi_cmap_hook=$_ble_keymap_vi_cmap_cancel_hook
- ble/widget/vi_cmap/accept
-}
-function ble/widget/vi_cmap/__before_widget__ {
- if [[ $_ble_keymap_vi_cmap_before_command ]]; then
- builtin eval -- "$_ble_keymap_vi_cmap_before_command"
- fi
-}
-function ble/widget/vi_cmap/__line_limit__.edit {
- local content=$1
- ble/widget/edit-and-execute-command.edit "$content" no-newline; local ext=$?
- ((ext==127)) && return "$ext"
- ble-edit/content/reset "$ret"
- ble/widget/vi_cmap/accept
-}
-function ble/widget/vi_cmap/__line_limit__ {
- ble/widget/__line_limit__ vi_cmap/__line_limit__.edit
-}
-function ble-decode/keymap:vi_cmap/define {
- local ble_bind_nometa=
- ble-decode/keymap:safe/bind-common
- ble-decode/keymap:safe/bind-history
- ble-decode/keymap:safe/bind-complete
- ble-bind -f __before_widget__ vi_cmap/__before_widget__
- ble-bind -f __line_limit__ vi_cmap/__line_limit__
- ble-bind -f 'ESC' vi_cmap/cancel
- ble-bind -f 'C-[' vi_cmap/cancel
- ble-bind -f 'C-c' vi_cmap/cancel
- ble-bind -f 'C-m' vi_cmap/accept
- ble-bind -f 'RET' vi_cmap/accept
- ble-bind -f 'C-j' vi_cmap/accept
- ble-bind -f 'C-g' bell
- ble-bind -f 'C-x C-g' bell
- ble-bind -f 'C-M-g' bell
- ble-bind -f 'C-l' redraw-line
- ble-bind -f 'C-M-l' redraw-line
- ble-bind -f 'C-x C-v' display-shell-version
- ble-bind -f 'C-\' bell
- ble-bind -f 'C-^' bell
-}
-function ble-decode/keymap:vi/initialize {
- local fname_keymap_cache=$_ble_base_cache/keymap.vi
- if [[ -s $fname_keymap_cache &&
- $fname_keymap_cache -nt $_ble_base/keymap/vi.sh &&
- $fname_keymap_cache -nt $_ble_base/lib/init-cmap.sh ]]; then
- source "$fname_keymap_cache" && return 0
- fi
- 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
- } 3>| "$fname_keymap_cache"
- ble/edit/info/immediate-show text "ble.sh: updating cache/keymap.vi... done"
-}
-ble-decode/keymap:vi/initialize
-blehook/invoke keymap_load
-blehook/invoke keymap_vi_load
-return 0