Created
June 14, 2020 07:34
-
-
Save huytd/668fc018b019fbc49fa1c09101363397 to your computer and use it in GitHub Desktop.
A Todo list syntax in Vim, with an actual checkbox
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
" Vim syntax file | |
" Language: Todo | |
" Maintainer: Huy Tran | |
" Latest Revision: 14 June 2020 | |
if exists("b:current_syntax") | |
finish | |
endif | |
" Custom conceal | |
syntax match todoCheckbox "\[\ \]" conceal cchar= | |
syntax match todoCheckbox "\[x\]" conceal cchar= | |
let b:current_syntax = "todo" | |
hi def link todoCheckbox Todo | |
hi Conceal guibg=NONE | |
setlocal cole=1 |
I solved the indentation problem using hs
:
syntax match my_todo '\v(\s+)?-\s\[\s\]'hs=e-4 conceal cchar=
syntax match my_todo_done '\v(\s+)?-\s\[X\]'hs=e-4 conceal cchar=
More info can be found in :h syn-pattern-offset
@disanman Thank you. However I seem to still have the same problem with the indentation getting eaten up by the conceal which causes all checkboxes to have the same indentation.
Never mind I used the wrong syntax match
lol.
@Melkster nice you found the issue :)
Check I also added support for VimWiki ToDo's state using some symbols I found:
syntax match VimwikiListTodo '\v(\s+)?(-|\*)\s\[\s\]'hs=e-4 conceal cchar=
syntax match VimwikiListTodo '\v(\s+)?(-|\*)\s\[X\]'hs=e-4 conceal cchar=
syntax match VimwikiListTodo '\v(\s+)?(-|\*)\s\[-\]'hs=e-4 conceal cchar=☒
syntax match VimwikiListTodo '\v(\s+)?(-|\*)\s\[\.\]'hs=e-4 conceal cchar=⊡
syntax match VimwikiListTodo '\v(\s+)?(-|\*)\s\[o\]'hs=e-4 conceal cchar=⬕
For users working in neovim, you can put this in your ftplugin/markdown.lua
.
function _G.pcall_markdown_sugar()
vim.cmd([[
augroup markdown
autocmd!
au BufEnter *.md :syn match todoCheckbox '\v(\s+)?(-|\*)\s\[\s\]'hs=e-4 conceal cchar=
au BufEnter *.md :syn match todoCheckbox '\v(\s+)?(-|\*)\s\[x\]'hs=e-4 conceal cchar=
au BufEnter *.md :syn match todoCheckbox '\v(\s+)?(-|\*)\s\[-\]'hs=e-4 conceal cchar=
au BufEnter *.md :syn match todoCheckbox '\v(\s+)?(-|\*)\s\[\.\]'hs=e-4 conceal cchar=⊡
au BufEnter *.md :syn match todoCheckbox '\v(\s+)?(-|\*)\s\[o\]'hs=e-4 conceal cchar=⬕
:hi def link todoCheckbox Todo
:highlight Conceal guibg=NONE guifg=#00cf37
:setlocal conceallevel=1
augroup END
]])
end
pcall_markdown_sugar()
@rohit-kumar-j I took the liberty of improving your code to use the available Neovim Lua APIs:
local function markdown_sugar()
local augroup = vim.api.nvim_create_augroup('markdown', {})
vim.api.nvim_create_autocmd('BufEnter', {
pattern = '*.md',
group = augroup,
callback = function()
vim.api.nvim_set_hl(0, 'Conceal', { bg = 'NONE', fg = '#00cf37' })
vim.api.nvim_set_hl(0, 'todoCheckbox', { link = 'Todo' })
vim.bo.conceallevel = 1
vim.cmd [[
syn match todoCheckbox '\v(\s+)?(-|\*)\s\[\s\]'hs=e-4 conceal cchar=
syn match todoCheckbox '\v(\s+)?(-|\*)\s\[x\]'hs=e-4 conceal cchar=
syn match todoCheckbox '\v(\s+)?(-|\*)\s\[-\]'hs=e-4 conceal cchar=
syn match todoCheckbox '\v(\s+)?(-|\*)\s\[\.\]'hs=e-4 conceal cchar=⊡
syn match todoCheckbox '\v(\s+)?(-|\*)\s\[o\]'hs=e-4 conceal cchar=⬕
]]
end
})
end
markdown_sugar()
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This doesn't work for lists in lists, since only the outermost list gets concealed. For example:
I tried to solve it with the following:
But that removes the indentation when concealing. What pattern do I need in my
syntax match
to match but not conceal the indentation? I tried to use regex capture groups (which I think is how you should do it) but couldn't get it working correctly.