Skip to content

Commit

Permalink
airline: support "bleopt vim_airline_theme"
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed Jun 10, 2021
1 parent e87ac21 commit 73b037f
Show file tree
Hide file tree
Showing 9 changed files with 476 additions and 128 deletions.
6 changes: 3 additions & 3 deletions GNUmakefile
Expand Up @@ -105,10 +105,10 @@ update-contrib:
git submodule update --init --recursive
contrib/.git:
git submodule update --init --recursive
outdirs += $(OUTDIR)/contrib
contrib-files = $(wildcard contrib/*.bash)
outdirs += $(OUTDIR)/contrib $(OUTDIR)/contrib/airline
contrib-files = $(wildcard contrib/*.bash contrib/airline/*.bash)
outfiles += $(contrib-files:contrib/%=$(OUTDIR)/contrib/%)
$(OUTDIR)/contrib/%.bash: contrib/%.bash | contrib/.git $(OUTDIR)/contrib
$(OUTDIR)/contrib/%.bash: contrib/%.bash | contrib/.git $(OUTDIR)/contrib $(OUTDIR)/contrib/airline
cp -p $< $@

#------------------------------------------------------------------------------
Expand Down
7 changes: 4 additions & 3 deletions blerc
Expand Up @@ -717,17 +717,18 @@ function blerc/vim-load-hook {
# bleopt term_vi_cmap=

## vim-surround
#ble-import lib/vim-surround
#ble-import vim-surround
#bleopt vim_surround_45:=$'$( \r )'
#bleopt vim_surround_61:=$'$(( \r ))'

## vim-arpeggio
#ble-import lib/vim-arpeggio
#ble-import vim-arpeggio
#bleopt vim_arpeggio_timeoutlen=10
#ble/lib/vim-arpeggio.sh/bind -s jk 'hello'

## vim-airline
#ble-import lib/vim-airline
#ble-import vim-airline
#bleopt vim_airline_theme=light
}
blehook/eval-after-load keymap_vi blerc/vim-load-hook

Expand Down
240 changes: 152 additions & 88 deletions lib/vim-airline.sh

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion memo/ChangeLog.md
Expand Up @@ -41,6 +41,7 @@
- syntax: support undocumented `${a~}` and `${a~~}` `#D1561` 4df29a6
- lib: support `lib/vim-airline` (motivated by huresche) `#D1565` da1d0ff
- util (`ble/gdict`): refactor `#D1569` 7732eed
- vim-airline: support `bleopt vim_airline_theme` `#D1589` 0000000
- util, color: refactor configuration interfaces (`bleopt`, `blehook`, `ble-face`) `#D1568` c94d292
- color: support new face setting function `ble-face`
- util (`bleopt`): support option `-r` and `-u` and wildcards in option names
Expand Down Expand Up @@ -128,7 +129,7 @@
- history: fix the workaround for bash-3.0 bug of reducing histories `#D1576` 15c9133
- syntax: fix a bug that argument completion is attempted in nested commands (reported by huresche) `#D1579` 301d40f
- edit (brackated-paste): fix incomplete `CR => LF` conversion (reported by alborotogarcia) `#D1587` 8d6da16
- main (adjust-bash-options): adjust `LC_COLLATE=C` `#D1588` 0000000
- main (adjust-bash-options): adjust `LC_COLLATE=C` `#D1588` e87ac21

## Compatibility

Expand Down
156 changes: 156 additions & 0 deletions memo/D1589-ConvertAirlineThemes.sh
@@ -0,0 +1,156 @@
#!/bin/bash

if [[ ! ${BLE_VERSION-} ]]; then
echo "This script needs to be sourced in a ble.sh session." >&2
return 1 || exit 1
fi

year=$(date +%Y)

declare -A name2color=([none]=-1 [lightmagenta]='#ffe0ff')
function ble/lib/vim-airline/convert-theme/load-vim-rgb {
local R G B name ret
while builtin read -r R G B name || [[ $name ]]; do
name=${name,,}
name=${name//["$_ble_term_IFS"]}
[[ $name ]] || continue
printf -v ret '#%02x%02x%02x' "$R" "$G" "$B"
name2color[$name]=$ret
done < /usr/share/vim/vim82/rgb.txt
}
ble/lib/vim-airline/convert-theme/load-vim-rgb

function ble/lib/vim-airline/convert-theme/decode-color {
local cspec=${1,,} ret
if [[ $cspec == '#'?????? ]]; then
local R=$((16#${cspec:1:2}))
local G=$((16#${cspec:3:2}))
local B=$((16#${cspec:5:2}))
ble/color/convert-rgb24-to-color256 "$R" "$G" "$B"
color256=$ret color24=$cspec
elif [[ $cspec == '#'??? ]]; then
local r=${cspec::1} g=${cspec:1:1} b=${cspec:2:1}
ble/lib/vim-airline/convert-theme/decode-color "#$r$r$g$g$b$b"
elif [[ $cspec && ! ${cspec//[0-9]} || $cspec == -1 ]]; then
color256=$cspec color24=$cspec
elif [[ ${name2color[$cspec]} ]]; then
ble/lib/vim-airline/convert-theme/decode-color "${name2color[$cspec]}"
else
color256=unknown color24=unknown
ble/util/print "$theme: unknown color spec '$cspec'" >&2
fi
}

function face {
local mode=$1 face=$2 fg=${3:-${5:-0}} bg=${4:-${6:-0}}

# check mode
case ${mode%_modified} in
(normal|insert|replace|visual|commandline|inactive) ;;
(accents|tabline|ctrlp|terminal) return ;;
(*_paste|insert_replace|normal_error|insert_error) return ;;
(*) ble/util/print "$theme: Unknown mode '$mode'" >&2
esac

# check face
case $face in
(airline_[abcxyz]|airline_error|airline_term|airline_warning) ;;
(airline_*_to_airline_*) return ;;
(airline_file) return ;; # ?????? itchyny/landscape.vim で使用
(*) ble/util/print "$theme: Unknown face type '$face'" >&2
esac

local face_name=vim_${face}_$mode

local color256 color24
ble/lib/vim-airline/convert-theme/decode-color "$fg"
fg256[$face_name]=$color256
fg24[$face_name]=$color24
ble/lib/vim-airline/convert-theme/decode-color "$bg"
bg256[$face_name]=$color256
bg24[$face_name]=$color24
}

function ble/lib/vim-airline/convert-theme/eq {
local face1=$1 face2=$2
[[ "${fg256[$face1]}" == "${fg256[$face2]}" ]] || return 1
[[ "${bg256[$face1]}" == "${bg256[$face2]}" ]] || return 1
[[ "${fg24[$face1]}" == "${fg24[$face2]}" ]] || return 1
[[ "${bg24[$face1]}" == "${bg24[$face2]}" ]] || return 1
return 0
}

function ble/lib/vim-airline/convert-theme/convert {
local theme=$1

local -A fg256=() bg256=() fg24=() bg24=()

# default faces
local f
f=vim_airline_error_default fg256[$f]=16 bg256[$f]=88 fg24[$f]='#000000' bg24[$f]='#990000'
f=vim_airline_term_default fg256[$f]=158 bg256[$f]=234 fg24[$f]='#9cffd3' bg24[$f]='#202020'
f=vim_airline_warning_default fg256[$f]=16 bg256[$f]=166 fg24[$f]='#000000' bg24[$f]='#df5f00'

source "tmp/airline/$theme.bash"

[[ -d contrib/airline ]] || mkdir -p contrib/airline
exec 5> "contrib/airline/$theme.bash"
{
if [[ $theme == dark ]]; then
ble/util/print "# From github:vim-airline/vim-airline/autoload/airline/themes/dark.vim"
ble/util/print "# The MIT License (MIT)"
ble/util/print "# Copyright (c) 2013-2021 Bailey Ling et al."
ble/util/print "#"
elif [[ $theme == landscape ]]; then
ble/util/print "# From github:itchyny/landscape.vim/autoload/airline/themes/$theme.vim"
ble/util/print "# The MIT License (MIT)"
ble/util/print "# Copyright (c) 2012-2015 itchyny."
ble/util/print "#"
else
ble/util/print "# From github:vim-airline/vim-airline-themes/autoload/airline/themes/$theme.vim"
ble/util/print "# The MIT License (MIT)"
ble/util/print "# Copyright (C) 2013-$year Bailey Ling & Contributors."
ble/util/print "#"
ble/bin/sed '/^"/!Q;s//#/' ~/.vim/plugged/vim-airline-themes/autoload/airline/themes/"$theme".vim
fi
ble/util/print
ble/util/print 'ble-import lib/vim-airline'
ble/util/print
ble/util/print "function ble/lib/vim-airline/theme:$theme/initialize {"
ble/util/print ' ble-face -r vim_airline_@'
} >&5

local face
for face in "${!fg256[@]}"; do
local face2=$face
case $face in
(*_modified) ble/lib/vim-airline/convert-theme/eq "$face" "${face%_modified}" && continue ;;
(vim_airline_x_*) ble/lib/vim-airline/convert-theme/eq "$face" "${face/x/c}" && continue ;;
(vim_airline_y_*) ble/lib/vim-airline/convert-theme/eq "$face" "${face/y/b}" && continue ;;
(vim_airline_z_*) ble/lib/vim-airline/convert-theme/eq "$face" "${face/z/a}" && continue ;;
(*_replace) ble/lib/vim-airline/convert-theme/eq "$face" "${face%_*}_insert" && continue ;;
(*_normal)
face2=${face%_normal}
ble/lib/vim-airline/convert-theme/eq "$face" "${face%_*}_default" && continue ;;
(*_*) ble/lib/vim-airline/convert-theme/eq "$face" "${face%_*}_normal" && continue ;;
(*) continue ;;
esac

printf ' ble-face -s %-40s %-13s # fg=%s,bg=%s\n' \
"$face2" "fg=${fg256[$face]},bg=${bg256[$face]}" "${fg24[$face]}" "${bg24[$face]}"
done | ble/bin/sort >&5
ble/util/print '}' >&5
exec 5>&-
}

function ble/lib/vim-airline/convert-theme/convert-all {
local file theme
for file in tmp/airline/*.bash; do
theme=${file##*/}
theme=${theme%.bash}
#ble/util/print "Converting $theme..."
ble/lib/vim-airline/convert-theme/convert "$theme"
done
}
#ble/lib/vim-airline/convert-theme/convert-all
ble/lib/vim-airline/convert-theme/convert dark
30 changes: 30 additions & 0 deletions memo/D1589-DumpAirlineThemes.vim
@@ -0,0 +1,30 @@
" -*- mode: vimrc -*-

