1

我已经为我的终端 (iTerm2) 和 Neovim 设置了Base16颜色主题,包括Base16-shellBase16-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

}

# }}}
4

0 回答 0