bash/.local/share/blesh/lib/vim-airline.sh
2024-08-18 03:40:38 +02:00

339 lines
16 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Copyright 2015 Koichi Murase <myoga.murase@gmail.com>. All rights reserved.
# This script is a part of blesh (https://github.com/akinomyoga/ble.sh)
# provided under the BSD-3-Clause license. Do not edit this file because this
# is not the original source code: Various pre-processing has been applied.
# Also, the code comments and blank lines are stripped off in the installation
# process. Please find the corresponding source file(s) in the repository
# "akinomyoga/ble.sh".
#
# Source: /lib/vim-airline.sh
ble-import keymap.vi
ble-import prompt-git
bleopt/declare -n vim_airline_theme dark
function bleopt/check:vim_airline_theme {
local init=ble/lib/vim-airline/theme:"$value"/initialize
if ! ble/is-function "$init"; then
local ret
if ! ble/util/import/search "airline/$value"; then
ble/util/print "ble/lib/vim-airline: theme '$value' not found." >&2
return 1
fi
ble/util/import "$ret"
ble/is-function "$init" || return 1
fi
"$init"
return 0
}
bleopt/declare -v vim_airline_section_a '\e[1m\q{lib/vim-airline/mode}'
bleopt/declare -v vim_airline_section_b '\q{lib/vim-airline/gitstatus}'
bleopt/declare -v vim_airline_section_c '\w'
bleopt/declare -v vim_airline_section_x 'bash'
bleopt/declare -v vim_airline_section_y '$_ble_util_locale_encoding[unix]'
bleopt/declare -v vim_airline_section_z ' \q{history-percentile} \e[1m!\q{history-index}/\!\e[22m \q{position}'
bleopt/declare -v vim_airline_left_sep $'\uE0B0'
bleopt/declare -v vim_airline_left_alt_sep $'\uE0B1'
bleopt/declare -v vim_airline_right_sep $'\uE0B2'
bleopt/declare -v vim_airline_right_alt_sep $'\uE0B3'
bleopt/declare -v vim_airline_symbol_branch $'\uE0A0'
bleopt/declare -v vim_airline_symbol_dirty $'\u26A1'
function bleopt/check:vim_airline_left_sep { ble/prompt/unit#clear _ble_prompt_status; }
function bleopt/check:vim_airline_left_alt_sep { ble/prompt/unit#clear _ble_prompt_status; }
function bleopt/check:vim_airline_right_sep { ble/prompt/unit#clear _ble_prompt_status; }
function bleopt/check:vim_airline_right_alt_sep { ble/prompt/unit#clear _ble_prompt_status; }
builtin eval -- "${_ble_util_gdict_declare//NAME/_ble_lib_vim_airline_mode_map_default}"
ble/gdict#set _ble_lib_vim_airline_mode_map_default 'i' 'INSERT'
ble/gdict#set _ble_lib_vim_airline_mode_map_default 'n' 'NORMAL'
ble/gdict#set _ble_lib_vim_airline_mode_map_default 'in' '(INSERT)'
ble/gdict#set _ble_lib_vim_airline_mode_map_default 'o' 'OP PENDING'
ble/gdict#set _ble_lib_vim_airline_mode_map_default 'R' 'REPLACE'
ble/gdict#set _ble_lib_vim_airline_mode_map_default '' 'V REPLACE'
ble/gdict#set _ble_lib_vim_airline_mode_map_default 'v' 'VISUAL'
ble/gdict#set _ble_lib_vim_airline_mode_map_default 'V' 'V-LINE'
ble/gdict#set _ble_lib_vim_airline_mode_map_default '' 'V-BLOCK'
ble/gdict#set _ble_lib_vim_airline_mode_map_default 's' 'SELECT'
ble/gdict#set _ble_lib_vim_airline_mode_map_default 'S' 'S-LINE'
ble/gdict#set _ble_lib_vim_airline_mode_map_default '' 'S-BLOCK'
ble/gdict#set _ble_lib_vim_airline_mode_map_default '?' '------'
ble/gdict#set _ble_lib_vim_airline_mode_map_default 'c' 'COMMAND'
builtin eval -- "${_ble_util_gdict_declare//NAME/_ble_lib_vim_airline_mode_map_atomic}"
ble/gdict#set _ble_lib_vim_airline_mode_map_atomic 'i' 'I'
ble/gdict#set _ble_lib_vim_airline_mode_map_atomic 'n' 'N'
ble/gdict#set _ble_lib_vim_airline_mode_map_atomic 'R' 'R'
ble/gdict#set _ble_lib_vim_airline_mode_map_atomic 'v' 'V'
ble/gdict#set _ble_lib_vim_airline_mode_map_atomic 'V' 'V-L'
ble/gdict#set _ble_lib_vim_airline_mode_map_atomic '' 'V-B'
ble/gdict#set _ble_lib_vim_airline_mode_map_atomic 's' 'S'
ble/gdict#set _ble_lib_vim_airline_mode_map_atomic 'S' 'S-L'
ble/gdict#set _ble_lib_vim_airline_mode_map_atomic '' 'S-B'
ble/gdict#set _ble_lib_vim_airline_mode_map_atomic '?' '--'
ble/gdict#set _ble_lib_vim_airline_mode_map_atomic 'c' 'C'
builtin eval -- "${_ble_util_gdict_declare//NAME/_ble_lib_vim_airline_mode_map}"
ble/gdict#cp _ble_lib_vim_airline_mode_map_default _ble_lib_vim_airline_mode_map
function ble/lib/vim-airline/initialize-faces {
ble/color/defface vim_airline_a fg=17,bg=45
ble/color/defface vim_airline_b fg=231,bg=27
ble/color/defface vim_airline_c fg=231,bg=18
ble/color/defface vim_airline_error fg=16,bg=88 # fg=#000000,bg=#990000
ble/color/defface vim_airline_term fg=158,bg=234 # fg=#9cffd3,bg=#202020
ble/color/defface vim_airline_warning fg=16,bg=166 # fg=#000000,bg=#df5f00
local section map
for section in a b c error term warning; do
for map in _normal _insert _visual _commandline _inactive; do
ble/color/defface "vim_airline_$section$map" ref:"vim_airline_$section"
done
ble/color/defface "vim_airline_${section}_replace" ref:"vim_airline_${section}_insert"
done
local map
for map in '' _normal _insert _replace _visual _commandline _inactive; do
ble/color/defface "vim_airline_x$map" ref:"vim_airline_c$map"
ble/color/defface "vim_airline_y$map" ref:"vim_airline_b$map"
ble/color/defface "vim_airline_z$map" ref:"vim_airline_a$map"
done
local name
for name in {a,b,c,x,y,z,error,term,warning}{,_normal,_insert,_replace,_visual,_commandline,_inactive}; do
ble/color/defface "vim_airline_${name}_modified" ref:"vim_airline_$name"
done
}
ble/lib/vim-airline/initialize-faces
function ble/lib/vim-airline/convert-theme/.to-color256 {
local R=$((16#${1:1:2}))
local G=$((16#${1:3:2}))
local B=$((16#${1:5:2}))
ble/color/convert-rgb24-to-color256 "$R" "$G" "$B"
}
function ble/lib/vim-airline/convert-theme/.setface {
local gspec=
local ret
ble/lib/vim-airline/convert-theme/.to-color256 "$2"; local fg=$ret
ble/lib/vim-airline/convert-theme/.to-color256 "$3"; local bg=$ret
printf 'ble/color/setface vim_airline_%-13s %-13s # %s\n' "$1" "fg=$fg,bg=$bg" "fg=$2,bg=$3"
}
function ble/lib/vim-airline/convert-theme {
local file=$1
sed -n 's/let s:airline_\([_a-zA-Z0-9]\{1,\}\)[^[:alnum:]]\{1,\}\(\#[0-9a-fA-F]\{6\}\)[^[:alnum:]]\{1,\}\(\#[0-9a-fA-F]\{6\}\).*/\1 \2 \3/p' "$file" |
while ble/bash/read face fg bg; do
ble/lib/vim-airline/convert-theme/.setface "$face" "$fg" "$bg"
done
}
ble/color/setface vim_airline_a_normal fg=17,bg=190 # fg=#00005f,bg=#dfff00
ble/color/setface vim_airline_b_normal fg=231,bg=238 # fg=#ffffff,bg=#444444
ble/color/setface vim_airline_c_normal fg=158,bg=234 # fg=#9cffd3,bg=#202020
ble/color/setface vim_airline_a_insert fg=17,bg=45 # fg=#00005f,bg=#00dfff
ble/color/setface vim_airline_b_insert fg=231,bg=27 # fg=#ffffff,bg=#005fff
ble/color/setface vim_airline_c_insert fg=231,bg=18 # fg=#ffffff,bg=#000080
ble/color/setface vim_airline_a_visual fg=16,bg=214 # fg=#000000,bg=#ffaf00
ble/color/setface vim_airline_b_visual fg=16,bg=202 # fg=#000000,bg=#ff5f00
ble/color/setface vim_airline_c_visual fg=231,bg=52 # fg=#ffffff,bg=#5f0000
ble/color/setface vim_airline_a_inactive fg=239,bg=234 # fg=#4e4e4e,bg=#1c1c1c
ble/color/setface vim_airline_b_inactive fg=239,bg=235 # fg=#4e4e4e,bg=#262626
ble/color/setface vim_airline_c_inactive fg=239,bg=236 # fg=#4e4e4e,bg=#303030
ble/color/setface vim_airline_a_commandline fg=17,bg=40 # fg=#00005f,bg=#00d700
ble/color/setface vim_airline_b_commandline fg=231,bg=238 # fg=#ffffff,bg=#444444
ble/color/setface vim_airline_c_commandline fg=158,bg=234 # fg=#9cffd3,bg=#202020
_ble_lib_vim_airline_mode_data=()
_ble_lib_vim_airline_keymap=
_ble_lib_vim_airline_mode=
_ble_lib_vim_airline_rawmode=
function ble/prompt/unit:_ble_lib_vim_airline_mode/update {
local keymap mode m
ble/keymap:vi/script/get-vi-keymap
ble/keymap:vi/script/get-mode
case $mode in
(i*) m='insert' ;;
([R]*) m='replace' ;;
(*[vVsS]) m='visual' ;;
(*c) m='commandline' ;;
(*n) m='normal' ;;
(*) m='inactive' ;;
esac
ble/prompt/unit/add-hash '$_ble_edit_str'
ble/prompt/unit/add-hash '$_ble_history_INDEX'
local entry
ble/history/get-entry "$_ble_history_INDEX"
[[ $_ble_edit_str != "$entry" ]] && m=${m}_modified
ble/prompt/unit/assign _ble_lib_vim_airline_keymap "$keymap"
ble/prompt/unit/assign _ble_lib_vim_airline_mode "$m"
ble/prompt/unit/assign _ble_lib_vim_airline_rawmode "$mode"
[[ $prompt_unit_changed ]]
}
_ble_lib_vim_airline_sep_width_data=()
function ble/prompt/unit:_ble_lib_vim_airline_sep_width/update {
ble/prompt/unit/add-hash '$bleopt_char_width_version,$bleopt_char_width_mode'
ble/prompt/unit/add-hash '$bleopt_emoji_version,$bleopt_emoji_width,$bleopt_emoji_opts'
local w ret x y g
((x=0,y=0,g=0))
LINES=1 COLUMNS=$cols ble/canvas/trace "$bleopt_vim_airline_left_sep" confine
((w=x,x=0,y=0,g=0))
LINES=1 COLUMNS=$cols ble/canvas/trace "$bleopt_vim_airline_left_alt_sep" confine
((w=x>w?x:w))
ble/prompt/unit/add-hash '$bleopt_vim_airline_left_sep'
ble/prompt/unit/add-hash '$bleopt_vim_airline_left_alt_sep'
ble/prompt/unit/assign '_ble_lib_vim_airline_sep_width_data[3]' "$w"
((x=0,y=0,g=0))
LINES=1 COLUMNS=$cols ble/canvas/trace "$bleopt_vim_airline_right_sep" confine
((w=x,x=0,y=0,g=0))
LINES=1 COLUMNS=$cols ble/canvas/trace "$bleopt_vim_airline_right_alt_sep" confine
((w=x>w?x:w))
ble/prompt/unit/add-hash '$bleopt_vim_airline_right_sep'
ble/prompt/unit/add-hash '$bleopt_vim_airline_right_alt_sep'
ble/prompt/unit/assign '_ble_lib_vim_airline_sep_width_data[4]' "$w"
[[ $prompt_unit_changed ]]
}
function ble/prompt/backslash:lib/vim-airline/mode/.resolve {
local raw=$1
if ble/gdict#has _ble_lib_vim_airline_mode_map "$raw"; then
ble/gdict#get _ble_lib_vim_airline_mode_map "$raw"
else
case $raw in
(o) ble/prompt/backslash:lib/vim-airline/mode/.resolve "$_ble_lib_vim_airline_rawmode" ;;
([iR]?*) ble/prompt/backslash:lib/vim-airline/mode/.resolve "${raw::1}" ;;
(*?[ncvVsS]) ble/prompt/backslash:lib/vim-airline/mode/.resolve "${raw:${#raw}-1}" ;;
() ble/prompt/backslash:lib/vim-airline/mode/.resolve R ;;
(R) ble/prompt/backslash:lib/vim-airline/mode/.resolve i ;;
([S]) ble/prompt/backslash:lib/vim-airline/mode/.resolve s ;;
([Vs]) ble/prompt/backslash:lib/vim-airline/mode/.resolve v ;;
([ivnc])
ret=
case $_ble_lib_vim_airline_rawmode in
(i*) ret=$bleopt_keymap_vi_mode_name_insert ;;
(R*) ret=$bleopt_keymap_vi_mode_name_replace ;;
(*) ret=$bleopt_keymap_vi_mode_name_vreplace ;;
esac
[[ $_ble_lib_vim_airline_rawmode == [iR]?* ]] &&
ble/string#tolower "($insert) "
case $_ble_lib_vim_airline_rawmode in
(*n)
if [[ ! $ret ]]; then
local rex='[[:alnum:]](.*[[:alnum:]])?'
[[ $bleopt_keymap_vi_mode_string_nmap =~ $rex ]]
ret=${BASH_REMATCH[0]:-NORMAL}
fi ;;
(*v) ret="${ret}${ret:+ }$bleopt_keymap_vi_mode_name_visual" ;;
(*V) ret="${ret}${ret:+ }$bleopt_keymap_vi_mode_name_visual $bleopt_keymap_vi_mode_name_line" ;;
(*) ret="${ret}${ret:+ }$bleopt_keymap_vi_mode_name_visual $bleopt_keymap_vi_mode_name_block" ;;
(*s) ret="${ret}${ret:+ }$bleopt_keymap_vi_mode_name_select" ;;
(*S) ret="${ret}${ret:+ }$bleopt_keymap_vi_mode_name_select $bleopt_keymap_vi_mode_name_line" ;;
(*) ret="${ret}${ret:+ }$bleopt_keymap_vi_mode_name_select $bleopt_keymap_vi_mode_name_block" ;;
(*c) ret="${ret}${ret:+ }COMMAND" ;;
esac
[[ $ret ]] ||
ble/prompt/backslash:lib/vim-airline/mode/.resolve '?' ;;
(*) ret='?__' ;;
esac
fi
}
function ble/prompt/backslash:lib/vim-airline/mode {
local ret
if [[ $_ble_lib_vim_airline_keymap == vi_omap ]]; then
ble/prompt/backslash:lib/vim-airline/mode/.resolve o
else
ble/prompt/backslash:lib/vim-airline/mode/.resolve "$_ble_lib_vim_airline_rawmode"
fi
[[ $ret ]] && ble/prompt/print "$ret"
}
function ble/prompt/backslash:lib/vim-airline/gitstatus {
local "${_ble_contrib_prompt_git_vars[@]/%/=}" # WA #D1570 checked
if ble/contrib/prompt-git/initialize; then
ble/contrib/prompt-git/update-head-information
if [[ $branch ]]; then
ble/prompt/print "$bleopt_vim_airline_symbol_branch$branch"
elif [[ $hash ]]; then
ble/prompt/print "$bleopt_vim_airline_symbol_branch${hash::7}"
else
ble/prompt/print '$bleopt_vim_airline_symbol_branch???????'
fi
ble/contrib/prompt-git/is-dirty &&
ble/prompt/print "$bleopt_vim_airline_symbol_dirty"
fi
}
function ble/prompt/unit:{vim-airline-section}/update {
local section=$1
local ref_ps=bleopt_vim_airline_section_$section
local face=vim_airline_${section}_$_ble_lib_vim_airline_mode
local prefix=_ble_lib_vim_airline_section_$section
ble/prompt/unit/add-hash '$_ble_lib_vim_airline_mode_data'
ble/prompt/unit/add-hash "\$$ref_ps"
local trace_opts=confine:relative:noscrc:face0="$face":ansi:measure-bbox:measure-gbox
local prompt_rows=1 prompt_cols=$cols # Note: cols は \q{lib/vim-airline} で設定される
ble/prompt/unit:{section}/update "$prefix" "${!ref_ps}" "$trace_opts"
}
function ble/prompt/unit:_ble_lib_vim_airline_section_a/update { ble/prompt/unit:{vim-airline-section}/update a; }
function ble/prompt/unit:_ble_lib_vim_airline_section_b/update { ble/prompt/unit:{vim-airline-section}/update b; }
function ble/prompt/unit:_ble_lib_vim_airline_section_c/update { ble/prompt/unit:{vim-airline-section}/update c; }
function ble/prompt/unit:_ble_lib_vim_airline_section_x/update { ble/prompt/unit:{vim-airline-section}/update x; }
function ble/prompt/unit:_ble_lib_vim_airline_section_y/update { ble/prompt/unit:{vim-airline-section}/update y; }
function ble/prompt/unit:_ble_lib_vim_airline_section_z/update { ble/prompt/unit:{vim-airline-section}/update z; }
function ble/lib/vim-airline/.print-section {
local section=$1
local ret g0 bg
ble/color/face2g "vim_airline_${section}_$_ble_lib_vim_airline_mode"; g0=$ret
ble/color/g#compute-bg "$g0"; bg=$ret
if [[ $prev_g0 ]]; then
local sep=bleopt_vim_airline gsep
if [[ $prev_section == [ab] ]]; then
sep=${sep}_left
else
sep=${sep}_right
fi
if [[ $prev_bg == $bg ]]; then
sep=${sep}_alt_sep
if [[ $prev_section == [ab] ]]; then
gsep=$prev_g0
else
gsep=$g0
fi
((gsep&=~_ble_color_gflags_DecorationMask|_ble_color_gflags_Revert|_ble_color_gflags_Invisible))
else
sep=${sep}_sep gsep=0
if [[ $sep == *_right_sep ]]; then
ble/color/g#setfg gsep "$bg"
ble/color/g#setbg gsep "$prev_bg"
else
ble/color/g#setfg gsep "$prev_bg"
ble/color/g#setbg gsep "$bg"
fi
fi
ble/color/g2sgr-ansi "$gsep"
ble/prompt/print "$ret${!sep}"
fi
local ref_show=_ble_lib_vim_airline_section_${section}_show
if [[ ${!ref_show} ]]; then
ble/prompt/unit:{section}/get "_ble_lib_vim_airline_section_$section"; local esc=$ret
ble/color/g2sgr-ansi "$g0"
ble/prompt/print "$ret $esc$ret "
fi
[[ $section == c ]] && ble/prompt/print $'\r'
prev_g0=$g0
prev_bg=$bg
prev_section=$section
}
function ble/prompt/backslash:lib/vim-airline {
local "${_ble_contrib_prompt_git_vars[@]/%/=}" # WA #D1570 checked
ble/prompt/unit#update _ble_lib_vim_airline_mode
ble/prompt/unit#update _ble_lib_vim_airline_sep_width
local lwsep=${_ble_lib_vim_airline_sep_width_data[3]:-1}
local rwsep=${_ble_lib_vim_airline_sep_width_data[4]:-1}
local ret bg=0
ble/color/face2g "vim_airline_c_$_ble_lib_vim_airline_mode"
ble/color/g#getbg "$ret"
ble/color/g#setbg bg "$ret"
ble/color/setface prompt_status_line "g:$bg"
local cols=$COLUMNS; ((_ble_term_xenl||cols--))
local unit rest_cols=$((cols-2*lwsep-3*rwsep))
for unit in _ble_lib_vim_airline_section_{a,c,z,b,y,x}; do
ble/prompt/unit#update "$unit"
local gx1=${unit}_gbox[0]; gx1=${!gx1}
local x2=${unit}_bbox[2]; x2=${!x2}
local show=
[[ $gx1 ]] && ((x2+2<=rest_cols)) && ((show=1,rest_cols-=x2+2))
builtin eval -- "${unit}_show=\$show"
done
local section prev_section= prev_g0= prev_bg=
for section in a b c x y z; do
ble/lib/vim-airline/.print-section "$section"
done
}
bleopt -I vim_airline_@
bleopt keymap_vi_mode_show=
bleopt prompt_status_line='\q{lib/vim-airline}'
bleopt prompt_status_align=$'justify=\r'