我设置了Base16颜色主题,包括Base16-shell和Base16-vim,(我的终端(iTerm2)和Neovim。所以我可以从命令行更改主题我创建了一个bash函数,让我说color <theme>
并执行该主题的base16-shell脚本,并更改了终端颜色。这个bash函数还更新了一个文件.nvim_background
,这个文件来自我的Neovim配置,~/.config/nvim/init.vim
。我希望在颜色变化后该会话获得焦点时,任何开放的Neovim会话中的颜色都会发生变化。
以下是.nvim_background
文件:
if !exists('g:colors_name') || g:colors_name != 'base16-chalk'
colorscheme base16-chalk
endif
用.nvim_template
来修改它:
if !exists('g:colors_name') || g:colors_name != 'placeholder'
colorscheme placeholder
endif
这是我的Neovim init.vim
文件中的函数和augroup:
" Base16 setup
function s:CheckColorScheme()
colorscheme base16-default-dark
if filereadable("~/.config/nvim/.nvim_background")
let base16colorspace=256
source ~/.config/nvim/.nvim_background
endif
endfunction
" if v:progname !=# 'vi'
if has('autocmd')
augroup MyAutocolor
autocmd!
autocmd FocusGained * call s:CheckColorScheme()
augroup END
endif
" call s:CheckColorScheme()
" endif
bash函数会导致终端中的颜色更改立即发生,我可以看到.nvim_background
文件正在使用新主题名称进行更新。但当我将焦点移回Neovim时,颜色不会改变。我可以做:color base16-<theme>
并更改Neovim中的颜色,所以我知道base16主题插件已正确安装。
如何设置augroup
以便在发生FocusGained
事件时触发它?或者更好的问题是,我如何设置s:CheckColorScheme
函数,以便在Neovim重新获得焦点时调用它?
为了完整起见,这里是操作颜色的bash函数:
# Base16 helpers {{{
#
# set -x
BASE16_DIR=~/.config/base16-shell/scripts
BASE16_CONFIG=~/.config/.base16
BASE16_NVIM_TEMPLATE=~/.config/nvim/.nvim_template
BASE16_NVIM=~/.config/nvim/.nvim_background
BASE16_DEFAULT="base16-material-darker.sh"
color() {
SCHEME="$1"
if [ $# -eq 0 -a -s "$BASE16_CONFIG" ]; then
cat ~/.config/.base16
return
fi
if [[ "$SCHEME" = 'help' ]]; then
ACTION='help'
elif [[ "$SCHEME" = 'default' ]]; then
ACTION='default'
else
ACTION='set'
fi
case "$ACTION" in
set)
if [[ "$SCHEME" = 'default' ]]; then
FILE="$BASE16_DIR/base16-material-darker.sh"
NVIM='base16-material-darker'
else
FILE="$BASE16_DIR/base16-$SCHEME.sh"
NVIM="base16-$SCHEME"
fi
if [[ -x "$FILE" ]]; then
echo "$SCHEME" >| "$BASE16_CONFIG"
"$FILE"
sed "s/placeholder/$NVIM/g" "$BASE16_NVIM_TEMPLATE" >| "$BASE16_NVIM"
else
echo "Scheme '$SCHEME' not found in $BASE16_DIR"
return 1
fi
;;
default)
FILE="$BASE16_DIR/$BASE16_DEFAULT"
if [[ -x "$FILE" ]]; then
echo "$BASE16_DEFAULT" >! "$BASE16_CONFIG"
"$FILE"
fi
;;
help)
echo 'color set [ocean|grayscale|material-darker|default|...]'
echo
echo 'Available schemes:'
find ~/.config/base16-shell -name 'base16-*.sh' | \
sed -E 's|.+/base16-||' | \
sort | \
column
;;
*)
echo 'Unknown subcommand: use one of {default,set,help}'
;;
esac
}
# }}}