(Neo)vim FocusGained没有按预期工作

时间:2018-03-29 12:25:14

标签: function vim neovim autocmd

我设置了Base16颜色主题,包括Base16-shellBase16-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

}

# }}}

0 个答案:

没有答案