额外细节, 完整代码:
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 完全一无所知。然而,完成您想要做的事情的简单 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
。