我正在从一个经过良好测试并使用多年的init.vim
迁移到一个新的init.lua
。最后两行没有显示错误,但它们不起作用。这个想法是在我输入insert mode
时显示下划线,在normal mode
中删除它。
在init.loa中
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中:set cursorline
,你可以判断出你的亮点确实有效。
在这一点上,你可能会感到困惑,因为你已经有了:
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.
仔细观察local to window
——这就是您的代码无法工作的原因。我不会假装理解为什么(因为我不怎么使用nvim,而且我个人觉得lua-api一团糟(,但nvim_set_options
不适用于窗口变量。有趣的是,如果您尝试将int而不是bool传递给cursorline
,该方法将抛出一个错误,但它仍然无法像您预期的那样设置它。我会在帖子的末尾回到这一点。
让我们看看另一个使用任意变量的例子;'foldmarker'
: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:这之所以有效,是因为您现在实际上正在设置cursorline
。窗口选项不能用vim.api.nvim_set_option(name, value)
设置(我不知道为什么(。你的autocmd很好,但它们不起作用,因为cursorline
关闭了。这也与高光本身无关;清除高亮显示只会隐藏光标线,而不会禁用光标线选项。这也意味着在这种情况下,您的autocmd和highlights都很好,但正是您对窗口变量使用了错误的API函数才导致了这个问题。
最后一点建议是:查看您正在设置的变量的文档。如果它显示window,则必须使用nvim_win_set_option
;如果它是缓冲区,则需要nvim_buf_set_option
。nanotee的nvim lua指南也涵盖了这些内容,其中也涵盖了额外变量的含义。
我不完全确定这种行为是否构成了一个bug,或者它是否只是API设计的非直观性,但我在完成剩余的答案后研究bug报告时发现了一个与'number'
相关的bug,这可能表明这是预期行为。不过,我不会把它作为一个bug来报道,也不会打开一个问题来询问这是否是故意的,所以这对我来说是一个温和的猜测。然而,手头的证据仍然使它看起来像是有意的。
这也意味着,如果您使用*_set_option()
API,您必须确保您知道要设置的变量类型。如果nvim_set_option()
真的打算以静默方式使窗口选项失败,则必须手动检查以确保在正确的变量上使用了正确的函数,因为API函数不会告诉你什么时候做得不对。或者只使用vim.api.nvim_command()
-Vim的:set
可以正确设置窗口变量。
您可以使用:vim.o或vim.opt
-
注意:要复制
:set option_name
,需要使用vim.o.option_name = true
或vim.opt.option_name = true
。例如:vim.opt.number = true