vim - init.lua 中的 Autocmd InsertEnter 来高亮光标不起作用

标签 vim lua neovim autocmd

我正在从经过充分测试并使用多年的 init.vim 迁移到新的 init.lua。最后两行没有显示错误,但不起作用。这个想法是在进入插入模式时显示下划线,并在正常模式时将其删除。

init.lua

vim.cmd('highlight Cursorline cterm=NONE gui=NONE guibg=NONE')
vim.cmd('autocmd InsertEnter * highlight Cursorline cterm=underline gui=underline') -- Does not work
vim.cmd('autocmd InsertLeave * highlight Cursorline cterm=NONE gui=NONE')           -- Does not work

完整init.lua

-- General setting
vim.api.nvim_set_option('mouse', 'a')
vim.api.nvim_set_option('laststatus', 2)
vim.api.nvim_set_option('title', true)
vim.api.nvim_set_option('cursorline', true)
vim.api.nvim_set_option('clipboard', 'unnamedplus') -- Register * as clipboard
vim.api.nvim_set_option('ignorecase', true)         -- Search ignore case
vim.api.nvim_set_option('splitright', true)
vim.api.nvim_set_option('splitbelow', true)

-- Search
vim.api.nvim_set_option('hlsearch', true)           -- Highlight search
vim.api.nvim_set_option('incsearch', true)          -- set incremental search

-- UTF-8
vim.api.nvim_set_option('encoding', 'utf-8')
vim.api.nvim_set_option('fileencoding', 'utf-8')
--vim.api.nvim_set_option('termencoding', 'utf-8')

-- Tabs
vim.api.nvim_set_option('expandtab', false)
vim.api.nvim_set_option('tabstop', 4)
vim.api.nvim_set_option('shiftwidth', 4)
vim.api.nvim_set_option('textwidth', 100)
--vim.api.nvim_set_option('', )

-- Colors
vim.api.nvim_set_option('termguicolors', true)
vim.api.nvim_set_option('syntax', 'on')
vim.api.nvim_command('colorscheme oceanicnext')

-- SHORTCUTS --------------------------------------------------
-- General shortcuts
vim.api.nvim_set_keymap('n', 'cc', ':!make', {})
vim.api.nvim_set_keymap('n', '<S-s><S-s>', ':w<cr>', {})
vim.api.nvim_set_keymap('n', 'ls', ':buffers<cr>', {})
vim.api.nvim_set_keymap('n', 'gb', ':w<cr>:buffers<cr>:b<space>', {})
vim.api.nvim_set_keymap('n', '<space>', '/', {})

