Neovim函数问题:行首字符判断逻辑失效,功能不符合预期
解决Neovim中Markdown行首添加#的判断失效问题
你的代码有两个核心问题导致功能不符合预期:
- 字符串索引错误:Lua的字符串索引从1开始,
current_line[0]永远取不到有效字符,所以条件判断始终为false,只会执行else分支。 - 映射时机错误:设置映射时直接调用
entitle(),会在打开Markdown文件时就执行一次函数,把返回的字符串固定为映射内容,之后按=键不会重新判断当前行状态。
修正后的代码
local obsidianSettingsGroup = vim.api.nvim_create_augroup('Obsidian Group', { clear = true }) vim.api.nvim_create_autocmd('FileType', { pattern = {'markdown'}, callback = function() local function entitle() local current_line = vim.api.nvim_get_current_line() -- 用sub获取行首第一个字符,修正索引问题 if current_line:sub(1, 1) == '#' then vim.cmd('normal! I#<Esc>A<Esc>') else vim.cmd('normal! I# <Esc>A<Esc>') end end local keymap = vim.api.nvim_buf_set_keymap -- 修正silent参数的赋值,布尔值需要显式设为true local opts = {noremap = true, silent = true} keymap(0, 'n', '<C-S-p>', ':ObsidianWorkspace<CR>', opts) keymap(0, 'n', '<C-p>', ':ObsidianQuickSwitch<CR>', opts) -- 改为每次按键时调用lua函数,动态判断当前行 keymap(0, 'n', '=', ':lua entitle()<CR>', opts) end, group = obsidianSettingsGroup, })
关键修正说明
- 行首判断逻辑:使用
current_line:sub(1, 1)获取行首第一个字符,也可以用current_line:match("^#")来判断行首是否为#,两种方式都能正确触发条件分支。 - 映射触发时机:将映射右侧改为
:lua entitle()<CR>,确保每次按下=键时才执行判断逻辑,而不是在初始化时就固定结果。 - 参数修正:原代码中
opts的silent未赋值,需改为silent = true,避免Neovim报错。
内容的提问来源于stack exchange,提问作者Crimson Crusader
相关产品推荐
相关产品推荐