function DumpAirlineTheme(name)
execute "AirlineTheme " . a:name
execute "let palette = g:airline#themes#" . a:name . "#palette"
let lines = []
for mode in keys(palette)
for face in keys(palette[mode])
let fg = palette[mode][face][0]
let bg = palette[mode][face][1]
let cfg = palette[mode][face][2]
let cbg = palette[mode][face][3]
" let style = palette[mode][face][4]
call add(lines, 'face ' . mode . " " . face . " '" . fg . "' '" . bg . "' '" . cfg . "' '" . cbg . "'")
endfor
endfor
call writefile(lines, "tmp/airline/" . a:name . ".bash")
endfunction

function DumpAirlineThemeAll()
" vim-airline/vim-airline-themes
let filelist = glob("~/.vim/plugged/vim-airline-themes/autoload/airline/themes/*.vim")
for name in split(filelist, "\n")
let name = fnamemodify(name, ":t:r")
call DumpAirlineTheme(name)
endfor

" itchyny/landscape.vim
call DumpAirlineTheme("landscape")
endfunction
87 changes: 68 additions & 19 deletions note.txt
Expand Up @@ -1482,25 +1482,7 @@ bash_tips

2021-05-24

* airline: 説明書を書く。theme の枠組みを整える
https://github.com/akinomyoga/ble.sh/issues/114 (2)

