From fc64d0df291e107b4255bff49d6d2437ce96e1f0 Mon Sep 17 00:00:00 2001 From: Rene Schallner <30892199+renerocksai@users.noreply.github.com> Date: Mon, 29 Nov 2021 07:14:40 +0100 Subject: [PATCH 1/5] Update FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 8c06b62..4e69f6c 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,4 @@ # These are supported funding model platforms github: renerocksai +custom: https://buymeacoffee.com/renerocksai From 84ca1ec0c933d2d36b6d136738e74a72a3db5ab3 Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 30 Nov 2021 00:33:58 +0100 Subject: [PATCH 2/5] daily, weekly pickers: don't display path names! --- lua/telekasten.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/telekasten.lua b/lua/telekasten.lua index 687c819..b544d51 100644 --- a/lua/telekasten.lua +++ b/lua/telekasten.lua @@ -238,6 +238,9 @@ local find_files_sorted = function(opts) pickers.new(opts, { finder = finders.new_table({ results = file_list, + entry_maker = function(entry) + return { value = entry, display = path_to_linkname(entry), ordinal = entry, } + end, }), sorter = conf.generic_sorter(opts), previewer = conf.file_previewer(opts), From b492f3179e4adbe4ff1fd268310f6a6fafe4aa40 Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 30 Nov 2021 00:35:23 +0100 Subject: [PATCH 3/5] daily, weekly pickers: don't display file paths --- BACKLOG.md | 1 + README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/BACKLOG.md b/BACKLOG.md index ad031eb..9e7a501 100644 --- a/BACKLOG.md +++ b/BACKLOG.md @@ -3,6 +3,7 @@ - [ ] yt video ## Dones +- [x] dailies and weeklies: don't display whole paths: fix entries: display values - [x] added option parameter `i` to `toggle_todo(opts)` and `insert_link(opts)` to enter insert mode. - [x] find_friends() - [x] show_backlinks() : issue #3 diff --git a/README.md b/README.md index 56e4d79..0428144 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ Other plugins I find useful in my day-to-day zettelkasten work: - [vim-emoji-complete](https://github.com/kyuhi/vim-emoji-complete) - [markdown-preview.nvim](https://github.com/iamcco/markdown-preview.nvim) - [vim-markdown-toc](https://github.com/mzlogin/vim-markdown-toc) +- [telescope-media-files](https://github.com/nvim-telescope/telescope-media-files.nvim) ### 2. Configure telekasten.nvim Somewhere in your vim config, put a snippet like this: From 85beeb00386815ef1d1321e2504083a23160e5ab Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 30 Nov 2021 03:30:48 +0100 Subject: [PATCH 4/5] refactored to single function style, improved `find_files_sorted()` with devicons and shebangs -- find_files_sorted(opts) -- like builtin.find_files, but: -- - uses plenary.scan_dir synchronously instead of external jobs -- - pre-sorts the file list in descending order (nice for dates, most recent first) -- - (also supports devicons) -- - displays subdirs if necessary -- - e.g. when searching for daily notes, no subdirs are displayed -- - but when entering a date in find_notes, the daily/ and weekly/ subdirs are displayed --- lua/telekasten.lua | 143 ++++++++++++++++++++++++++++++++------------- 1 file changed, 103 insertions(+), 40 deletions(-) diff --git a/lua/telekasten.lua b/lua/telekasten.lua index b544d51..c0f29fb 100644 --- a/lua/telekasten.lua +++ b/lua/telekasten.lua @@ -5,6 +5,7 @@ local pickers = require("telescope.pickers") local finders = require("telescope.finders") local conf = require("telescope.config").values local scan = require("plenary.scandir") +local utils = require("telescope.utils") -- declare locals for the nvim api stuff to avoid more lsp warnings local vim = vim @@ -68,7 +69,7 @@ end -- ---------------------------------------------------------------------------- -- image stuff -local imgFromClipboard = function() +local function imgFromClipboard() if vim.fn.executable("xclip") == 0 then vim.api.nvim_err_write("No xclip installed!\n") return @@ -160,7 +161,7 @@ local monthmap = { "December", } -local calenderinfo_today = function() +local function calenderinfo_today() local dinfo = os.date("*t") local opts = {} opts.date = os.date("%Y-%m-%d") @@ -202,7 +203,7 @@ local function linesubst(line, title, calendar_info) return line end -local create_note_from_template = function(title, filepath, templatefn, calendar_info) +local function create_note_from_template(title, filepath, templatefn, calendar_info) -- first, read the template file local lines = {} for line in io.lines(templatefn) do @@ -218,7 +219,7 @@ local create_note_from_template = function(title, filepath, templatefn, calendar ofile:close() end -local path_to_linkname = function(p) +local function path_to_linkname(p) local fn = vim.split(p, "/") fn = fn[#fn] fn = vim.split(fn, M.Cfg.extension) @@ -226,21 +227,82 @@ local path_to_linkname = function(p) return fn end -local order_numeric = function(a, b) +local function order_numeric(a, b) return a > b end -local find_files_sorted = function(opts) +-- local function endswith(s, ending) +-- return ending == "" or s:sub(-#ending) == ending +-- end + +local function file_extension(fname) + return fname:match("^.+(%..+)$") +end + +local function filter_filetypes(flist, ftypes) + local new_fl = {} + ftypes = ftypes or { M.Cfg.extension } + + local ftypeok = {} + for _, ft in pairs(ftypes) do + ftypeok[ft] = true + end + + for _, fn in pairs(flist) do + if ftypeok[file_extension(fn)] then + table.insert(new_fl, fn) + end + end + return new_fl +end + +-- find_files_sorted(opts) +-- like builtin.find_files, but: +-- - uses plenary.scan_dir synchronously instead of external jobs +-- - pre-sorts the file list in descending order (nice for dates, most recent first) +-- - (also supports devicons) +-- - displays subdirs if necessary +-- - e.g. when searching for daily notes, no subdirs are displayed +-- - but when entering a date in find_notes, the daily/ and weekly/ subdirs are displayed +local function find_files_sorted(opts) opts = opts or {} local file_list = scan.scan_dir(opts.cwd, {}) + file_list = filter_filetypes(file_list, M.Cfg.filter_extensions) table.sort(file_list, order_numeric) + + -- display with devicons + local function iconic_display(display_entry) + local display_opts = { + path_display = function(_, e) + return e:gsub(opts.cwd .. "/", "") + end, + } + + local hl_group + local display = utils.transform_path(display_opts, display_entry.value) + + display, hl_group = utils.transform_devicons(display_entry.value, display, false) + + if hl_group then + return display, { { { 1, 3 }, hl_group } } + else + return display + end + end + + local function make_entry(entry) + local iconic_entry = {} + iconic_entry.value = entry + iconic_entry.ordinal = entry + iconic_entry.display = iconic_display + return iconic_entry + end + pickers.new(opts, { finder = finders.new_table({ results = file_list, - entry_maker = function(entry) - return { value = entry, display = path_to_linkname(entry), ordinal = entry, } - end, + entry_maker = make_entry, }), sorter = conf.generic_sorter(opts), previewer = conf.file_previewer(opts), @@ -253,7 +315,7 @@ end -- -- Select from daily notes -- -local FindDailyNotes = function(opts) +local function FindDailyNotes(opts) opts = opts or {} local today = os.date("%Y-%m-%d") @@ -265,7 +327,6 @@ local FindDailyNotes = function(opts) create_note_from_template(today, fname, M.note_type_templates.daily) end - -- builtin.find_files({ find_files_sorted({ prompt_title = "Find daily note", cwd = M.Cfg.dailies, @@ -279,7 +340,7 @@ end -- -- Select from daily notes -- -local FindWeeklyNotes = function(opts) +local function FindWeeklyNotes(opts) opts = opts or {} local title = os.date("%Y-W%V") @@ -292,7 +353,6 @@ local FindWeeklyNotes = function(opts) create_note_from_template(title, fname, M.note_type_templates.weekly) end - -- builtin.find_files({ find_files_sorted({ prompt_title = "Find weekly note", cwd = M.Cfg.weeklies, @@ -306,9 +366,9 @@ end -- -- Select from all notes and put a link in the current buffer -- -local InsertLink = function(opts) +local function InsertLink(opts) opts = opts or {} - builtin.find_files({ + find_files_sorted({ prompt_title = "Insert link to note", cwd = M.Cfg.home, attach_mappings = function(prompt_bufnr, _) @@ -333,7 +393,7 @@ end -- -- find the file linked to by the word under the cursor -- -local FollowLink = function(opts) +local function FollowLink(opts) opts = opts or {} vim.cmd("normal yi]") local title = vim.fn.getreg('"0') @@ -350,7 +410,7 @@ local FollowLink = function(opts) create_note_from_template(title, fname, M.note_type_templates.normal) end - builtin.find_files({ + find_files_sorted({ prompt_title = "Follow link to note...", cwd = M.Cfg.home, default_text = title, @@ -364,7 +424,7 @@ end -- -- Find notes also linking to the link under cursor -- -local FindFriends = function() +local function FindFriends() vim.cmd("normal yi]") local title = vim.fn.getreg('"0') @@ -382,7 +442,7 @@ end -- -- Create and yank a [[link]] from the current note. -- -local YankLink = function() +local function YankLink() local title = "[[" .. path_to_linkname(vim.fn.expand("%")) .. "]]" vim.fn.setreg('"', title) print("yanked " .. title) @@ -394,7 +454,7 @@ end -- -- find today's daily note and create it if necessary. -- -local GotoToday = function(opts) +local function GotoToday(opts) opts = opts or calenderinfo_today() local word = opts.date or os.date("%Y-%m-%d") @@ -406,7 +466,6 @@ local GotoToday = function(opts) create_note_from_template(word, fname, M.note_type_templates.daily, opts) end - -- builtin.find_files({ find_files_sorted({ prompt_title = "Goto day", cwd = M.Cfg.home, @@ -433,8 +492,8 @@ end -- -- Select from notes -- -local FindNotes = function(_) - builtin.find_files({ +local function FindNotes(_) + find_files_sorted({ prompt_title = "Find notes by name", cwd = M.Cfg.home, find_command = M.Cfg.find_command, @@ -447,7 +506,7 @@ end -- -- find the file linked to by the word under the cursor -- -local SearchNotes = function(_) +local function SearchNotes(_) builtin.live_grep({ prompt_title = "Search in notes", cwd = M.Cfg.home, @@ -463,7 +522,7 @@ end -- -- Find all notes linking to this one -- -local ShowBacklinks = function(_) +local function ShowBacklinks(_) local title = path_to_linkname(vim.fn.expand("%")) -- or vim.api.nvim_buf_get_name(0) builtin.live_grep({ @@ -493,7 +552,7 @@ local function on_create(title) create_note_from_template(title, fname, M.note_type_templates.normal) end - builtin.find_files({ + find_files_sorted({ prompt_title = "Created note...", cwd = M.Cfg.home, default_text = title, @@ -501,7 +560,7 @@ local function on_create(title) }) end -local CreateNote = function(_) +local function CreateNote(_) -- vim.ui.input causes ppl problems - see issue #4 -- vim.ui.input({ prompt = "Title: " }, on_create) local title = vim.fn.input("Title: ") @@ -530,14 +589,15 @@ local function on_create_with_template(title) return end - builtin.find_files({ + find_files_sorted({ prompt_title = "Select template...", cwd = M.Cfg.templates, find_command = M.Cfg.find_command, attach_mappings = function(prompt_bufnr, _) actions.select_default:replace(function() actions.close(prompt_bufnr) - local template = M.Cfg.templates .. "/" .. action_state.get_selected_entry().value + -- local template = M.Cfg.templates .. "/" .. action_state.get_selected_entry().value + local template = action_state.get_selected_entry().value create_note_from_template(title, fname, template) -- open the new note vim.cmd("e " .. fname) @@ -547,7 +607,7 @@ local function on_create_with_template(title) }) end -local CreateNoteSelectTemplate = function(_) +local function CreateNoteSelectTemplate(_) -- vim.ui.input causes ppl problems - see issue #4 -- vim.ui.input({ prompt = "Title: " }, on_create_with_template) local title = vim.fn.input("Title: ") @@ -562,7 +622,7 @@ end -- -- find this week's weekly note and create it if necessary. -- -local GotoThisWeek = function(opts) +local function GotoThisWeek(opts) opts = opts or {} local title = os.date("%Y-W%V") @@ -575,7 +635,6 @@ local GotoThisWeek = function(opts) create_note_from_template(title, fname, M.note_type_templates.weekly) end - -- builtin.find_files({ find_files_sorted({ prompt_title = "Goto this week:", cwd = M.Cfg.weeklies, @@ -589,7 +648,7 @@ end -- -------------- -- return if a daily 'note exists' indicator (sign) should be displayed for a particular day -local CalendarSignDay = function(day, month, year) +local function CalendarSignDay(day, month, year) local fn = M.Cfg.dailies .. "/" .. string.format("%04d-%02d-%02d", year, month, day) .. M.Cfg.extension if file_exists(fn) then return 1 @@ -599,7 +658,7 @@ end -- action on enter on a specific day: -- preview in telescope, stay in calendar on cancel, open note in other window on accept -local CalendarAction = function(day, month, year, weekday, _) +local function CalendarAction(day, month, year, weekday, _) local today = string.format("%04d-%02d-%02d", year, month, day) local opts = {} opts.date = today @@ -612,7 +671,7 @@ local CalendarAction = function(day, month, year, weekday, _) GotoToday(opts) end -local ShowCalendar = function(opts) +local function ShowCalendar(opts) local defaults = {} defaults.cmd = "CalendarVR" defaults.vertical_resize = 1 @@ -625,7 +684,7 @@ local ShowCalendar = function(opts) end -- set up calendar integration: forward to our lua functions -local SetupCalendar = function(opts) +local function SetupCalendar(opts) local defaults = M.Cfg.calendar_opts opts = opts or defaults @@ -664,7 +723,7 @@ local SetupCalendar = function(opts) vim.cmd(cmd) end -local ToggleTodo = function(opts) +local function ToggleTodo(opts) -- replace -- by - -- - by - [ ] @@ -699,7 +758,7 @@ end -- -- Overrides config with elements from cfg. See top of file for defaults. -- -local Setup = function(cfg) +local function Setup(cfg) cfg = cfg or {} local debug = cfg.debug for k, v in pairs(cfg) do @@ -740,7 +799,10 @@ local Setup = function(cfg) or "left-fit" SetupCalendar(M.Cfg.calendar_opts) end - -- print(vim.inspect(cfg)) + + -- setup extensions to filter for + M.Cfg.filter_extensions = cfg.filter_extensions or { M.Cfg.extension } + if debug then print("Resulting config:") print("-----------------") @@ -759,7 +821,8 @@ M.new_note = CreateNote M.goto_thisweek = GotoThisWeek M.find_weekly_notes = FindWeeklyNotes M.yank_notelink = YankLink -M.create_note_sel_template = CreateNoteSelectTemplate +M.create_note_sel_template = CreateNoteSelectTemplate -- documented wrongly, let's keep it for the moment +M.new_templated_note = CreateNoteSelectTemplate M.show_calendar = ShowCalendar M.CalendarSignDay = CalendarSignDay M.CalendarAction = CalendarAction From 853412aca653d88b2e3db1a9125be68c5aa42b61 Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 30 Nov 2021 03:36:24 +0100 Subject: [PATCH 5/5] update comments --- lua/telekasten.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/telekasten.lua b/lua/telekasten.lua index c0f29fb..b1d312b 100644 --- a/lua/telekasten.lua +++ b/lua/telekasten.lua @@ -260,6 +260,7 @@ end -- like builtin.find_files, but: -- - uses plenary.scan_dir synchronously instead of external jobs -- - pre-sorts the file list in descending order (nice for dates, most recent first) +-- - filters for allowed file types by extension -- - (also supports devicons) -- - displays subdirs if necessary -- - e.g. when searching for daily notes, no subdirs are displayed