[[🦉Shukuchi]]のように、カーソル配下にリンクがなくても瞬間移動してリンク先に遷移するコマンドをつくる。ただし、方向は`forward`に限る (後ろには移動できない)。
```lua
local forward_seek_gf = function()
local line = vim.api.nvim_get_current_line()
local row = vim.fn.line(".")
local col = vim.fn.col(".")
local get_cursor = function(pattern)
local cur = 1
while true do
local st, ed = string.find(line, pattern, cur)
vim.notify(tostring(st))
vim.notify(tostring(ed))
vim.notify(tostring(col))
if not st then
return nil
end
if col < st then
return st - 1
end
if col <= ed then
return col - 1
end
cur = ed + 1
end
end
local wiki_link_cursor = get_cursor("%[%[.-%]%]")
local url_cursor = get_cursor("https?://[%w-_%.%?%.:/%+=&%%]+")
if wiki_link_cursor == nil and url_cursor == nil then
return
end
if wiki_link_cursor ~= nil and url_cursor == nil then
vim.api.nvim_win_set_cursor(vim.api.nvim_get_current_win(), { row, wiki_link_cursor })
end
if wiki_link_cursor == nil and url_cursor ~= nil then
vim.api.nvim_win_set_cursor(vim.api.nvim_get_current_win(), { row, url_cursor })
end
if wiki_link_cursor ~= nil and url_cursor ~= nil then
vim.api.nvim_win_set_cursor(vim.api.nvim_get_current_win(), { row, math.min(wiki_link_cursor, url_cursor) })
end
if require("obsidian").util.cursor_on_markdown_link(nil, nil, true) then
vim.cmd([[ :ObsidianFollowLink ]])
else
vim.cmd([[ gf ]])
end
end
```
この関数を`mappings`で設定する。
```lua
require("obsidian").setup({
mappings = {
["<C-]>"] = {
action = forward_seek_gf,
opts = { noremap = false, expr = false, buffer = true },
},
},
})
```
個人的には[[ウィンドウ (Vim)|ウィンドウ]]を分割して開くようにもしたいので、以下のようなkeymapも割り当てている。
```lua
vim.keymap.set("n", "<M-]>", function()
vim.cmd([[ vsplit ]])
forward_seek_gf()
end, { silent = true })
vim.keymap.set("n", "g<C-]>", function()
vim.cmd([[ split ]])
forward_seek_gf()
end, { silent = true })
```