diff --git a/README.md b/README.md
index 3ed95b4..e37e260 100644
--- a/README.md
+++ b/README.md
@@ -304,6 +304,8 @@ require('telekasten').setup({
-- except for notes/with/subdirs/in/title.
new_note_location = "smart",
+ -- should all links be updated when a file is renamed
+ rename_update_links = true,
})
END
```
@@ -338,6 +340,7 @@ END
| | - `#tag` (default) | |
| | - `:tag:` | |
| | - `yaml-bare` | |
+| `rename_update_links` | update links when a file is renamed | true |
| | see [2.1 Tag notation](#24-tag-notation)| |
| `command_palette_theme` | theme (layout) of the command palette| ivy |
| | - `ivy` (default): bottom panel overlay | |
@@ -463,6 +466,7 @@ the list for a more detailed description:
- `insert_img_link` : Browse images / media files and insert a link to the selected one
- `preview_img` : preview image under the cursor
- `browse_media` : Browse images / media files
+- `rename_note` : Rename current note and possibly update the links pointing to it
The Telekasten command supports sub-command completion, in my case by pressing TAB.
@@ -558,6 +562,7 @@ The plugin defines the following functions:
- `setup(opts)`: used for configuring paths, file extension, etc.
- `panel()` : brings up the command palette
- `show_tags()` : brings up the tag list. From there you can select a tag to search for tagged notes - or yank or insert the tag
+- `rename_note()` : rename the current note and update the links pointing to it
To use one of the functions above, just run them with the `:lua ...` command.
@@ -809,6 +814,7 @@ nnoremap zp :lua require('telekasten').preview_img()
nnoremap zm :lua require('telekasten').browse_media()
nnoremap za :lua require('telekasten').show_tags()
nnoremap # :lua require('telekasten').show_tags()
+nnoremap zr :lua require('telekasten').rename_note()
" on hesitation, bring up the panel
nnoremap z :lua require('telekasten').panel()
diff --git a/doc/telekasten.txt b/doc/telekasten.txt
index 65596d2..643cedd 100644
--- a/doc/telekasten.txt
+++ b/doc/telekasten.txt
@@ -312,6 +312,12 @@ telekasten.setup({opts})
Default: `smart`
+ *telekasten.settings.rename_update_links*
+ rename_update_links:~
+ If `true`, telekasten will automatically update the links after a file
+ has been renamed.
+
+ Default: `true`
*telekasten.calendar_opts*
-----------------------------------
Valid keys for {opts.calendar_opts}
diff --git a/lua/telekasten.lua b/lua/telekasten.lua
index ae2563d..bd1da49 100644
--- a/lua/telekasten.lua
+++ b/lua/telekasten.lua
@@ -123,6 +123,9 @@ M.Cfg = {
-- present or else in home
-- except for notes/with/subdirs/in/title.
new_note_location = "smart",
+
+ -- should all links be updated when a file is renamed
+ rename_update_links = true,
}
local function file_exists(fname)
@@ -198,6 +201,20 @@ local function escape(s)
return string.gsub(s, "[%%%]%^%-$().[*+?]", "%%%1")
end
+local function recursive_substitution(dir, old, new)
+ os.execute(
+ "find "
+ .. dir
+ .. " -type f -name '*"
+ .. M.Cfg.extension
+ .. "' -exec sed -i 's|"
+ .. old
+ .. "|"
+ .. new
+ .. "|g' {} +"
+ )
+end
+
-- ----------------------------------------------------------------------------
-- image stuff
local function imgFromClipboard()
@@ -1396,6 +1413,32 @@ local function YankLink()
print("yanked " .. title)
end
+--
+-- RenameNote:
+-- -----------
+--
+-- Prompt for new note title, rename the note and update all links.
+--
+local function RenameNote()
+ local oldname = Pinfo:new({ filepath = vim.fn.expand("%:p"), M.Cfg }).title
+ local newname = vim.fn.input("New name: ")
+ newname = newname:gsub("[" .. M.Cfg.extension .. "]+$", "")
+
+ if newname ~= "" and newname ~= oldname then
+ vim.cmd("saveas " .. newname .. M.Cfg.extension)
+ vim.cmd("bdelete " .. oldname .. M.Cfg.extension)
+ vim.cmd("!rm " .. oldname .. M.Cfg.extension)
+ vim.cmd("redraw!")
+ end
+
+ if M.Cfg.rename_update_links == true then
+ -- Sed magic to rename all links (in a separate function)
+ local oldlink = "\\[\\[" .. oldname .. "\\]\\]"
+ local newlink = "\\[\\[" .. newname .. "\\]\\]"
+ recursive_substitution(M.Cfg.home, oldlink, newlink)
+ end
+end
+
--
-- GotoDate:
-- ----------
@@ -2564,6 +2607,7 @@ M.new_note = CreateNote
M.goto_thisweek = GotoThisWeek
M.find_weekly_notes = FindWeeklyNotes
M.yank_notelink = YankLink
+M.rename_note = RenameNote
M.new_templated_note = CreateNoteSelectTemplate
M.show_calendar = ShowCalendar
M.CalendarSignDay = CalendarSignDay
@@ -2592,6 +2636,7 @@ local TelekastenCmd = {
{ "goto thisweek", "goto_thisweek", M.goto_thisweek },
{ "find weekly notes", "find_weekly_notes", M.find_weekly_notes },
{ "yank link to note", "yank_notelink", M.yank_notelink },
+ { "rename note", "rename_note", M.rename_note },
{
"new templated note",
"new_templated_note",