Neovim:创建一个函数来检查行的开头并根据它进行操作

问题描述 投票:0回答:1

额外细节, 完整代码:

local obsidianSettingsGroup = vim.api.nvim_create_augroup('Obsidian Group', { clear = true })
vim.api.nvim_create_autocmd('FileType', {
  pattern = {'markdown'}, 
  callback = function()

    function entitle()
      local current_line = vim.api.nvim_get_current_line()
      if current_line[0] == '#' then 
        return "I#<Esc>A<Esc>"
      else 
        return "I# <Esc>A<Esc>"
      end 
    end

    local keymap = vim.api.nvim_buf_set_keymap
    local opts = {noremap = true, silent}
    keymap(0, 'n', '<C-S-p>', ':ObsidianWorkspace<CR>',   opts)
    keymap(0, 'n', '<C-p>',   ':ObsidianQuickSwitch<CR>', opts)
    keymap(0, 'n', '=',       entitle(),                  opts)
  end,
  group = obsidianSettingsGroup,
})

所以目标是,检查行是否以

#
开头,如果是,则添加
#
,如果不是,则添加
#
,并在其后添加空格。

代码中的所有内容都有效,除了条件之外,条件总是返回 false。请注意,它仍然在运行,它只是给了我错误的东西。

我在互联网上检查了各种东西,但没有找到类似的东西,或者更确切地说,每个进行匹配和替换的人都使用非常相似的代码,但从未在条件中使用,不知道我做错了什么。

lua neovim
1个回答
0
投票

我对 Lua 或 NeoVim 完全一无所知。然而,完成您想要做的事情的简单 Vim 方法是以下行:

:s/^\s*\zs\ze\(.\)/\=submatch(1)=='#'?'#':'# '

这使用

:substitute
命令从行首
^
开始匹配任意数量的空格
\s*
。现在,
\zs
开始匹配,
\ze
立即结束比赛(我们将其用作穷人的环视),
\(.\)
匹配任何字符并将其放入捕获组中。用简单的英语来说:我们匹配一行中第一个非空白字符的前面并捕获该字符。
请参阅
:help :substitute
:help pattern
:help /\zs

为了获得条件,我们使用

\=
将替换作为表达式进行计算。我们的表达式是一个三元条件。如果捕获的字符
submatch(1)
是“#”,则在其前面再加一个“#”,否则加“#”。
参考文献:
:help sub-replace-expression
:help submatch()
:help ternary

© www.soinside.com 2019 - 2024. All rights reserved.