我已经为我的终端 (iTerm2) 和 Neovim 设置了Base16颜色主题,包括Base16-shell和Base16-vim。这样我就可以从命令行更改主题,我创建了一个 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
这是我的 Neoviminit.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
}
# }}}