aboutsummaryrefslogtreecommitdiff
path: root/lua/muwiki/links/creation.lua
diff options
context:
space:
mode:
authormoxie <moxie@3kgcat.fi>2026-03-13 09:58:53 +0200
committermoxie <moxie@3kgcat.fi>2026-03-13 09:58:53 +0200
commitbc2944651f4dabc68d7f34c796400d80ba132016 (patch)
tree3655716442a24ccb758983f0ddc89222916f64c1 /lua/muwiki/links/creation.lua
chore: init
Diffstat (limited to 'lua/muwiki/links/creation.lua')
-rw-r--r--lua/muwiki/links/creation.lua65
1 files changed, 65 insertions, 0 deletions
diff --git a/lua/muwiki/links/creation.lua b/lua/muwiki/links/creation.lua
new file mode 100644
index 0000000..0b31b10
--- /dev/null
+++ b/lua/muwiki/links/creation.lua
@@ -0,0 +1,65 @@
+local M = {}
+
+function M.create_link()
+ local files = require('muwiki.files')
+ local config = require('muwiki.config')
+
+ local mode = vim.fn.mode()
+ if mode ~= 'v' and mode ~= 'V' then
+ vim.notify('Must be in visual mode to create a link', vim.log.levels.WARN)
+ return
+ end
+
+ local start_pos = vim.fn.getpos('v')
+ local end_pos = vim.fn.getpos('.')
+ local region = vim.fn.getregion(start_pos, end_pos, { type = mode })
+
+ if not region or #region == 0 then
+ vim.notify('No text selected', vim.log.levels.WARN)
+ return
+ end
+
+ if #region > 1 then
+ vim.notify('Multi-line selection not supported', vim.log.levels.WARN)
+ return
+ end
+
+ local selected_text = region[1]
+ local normalized = files.normalize_filename(selected_text)
+ local link_target = normalized .. '.md'
+ local link_text = string.format('[%s](%s)', selected_text, link_target)
+
+ local start_row = start_pos[2]
+ local start_col = start_pos[3]
+ local end_row = end_pos[2]
+ local end_col = end_pos[3]
+
+ if start_row > end_row or (start_row == end_row and start_col > end_col) then
+ start_row, end_row = end_row, start_row
+ start_col, end_col = end_col, start_col
+ end
+
+ start_row = start_row - 1
+ start_col = start_col - 1
+ end_row = end_row - 1
+
+ if mode == 'V' then
+ start_col = 0
+ local line = vim.api.nvim_buf_get_lines(0, end_row, end_row + 1, false)[1]
+ end_col = #line
+ end
+
+ vim.api.nvim_buf_set_text(0, start_row, start_col, end_row, end_col, { link_text })
+ vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes('<Esc>', true, false, true), 'n', false)
+
+ local wiki_root = config.get_wiki_root_for_file(vim.api.nvim_buf_get_name(0))
+ if not wiki_root then
+ vim.notify('Not in a wiki buffer', vim.log.levels.ERROR)
+ return
+ end
+
+ local target_path = files.resolve(link_target, wiki_root)
+ files.open_wiki_file(target_path)
+end
+
+return M