* themes の枠組みを整えたい気がする。現状だとユーザーがそれぞれ対応しなけれ
ばならない。面倒である。うーん。取り敢えず contrib に適当に加えてみるとい
うのも良い気がする。

* 説明に関しては theme を用意してそれを見てもらえれば十分の気がする。但し、
辞書に関しては theme は bash-4.1 以下でも動く様に gdict を使わなければな
らずややこしい。

* 何れにしても huresche に対する返答で説明するので、その内容を後で Wiki に
転記すれば良い。

* _modified には対応していない。履歴項目については現在の内容とずれている時
に modified にできる。最新項目については何か文字列があれば modified にで
きる。

* themes は自動的に変換する様にできたら良いが調べてみると面倒な気がする。
* airline: 使い方を説明に書く

* prompt: 最適化 git の現在の dirty 状態は background で取得できる様にしたい。

Expand Down Expand Up @@ -4704,6 +4686,73 @@ bash_tips
Done (実装ログ)
-------------------------------------------------------------------------------

2021-06-07

* 2021-05-24 airline: 説明書を書く。theme の枠組みを整える [#D1589]
https://github.com/akinomyoga/ble.sh/issues/114 (2)

* done: themes の枠組みを整えたい気がする。現状だとユーザーがそれぞれ対応し
なければならない。面倒である。うーん。取り敢えず contrib に適当に加えてみ
るというのも良い気がする。

* done: _modified には対応していない。

履歴項目については現在の内容とずれている時に modified にできる。最新項目
については何か文字列があれば modified にできる→これは対応した。

* done: themes は自動的に変換する様にできたら良いが調べてみると面倒な気がする。

自動変換は vim スクリプトを書いて行った。取り敢えず themes は現状で良い気
がする。mode_map も抜き出そうと思ったが実は atomic.vim しか設定している物
はなかった。

contrib に一括で追加しようと思ったが止めて置く事にした。もっと普通のファ
イルが増えてからにするのが良い気がする。或いは要求したら自動的に何処から
かダウンロードするというのも手なのかもしれない。

* reject: テーマ用の bleopt を用意する

bleopt vim_airline_theme=xxxx

を設定したら自動で ble-import contrib/airline/xxxx を読み込む様にしたい。
或いはよく考えたら直接 ble-import contrib/airline/xxxx と書けば良いだけな
のではないか。

* 説明に関しては theme を用意してそれを見てもらえれば十分の気がする。但し、
辞書に関しては theme は bash-4.1 以下でも動く様に gdict を使わなければな
らずややこしい。

何れにしても huresche に対する返答で説明するので、その内容を後で Wiki に
転記すれば良い。

* done: というか、考えてみたら ble-import する時に毎回 contrib まで指定する
必要があるのは変な気がする。source path を指定したら其処から自由に source
してもらうべきなのではないのか。

ble-import vim-airline
ble-import core-syntax
ble-import keymap-vi
ble-import prompt-git
ble-import fzf-bingings
ble-import fzf-completion
ble-import airline/landscape

別にこれで良い気がする。寧ろこちらの方が良い。

local user=${XDG_DATA_HOME:-$HOME/.local/share/blesh}
BLE_IMPORT_PATH=$user:$user/lib:$_ble_base:$_ble_base/contrib:$_ble_base/lib

x emacs mode にいる時に vim-airline を呼び出すと真っ黒になって何も表示され
ない。と思ったらこれは inactive face が使われていて、この inactive の設定
が物凄く見にくいという事だった。微妙に色が見える。じれが dark.vim の設定
という事なのでそのままにする事にする。

x 2021-06-10 ble-import の search path として ~/.local/share/blesh を追加し
たが、これだと異なる version の設定ファイルが混在する原因である。そうする
と不整合を生んで変な事になる。特に keymap/vi や keymap/emacs は致命的な問
題を引き起こし得る。という事を考えると、 ~/local/share/blesh は直接は追加
せずに ~/.local/share/blesh/local 等から読み取る様にするべきである。

2021-06-05

* locale によっては正規表現の [a-z] でも駄目 (reported by huresche) [#D1588]
Expand Down

0 comments on commit 73b037f

Please sign in to comment.