diff --git a/.luacheckrc b/.luacheckrc index b035079..426fb6c 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -14,6 +14,7 @@ ignore = { globals = { "_", + "vim", "TelescopeGlobalState", "_TelescopeConfigurationValues", "_TelescopeConfigurationPickers", diff --git a/BACKLOG.md b/BACKLOG.md index 5b1d2ac..0e641b9 100644 --- a/BACKLOG.md +++ b/BACKLOG.md @@ -1,5 +1,7 @@ # Backlog +- [ ] maybe a virtual line in the 1st line that shows number of backlinks and maybe other interesting stuff + - or put it as an extmark at the end of the first line, meh. - [ ] some support for #tags - [ ] some cool buffer showing backlinks (and stuff?) - maybe another one where we dot-render a graph of linked notes and @@ -11,6 +13,8 @@ - [ ] yt video ## Dones +- [x] syntax for tags, incl. plenary filetype + - for proper display, needed to define 'telekasten' syntax - [x] browse_media() - [x] action mappings for notes: yanking and link inserting - [x] document and suggest colors for Calendar nav buttons, they look weird in gruvbox diff --git a/README.md b/README.md index 1dc4780..e3996cc 100644 --- a/README.md +++ b/README.md @@ -81,10 +81,11 @@ of being able to edit it. * [1. Get Help](#1-get-help) * [2. Use it](#2-use-it) * [2.0 Link notation](#20-link-notation) - * [2.1 Note templates](#21-note-templates) - * [2.1.1 Template files](#211-template-files) - * [2.2 Using the calendar](#22-using-the-calendar) - * [2.3 Using the telescope pickers](#23-using-the-telescope-pickers) + * [2.1 Tag notation](#21-tag-notation) + * [2.2 Note templates](#22-note-templates) + * [2.2.1 Template files](#221-template-files) + * [2.3 Using the calendar](#23-using-the-calendar) + * [2.4 Using the telescope pickers](#24-using-the-telescope-pickers) * [3. Bind it](#3-bind-it) * [4. The hardcoded stuff](#4-the-hardcoded-stuff) @@ -254,6 +255,8 @@ END | `calendar_opts` | options for calendar, see below | see below | | `close_after_yanking` | close telescope preview after yanking via ctrly| false | | `insert_after_inserting` | enter insert mode after inserting a link from a telescope picker via ctrli| true | +| `install_syntax` | if `true`, telekasten's syntax for links, tags, etc. will be used for markdown files, also in telescope previewers. Your configured markdown syntax will be inherited, though. | true | + **Please note:** If you do not want to use a template, set its associated option to `nil` or remove it from your config. ```lua @@ -280,13 +283,14 @@ The calendar support has its own options, contained in `calendar_opts`: ### 0.3 Configure your own colors -Telekasten.nvim allows you to color your `[[links]]` by providing two syntax groups: +Telekasten.nvim allows you to color your `[[links]]` and `#tags` by providing the following syntax groups: - `tkLink` : the link title inside the brackets - `tkBrackets` : the brackets surrounding the link title - `tkHighlight` : ==highlighted== text (non-standard markdown) +- `tkTag` : well, tags -The last one, `tkHighlight`, has nothing to do with links but I added it anyway, since I like highlighting text when +`tkHighlight`, has nothing to do with links but I added it anyway, since I like highlighting text when taking notes 😄. I also like the navigation buttons of the calendar to appear less prevalent, so I also redefine the `CalNavi` class. @@ -308,8 +312,15 @@ hi tkHighlight ctermbg=yellow ctermfg=darkred cterm=bold " for calendar, I prefer less prevalent navigation buttons hi link CalNavi CalRuler + +" colors for tags: +hi tkTag ctermfg=175 +" tag separator is only relevant in the following syntax: +" tags: [ tag1, tag2, tag3 ] +hi tkTagSep ctermfg=gray ``` + ## 1. Get Help Telekasten.nvim now comes with its own help file. So you can always: @@ -438,7 +449,40 @@ Regarding linking to paragraphs: The `^blockid` notation is supported by more an Here goes the next paragraph. ``` -### 2.1 Note templates +### 2.1 Tag notation + +Telekasten supports the following tag notations: + +1. `#tag` +2. `:tag:` +3. bare tags in a tag collection in the yaml metadata: + +```yaml +--- +title: My awesome note +date: 2021-12-06 +tags: [ example, note-taking, foo, bar ] +--- +``` + +**Tag syntax**: Spaces are not allowed in tags. So, to differentiate two or more words in a tag, use one of the +following formats: + +- camelCase: `#noteTaking` +- PascalCase: `#NoteTaking` +- snake_case: `#note_taking` +- kebab-case: `#note-taking` + +The only symbols allowed are: + +- `_` : underscore +- `-` : dash +- `/` : forward slash + +Numbers are allowed in tags, as long as a tag is not purely numeric. For example, #1984 is not a valid tag, but `#y1984` +is. + +### 2.2 Note templates The functions `goto_today`, `goto_thisweek`, `find_daily_notes`, `find_weekly_notes`, and `follow_link` can create non-existing notes. This allows you to 'go to today' without having to create today's note beforehand. When you just @@ -459,7 +503,7 @@ The following table shows what action creates what kind of non-existing note: If the associated option is `true`, non-existing notes will be created. -#### 2.1.1 Template files +#### 2.2.1 Template files The options `template_new_note`, `template_new_daily`, and `template_new_weekly` are used to specify the paths to template text files that are used for creating new notes. @@ -516,7 +560,7 @@ date: {{hdate}} ## Sunday link ``` -### 2.2 Using the calendar +### 2.3 Using the calendar When invoking `show_calendar()`, a calendar showing the previous, current, and next month is shown at the right side of vim. @@ -534,7 +578,7 @@ command in vim: ``` -### 2.3 Using the telescope pickers +### 2.4 Using the telescope pickers When you are prompted with a telescope picker to select a note or media file, the following mappings apply: @@ -591,6 +635,12 @@ hi tkHighlight ctermbg=yellow ctermfg=darkred cterm=bold " for calendar, I prefer less prevalent navigation buttons hi link CalNavi CalRuler + +" colors for tags: +hi tkTag ctermfg=175 +" tag separator is only relevant in the following syntax: +" tags: [ tag1, tag2, tag3 ] +hi tkTagSep ctermfg=gray ``` ## 4. The hardcoded stuff diff --git a/data/plenary/filetypes/telekasten.lua b/data/plenary/filetypes/telekasten.lua new file mode 100644 index 0000000..81faeb4 --- /dev/null +++ b/data/plenary/filetypes/telekasten.lua @@ -0,0 +1,5 @@ +return { + extension = { + ['md'] = 'telekasten' + } +} diff --git a/doc/telekasten.txt b/doc/telekasten.txt index 95c6137..15034cf 100644 --- a/doc/telekasten.txt +++ b/doc/telekasten.txt @@ -29,9 +29,10 @@ CONTENTS 2. Colors ........................ |telekasten.colors| 3. Usage ......................... |telekasten.usage| 3.1 Link Notation ............ |telekasten.link_notation| - 3.2 Templates ................ |telekasten.templates| - 3.3 Calendar ................. |telekasten.calendar| - 3.4 Picker mappings .......... |telekasten.picker_mappings| + 3.2 Tag Notation ............. |telekasten.tag_notation| + 3.3 Templates ................ |telekasten.templates| + 3.4 Calendar ................. |telekasten.calendar| + 3.5 Picker mappings .......... |telekasten.picker_mappings| 4. Suggested mappings ............ |telekasten.mappings| 5. Credits ....................... |telekasten.credits| @@ -516,7 +517,39 @@ Note that notes linked to with headings or paragraph IDs **will not be created automatically**. -------------------------------------------------------------------------------- -Section 3.2: Templates *telekasten.templates* +Section 3.2: Tag Notation *telekasten.tag_notation* + +Telekasten supports the following tag notations: + +1. `#tag` +2. `:tag:` +3. bare tags in a tag collection in the yaml metadata: +> + --- title: My awesome note + date: 2021-12-06 + tags: [ example, note-taking, foo, bar ] + --- +< + +Tag syntax:~ + Spaces are not allowed in tags. So, to differentiate two or more words in a + tag, use one of the following formats: + + - camelCase: `#noteTaking` + - PascalCase: `#NoteTaking` + - snake_case: `#note_taking` + - kebab-case: `#note-taking` + + The only symbols allowed are: + - underscore : `_` + - dash : `-` + - forward slash : `/` + + Numbers are allowed in tags, as long as a tag is not purely numeric. For + example, #1984 is not a valid tag, but `#y1984` is. + +-------------------------------------------------------------------------------- +Section 3.3: Templates *telekasten.templates* Telekasten.nvim can create non-existing notes, providing this is enabled in the settings - which it is by default. Auto-creation of notes is useful when @@ -601,7 +634,7 @@ And finally, what a template for weekly notes could look like: < -------------------------------------------------------------------------------- -Section 3.3: Calendar *telekasten.calendar* +Section 3.4: Calendar *telekasten.calendar* When invoking `show_calendar()`, a calendar showing the previous, current, and next month is shown at the right side of vim. @@ -623,7 +656,7 @@ Note:~ installed, which you can find at https://github.com/renerocksai/calendar-vim -------------------------------------------------------------------------------- -Section 3.4: Picker mappings *telekasten.picker_mappings* +Section 3.5: Picker mappings *telekasten.picker_mappings* When you are prompted with a telescope picker to select a note or media file, the following mappings apply: @@ -688,6 +721,12 @@ However, here are some suggestions: " for calendar, I prefer less prevalent navigation buttons hi link CalNavi CalRuler + + " colors for tags: + hi tkTag ctermfg=175 + " tag separator is only relevant in the following syntax: + " tags: [ tag1, tag2, tag3 ] + hi tkTagSep ctermfg=gray < ================================================================================ diff --git a/lua/telekasten.lua b/lua/telekasten.lua index 88174e3..df569e4 100644 --- a/lua/telekasten.lua +++ b/lua/telekasten.lua @@ -9,6 +9,7 @@ local utils = require("telescope.utils") local previewers = require("telescope.previewers") local make_entry = require("telescope.make_entry") local debug_utils = require("plenary.debug_utils") +local filetype = require("plenary.filetype") -- declare locals for the nvim api stuff to avoid more lsp warnings local vim = vim @@ -60,6 +61,7 @@ M.Cfg = { }, close_after_yanking = false, insert_after_inserting = true, + install_syntax = true } local function file_exists(fname) @@ -1481,6 +1483,14 @@ local function Setup(cfg) weekly = M.Cfg.template_new_weekly, } + if M.Cfg.install_syntax then + -- for previewers to pick up our syntax, we need to tell plenary to override `.md` with our syntax + filetype.add_file("telekasten") + + -- now activate our syntax also for all markdown files + vim.cmd("autocmd filetype markdown set syntax=telekasten") + end + if debug then print("Resulting config:") print("-----------------") diff --git a/syntax/markdown.vim b/syntax/markdown.vim index 2333841..8ddee00 100644 --- a/syntax/markdown.vim +++ b/syntax/markdown.vim @@ -1,25 +1,25 @@ -syntax region tkLink matchgroup=tkBrackets start=/\[\[/ end=/\]\]/ display oneline -syntax region tkHighlight matchgroup=tkBrackets start=/==/ end=/==/ display oneline +"syn region Comment matchgroup=mkdDelimiter start="\%^---$" end="^\(---\|\.\.\.\)$" contains=tkTag keepend + +syntax region tkLink matchgroup=tkBrackets start=/\[\[/ end=/\]\]/ display oneline +syntax region tkHighlight matchgroup=tkBrackets start=/==/ end=/==/ display oneline syntax match tkTag "\v#[a-zA-Z]+[a-zA-Z0-9/-_]*" syntax match tkTag "\v:[a-zA-Z]+[a-zA-Z0-9/-_]*:" syntax match tkTagSep "\v\s*,\s*" contained -syntax region tkTag matchgroup=tkBrackets start=/^\s*tags:\s*\[\s*/ end=/\s*\]\s*$/ contains=tkTagSep display oneline +syntax region tkTag matchgroup=tkBrackets start=/^tags\s*:\s*\[\s*/ end=/\s*\]\s*$/ contains=tkTagSep display oneline -hi tkTagSep ctermfg=gray -hi tkTag ctermfg=magenta - -echomsg "loaded" - -" just blue +" " just blue " hi tklink ctermfg=Blue cterm=bold,underline " hi tkBrackets ctermfg=gray - -" for gruvbox +" " for gruvbox " hi tklink ctermfg=72 cterm=bold,underline " hi tkBrackets ctermfg=gray -" Highlight ==highlighted== text +" " Highlight ==highlighted== text " hi tkHighlight ctermbg=yellow ctermfg=darkred cterm=bold +" +" " Tags +" hi tkTagSep ctermfg=gray +" hi tkTag ctermfg=magenta diff --git a/syntax/telekasten.vim b/syntax/telekasten.vim new file mode 100644 index 0000000..989a19d --- /dev/null +++ b/syntax/telekasten.vim @@ -0,0 +1,28 @@ +"syn region Comment matchgroup=mkdDelimiter start="\%^---$" end="^\(---\|\.\.\.\)$" contains=tkTag keepend +runtime! syntax/markdown.vim +"unlet b:current_syntax + +syntax region tkLink matchgroup=tkBrackets start=/\[\[/ end=/\]\]/ display oneline +syntax region tkHighlight matchgroup=tkBrackets start=/==/ end=/==/ display oneline + +syntax match tkTag "\v#[a-zA-Z]+[a-zA-Z0-9/-_]*" +syntax match tkTag "\v:[a-zA-Z]+[a-zA-Z0-9/-_]*:" + +syntax match tkTagSep "\v\s*,\s*" contained +syntax region tkTag matchgroup=tkBrackets start=/^tags\s*:\s*\[\s*/ end=/\s*\]\s*$/ contains=tkTagSep display oneline + + +" " just blue +" hi tklink ctermfg=Blue cterm=bold,underline +" hi tkBrackets ctermfg=gray + +" " for gruvbox +" hi tklink ctermfg=72 cterm=bold,underline +" hi tkBrackets ctermfg=gray + +" " Highlight ==highlighted== text +" hi tkHighlight ctermbg=yellow ctermfg=darkred cterm=bold +" +" " Tags +" hi tkTagSep ctermfg=gray +" hi tkTag ctermfg=magenta