-- LaTeX shortcuts
vim.api.nvim_command('augroup filetype_tex')
    -- Begin End block
    vim.api.nvim_command('autocmd filetype tex inoremap <C-B> <ESC>YpkI\\begin{<ESC>A}<ESC>jI\\end{<ESC>A}<esc>kA')

    -- Greek letters
    vim.api.nvim_set_keymap('i','<C-g>a','\\alpha',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-g>b','\\beta',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-g>e','\\epsilon',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-g>g','\\gamma',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-g>l','\\lambda',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-g>m','\\mu',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-g>o','\\omega',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-g>s','\\sigma',{noremap=true})

    -- Pretty letter for sets
    vim.api.nvim_set_keymap('i','<C-b>c','\\mathbb{C}',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-b>k','\\mathbb{K}',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-b>n','\\mathbb{N}',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-b>r','\\mathbb{R}',{noremap=true})

    -- Vectors
    vim.api.nvim_set_keymap('i','<C-e>0','\\vec{0}',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-e>e','\\vec{e}',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-e>u','\\vec{u}',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-e>v','\\vec{v}',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-e>w','\\vec{w}',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-e>x','\\vec{x}',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-e>y','\\vec{y}',{noremap=true})
    vim.api.nvim_set_keymap('i','<C-e>z','\\vec{z}',{noremap=true})
vim.api.nvim_command('augroup end')


-- Relative line numbers
vim.api.nvim_set_option('number', true)
vim.api.nvim_set_option('relativenumber', true)
vim.cmd('augroup numbertoggle')
vim.cmd('autocmd!')
vim.cmd('autocmd BufEnter,FocusGained,InsertLeave * :set relativenumber')
vim.cmd('autocmd BufLeave,FocusLost,InsertEnter   * :set norelativenumber')
vim.cmd('autocmd BufLeave,FocusLost,InsertEnter   * :set number')
vim.cmd('augroup end')

-- Change aspect if in insert mode or not
vim.cmd('highlight Cursorline cterm=NONE gui=NONE guibg=NONE')
vim.cmd('autocmd InsertEnter * highlight Cursorline cterm=underline gui=underline')
vim.cmd('autocmd InsertLeave * highlight Cursorline cterm=NONE gui=NONE')

最佳答案

有一个错误,但不是 autocmd。如果在 Vim 中 :setcursorline 你可以判断你的突出显示是否有效。

此时您可能会感到困惑,因为您已经拥有:

vim.api.nvim_set_option('cursorline', true)

在你的 init.nvim 中。应该可以,对吧?

好吧,事实证明并非如此。看看这个:

:echo &cursorline
:lua vim.api.nvim_set_option('cursorline', true)
:echo &cursorline

在 nvim 0.5.0-beta 中(几周前构建,nvim 没有明确说明具体时间),其输出是两个零 - 而不是 0 和 1。如,nvim_set_option('cursorline ', true) 没有效果。真正的苏。

让我们看看:h 'cursorline'一分钟:

                        'cursorline' 'cul' 'nocursorline' 'nocul'
'cursorline' 'cul'      boolean (default off)
                        local to window
                        {not available when compiled without the +syntax
                        feature}
        Highlight the text line of the cursor with CursorLine hl-CursorLine.
        Useful to easily spot the cursor.  Will make screen redrawing slower.
        When Visual mode is active the highlighting isn't used to make it
        easier to see the selected text.

仔细查看本地到窗口 - 这就是您的代码不起作用的原因。我不会假装理解为什么(因为我不怎么使用 nvim,而且我个人发现 lua api 很困惑),但是 nvim_set_options 不适用于窗口变量。有趣的是,如果您尝试将 int 而不是 bool 传递给 Cursorline,该方法将抛出错误,但仍然无法按照您的预期进行设置。我将在帖子的末尾回到这一点。

让我们看另一个带有任意变量的例子; '文件夹标记'

:echo &foldmarker
> {{{,}}}
:lua vim.api.nvim_set_option('foldmarker', 'literally,anythingelse')
> (completes, no error)
:echo &foldmarker
> {{{,}}}
:lua vim.api.nvim_win_set_option(0, 'foldmarker', 'literally,anythingelse')
> (completes, no error)
:echo &foldmarker
> literally,anythingelse

作为读者的练习,第一步也可以使用 'paste' 来完成。 'paste' 是一个全局变量,因此,nvim_win_set_option(0, 'paste', true) 可能会抛出

有趣的是,这仅适用于普通的 :set:

:set foldmarker&
:echo &foldmarker
> {{{,}}}
:set foldmarker=literally,anythingelse
:echo &foldmarker
> literally,anythingelse

这意味着,修复代码所需要做的就是:

vim.api.nvim_win_set_option(0, 'cursorline', true)

或者:

vim.api.nvim_command('set cursorline')

TL;DR:之所以有效,是因为您现在实际上正在设置光标线。无法使用 vim.api.nvim_set_option(name, value) 设置窗口选项(我不知道为什么)。您的自动命令很好,但它们不起作用,因为 cursorline 已关闭。这也与亮点本身无关;清除突出显示只是隐藏光标线,并且不会禁用光标线选项。这也意味着您的自动命令和突出显示在这种情况下没有问题,但导致此问题的是您对窗口变量使用了错误的 API 函数。

最后一点建议:检查您正在设置的变量的文档。如果它显示窗口,则必须使用 nvim_win_set_option,如果它是缓冲区,则需要 nvim_buf_set_option。 Nanotee 的 nvim lua guide 中也涵盖了这些内容。 - 这也涵盖了额外变量的含义。


我不完全确定这种行为是否构成错误,或者只是不直观的 API 设计,but I found a bug related to 'number'在完成其余答案后研究错误报告时,可能表明这是预期的行为。不过,我不会将其报告为错误,也不会提出问题来询问这是否是有意为之,所以这对我来说只是温和的猜测。然而,手头的证据仍然使它看起来像是有意为之。

这也意味着,如果您使用 *_set_option() API,您必须确保您知道正在设置的变量类型。如果它确实是为了让 nvim_set_option() 默默地使窗口选项失败,那么您必须手动检查以确保您在正确的变量上使用了正确的函数,因为 API 函数不是“当你做错事时不会告诉你。或者只使用 vim.api.nvim_command() - Vim 的 :set 确实可以正确设置窗口变量。

关于vim - init.lua 中的 Autocmd InsertEnter 来高亮光标不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66943771/

相关文章:

windows - 此版本...与您正在运行的 Windows 版本不兼容

vim - 在 vim 中使用 'f' 命令搜索的不仅仅是当前行

linux - 在 Ubuntu 下使用 snap 时如何将 nvim 添加到 update-alternatives

performance - Vim 在处理 LaTeX 文件时运行缓慢

algorithm - 节省内存的归并排序

string - 首字母大写Lua

c - 如果lua被信号打断怎么办?

python - (Neo)vim python 支持和 active virtualenv 冲突

vim - 在VIM中,为什么光标随着4yk而不是4yj移动?

vimdiff:左右 Pane 的不同颜色