mirror of
https://github.com/Ascyii/telekasten.nvim.git
synced 2026-01-01 14:14:24 -05:00
@@ -319,6 +319,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
|
||||
```
|
||||
@@ -358,6 +360,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 | |
|
||||
@@ -483,6 +486,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 update the links pointing to it
|
||||
|
||||
The Telekasten command supports sub-command completion, in my case by pressing <kbd>TAB</kbd>.
|
||||
|
||||
@@ -578,6 +582,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.
|
||||
|
||||
@@ -829,6 +834,7 @@ nnoremap <leader>zp :lua require('telekasten').preview_img()<CR>
|
||||
nnoremap <leader>zm :lua require('telekasten').browse_media()<CR>
|
||||
nnoremap <leader>za :lua require('telekasten').show_tags()<CR>
|
||||
nnoremap <leader># :lua require('telekasten').show_tags()<CR>
|
||||
nnoremap <leader>zr :lua require('telekasten').rename_note()<CR>
|
||||
|
||||
" on hesitation, bring up the panel
|
||||
nnoremap <leader>z :lua require('telekasten').panel()<CR>
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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)
|
||||
@@ -203,6 +206,68 @@ local function escape(s)
|
||||
return string.gsub(s, "[%%%]%^%-$().[*+?]", "%%%1")
|
||||
end
|
||||
|
||||
-- sanitize strings
|
||||
local escape_chars = function(string)
|
||||
return string.gsub(string, "[%(|%)|\\|%[|%]|%-|%{%}|%?|%+|%*|%^|%$|%/]", {
|
||||
["\\"] = "\\\\",
|
||||
["-"] = "\\-",
|
||||
["("] = "\\(",
|
||||
[")"] = "\\)",
|
||||
["["] = "\\[",
|
||||
["]"] = "\\]",
|
||||
["{"] = "\\{",
|
||||
["}"] = "\\}",
|
||||
["?"] = "\\?",
|
||||
["+"] = "\\+",
|
||||
["*"] = "\\*",
|
||||
["^"] = "\\^",
|
||||
["$"] = "\\$",
|
||||
})
|
||||
end
|
||||
|
||||
local function recursive_substitution(dir, old, new)
|
||||
if not global_dir_check() then
|
||||
return
|
||||
end
|
||||
|
||||
if vim.fn.executable("sed") == 0 then
|
||||
vim.api.nvim_err_write("Sed not installed!\n")
|
||||
return
|
||||
end
|
||||
|
||||
old = escape_chars(old)
|
||||
new = escape_chars(new)
|
||||
|
||||
local sedcommand = "sed -i"
|
||||
if vim.fn.has("mac") == 1 then
|
||||
sedcommand = "sed -i ''"
|
||||
end
|
||||
|
||||
local replace_cmd = "rg -l -t markdown '"
|
||||
.. old
|
||||
.. "' "
|
||||
.. dir
|
||||
.. " | xargs "
|
||||
.. sedcommand
|
||||
.. " 's|"
|
||||
.. old
|
||||
.. "|"
|
||||
.. new
|
||||
.. "|g' >/dev/null 2>&1"
|
||||
os.execute(replace_cmd)
|
||||
end
|
||||
|
||||
local function save_all_tk_buffers()
|
||||
for i = 1, vim.fn.bufnr("$") do
|
||||
if
|
||||
vim.fn.getbufvar(i, "&filetype") == "telekasten"
|
||||
and vim.fn.getbufvar(i, "&mod") == 1
|
||||
then
|
||||
vim.cmd(i .. "bufdo w")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- ----------------------------------------------------------------------------
|
||||
-- image stuff
|
||||
local function imgFromClipboard()
|
||||
@@ -1402,6 +1467,76 @@ local function YankLink()
|
||||
print("yanked " .. title)
|
||||
end
|
||||
|
||||
--
|
||||
-- RenameNote:
|
||||
-- -----------
|
||||
--
|
||||
-- Prompt for new note title, rename the note and update all links.
|
||||
--
|
||||
local function RenameNote()
|
||||
local oldfile = Pinfo:new({ filepath = vim.fn.expand("%:p"), M.Cfg })
|
||||
|
||||
local newname = vim.fn.input("New name: ")
|
||||
newname = newname:gsub("[" .. M.Cfg.extension .. "]+$", "")
|
||||
local newpath = newname:match("(.*/)") or ""
|
||||
newpath = M.Cfg.home .. "/" .. newpath
|
||||
|
||||
-- If no subdir specified, place the new note in the same place as old note
|
||||
if
|
||||
M.Cfg.subdirs_in_links == true
|
||||
and newpath == M.Cfg.home .. "/"
|
||||
and oldfile.sub_dir ~= ""
|
||||
then
|
||||
newname = oldfile.sub_dir .. "/" .. newname
|
||||
end
|
||||
|
||||
local fname = M.Cfg.home .. "/" .. newname .. M.Cfg.extension
|
||||
local fexists = file_exists(fname)
|
||||
if fexists then
|
||||
print_error("File alreay exists. Renaming abandonned")
|
||||
return
|
||||
end
|
||||
|
||||
-- Savas newfile, delete buffer of old one and remove old file
|
||||
if newname ~= "" and newname ~= oldfile.title then
|
||||
if not (check_dir_and_ask(newpath, "Renamed file")) then
|
||||
return
|
||||
end
|
||||
|
||||
vim.cmd("saveas " .. M.Cfg.home .. "/" .. newname .. M.Cfg.extension)
|
||||
vim.cmd("bdelete " .. oldfile.title .. M.Cfg.extension)
|
||||
os.execute(
|
||||
"rm " .. M.Cfg.home .. "/" .. oldfile.title .. M.Cfg.extension
|
||||
)
|
||||
end
|
||||
|
||||
if M.Cfg.rename_update_links == true then
|
||||
-- Only look for the first part of the link, so we do not touch to #heading or #^paragraph
|
||||
-- Should use regex instead to ensure it is a proper link
|
||||
local oldlink = "[[" .. oldfile.title
|
||||
local newlink = "[[" .. newname
|
||||
|
||||
-- Save open telekasten buffers before looking for links to replace
|
||||
if
|
||||
#(vim.fn.getbufinfo({ bufmodified = 1 })) > 1
|
||||
and M.Cfg.auto_set_filetype == true
|
||||
then
|
||||
local answer = vim.fn.input(
|
||||
"Telekasten.nvim:"
|
||||
.. "Save all telekasten buffers before updating links? [Y/n]"
|
||||
)
|
||||
answer = vim.fn.trim(answer)
|
||||
if answer ~= "n" and answer ~= "N" then
|
||||
save_all_tk_buffers()
|
||||
end
|
||||
end
|
||||
|
||||
recursive_substitution(M.Cfg.home, oldlink, newlink)
|
||||
recursive_substitution(M.Cfg.dailies, oldlink, newlink)
|
||||
recursive_substitution(M.Cfg.weeklies, oldlink, newlink)
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
-- GotoDate:
|
||||
-- ----------
|
||||
@@ -2575,6 +2710,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
|
||||
@@ -2603,6 +2739,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",
|
||||
|
||||
Reference in New Issue
Block a user