From a11dfbc5865957b3e3047ffd0e750a28b1dc5ce0 Mon Sep 17 00:00:00 2001 From: lambtho12 Date: Tue, 18 Jan 2022 10:25:54 +0100 Subject: [PATCH] add: basic note renaming --- README.md | 6 ++++++ doc/telekasten.txt | 6 ++++++ lua/telekasten.lua | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) 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",