Автоматическое продолжение списка и форматирование для NEOVIM, питание от LUA
Этот вопрос можно интерпретировать двумя способами. Почему я создал автолиста, и почему вы должны использовать Autolist.
Это звучит просто, но все, что я хотел, это плагин продолжения списка в Lua. Bullets.vim работает, но он написан в Vimscript и составляет более тысячи строк. Само собой разумеется, я не мог найти подходящего, поэтому я решил создать свой собственный.
Файлы autolist.nvim's относительно невелики, с файлами в комплекте с комментариями и форматированием. Он стремится быть настолько минимальным, насколько это возможно, внедряя базовую функциональность автоматических списков и реализует контекст, осведомленную об обновлении/маркировке записей списков, чтобы отвлечь ваш разум от форматирования и заставить его работать на заднем плане, пока вы записываете свои мысли.
Это использует Lazy.nvim, но вы также можете адаптировать его к другим менеджерам пакетов:
{
" gaoDean/autolist.nvim " ,
ft = {
" markdown " ,
" text " ,
" tex " ,
" plaintex " ,
" norg " ,
},
config = function ()
require ( " autolist " ). setup ()
vim . keymap . set ( " i " , " <tab> " , " <cmd>AutolistTab<cr> " )
vim . keymap . set ( " i " , " <s-tab> " , " <cmd>AutolistShiftTab<cr> " )
-- vim.keymap.set("i", "<c-t>", "<c-t><cmd>AutolistRecalculate<cr>") -- an example of using <c-t> to indent
vim . keymap . set ( " i " , " <CR> " , " <CR><cmd>AutolistNewBullet<cr> " )
vim . keymap . set ( " n " , " o " , " o<cmd>AutolistNewBullet<cr> " )
vim . keymap . set ( " n " , " O " , " O<cmd>AutolistNewBulletBefore<cr> " )
vim . keymap . set ( " n " , " <CR> " , " <cmd>AutolistToggleCheckbox<cr><CR> " )
vim . keymap . set ( " n " , " <C-r> " , " <cmd>AutolistRecalculate<cr> " )
-- cycle list types with dot-repeat
vim . keymap . set ( " n " , " <leader>cn " , require ( " autolist " ). cycle_next_dr , { expr = true })
vim . keymap . set ( " n " , " <leader>cp " , require ( " autolist " ). cycle_prev_dr , { expr = true })
-- if you don't want dot-repeat
-- vim.keymap.set("n", "<leader>cn", "<cmd>AutolistCycleNext<cr>")
-- vim.keymap.set("n", "<leader>cp", "<cmd>AutolistCycleNext<cr>")
-- functions to recalculate list on edit
vim . keymap . set ( " n " , " >> " , " >><cmd>AutolistRecalculate<cr> " )
vim . keymap . set ( " n " , " << " , " <<<cmd>AutolistRecalculate<cr> " )
vim . keymap . set ( " n " , " dd " , " dd<cmd>AutolistRecalculate<cr> " )
vim . keymap . set ( " v " , " d " , " d<cmd>AutolistRecalculate<cr> " )
end ,
},-|+|* или 1.|2.|3. )enter / return , и будет автоматически создана новая запись спискаenter / return в пустой записи списка удалит его, оставив вас новым предложением. - [x] checkboxes can be toggled with ` :AutolistToggleCheckbox ` , which is bound to ` return ` in normal mode if you used the default mappings
1 . [x] these can also be numbered
a) [ ] or these can work too
b) [ x ] see?
I. Roman numerals are also supported
II. Just press enter, and autolist will do the calculations for you
MX. All the way up
MXI. to infinity
MXII. It really will continue forever
MXIII. -I think
- you can cycle the type of the list with ` :AutolistCycleNext ` and ` :AutolistCyclePrev `
- below is a copy of this list after cycling twice
1 . you can cycle the type of the list with ` :AutolistCycleNext ` and ` :AutolistCyclePrev `
2 . below is a copy of this list after cycling twice local list_patterns = {
neorg_1 = " %- " ,
neorg_2 = " %-%- " ,
neorg_3 = " %-%-%- " ,
neorg_4 = " %-%-%-%- " ,
neorg_5 = " %-%-%-%-%- " ,
unordered = " [-+*] " , -- - + *
digit = " %d+[.)] " , -- 1. 2. 3.
ascii = " %a[.)] " , -- a) b) c)
roman = " %u*[.)] " , -- I. II. III.
latex_item = " \ item " ,
}
local default_config = {
enabled = true ,
colon = { -- if a line ends in a colon
indent = true , -- if in list and line ends in `:` then create list
indent_raw = true , -- above, but doesn't need to be in a list to work
preferred = " - " , -- what the new list starts with (can be `1.` etc)
},
cycle = { -- Cycles the list type in order
" - " , -- whatever you put here will match the first item in your list
" * " , -- for example if your list started with a `-` it would go to `*`
" 1. " , -- this says that if your list starts with a `*` it would go to `1.`
" 1) " , -- this all leverages the power of recalculate.
" a) " , -- i spent many hours on that function
" I. " , -- try it, change the first bullet in a list to `a)`, and press recalculate
},
lists = { -- configures list behaviours
-- Each key in lists represents a filetype.
-- The value is a table of all the list patterns that the filetype implements.
-- See how to define your custom list below in the readme.
-- You must put the file name for the filetype, not the file extension
-- To get the "file name", it is just =:set filetype?= or =:se ft?=.
markdown = {
list_patterns . unordered ,
list_patterns . digit ,
list_patterns . ascii , -- for example this specifies activate the ascii list
list_patterns . roman , -- type for markdown files.
},
text = {
list_patterns . unordered ,
list_patterns . digit ,
list_patterns . ascii ,
list_patterns . roman ,
},
norg = {
list_patterns . neorg_1 ,
list_patterns . neorg_2 ,
list_patterns . neorg_3 ,
list_patterns . neorg_4 ,
list_patterns . neorg_5 ,
},
tex = { list_patterns . latex_item },
plaintex = { list_patterns . latex_item },
},
checkbox = {
left = " %[ " , -- the left checkbox delimiter (you could change to "%(" for brackets)
right = " %] " , -- the right checkbox delim (same customisation as above)
fill = " x " , -- if you do the above two customisations, your checkbox could be (x) instead of [x]
},
-- this is all based on lua patterns, see "Defining custom lists" for a nice article to learn them
}Вот все публичные функции:
AutolistNewBullet : добавляет новую пулю на текущей линииAutolistRecalculate : пересчитывает упорядоченный списокAutolistToggleCheckbox : переключает флажок на текущей линииAutolistCycleNext : циклы тип списка вперед в соответствии с config.cycleAutolistCyclePrev : выше, но назадAutolistTab : имеет особый вариант использования, когда вы хотите отступить список при нажатии вкладки. Если вы хотите отступить в списке при нажатии <ct> , вам нужно только отобразить <ct> , чтобы AutolistRecalculate потому что AutolistTab в основном превращает вкладку в <ct> с перечислением.AutolistShiftTab : То же самое, что и выше, используется для воспроизведения текстовых процессоров. Сопоставление <s-tab> в это преобразует его в <cd>AutolistRecalculate . Все функции, описанные выше, имеют аналоги LUA, которые являются просто версиями для змеи в командах палаты Pascal. Например, AutolistNewBullet имеет Case Case Counter require("autolist").new_bullet()
Существует две специальные функции для Lua: require("autolist").cycle_next_dr and require("autolist").cycle_prev_dr , которые обеспечивают точечные версии AutolistCycleNext и AutolistCyclePrev .
Короче говоря, все, что вам нужно сделать, это сделать матч с узором Lua, который позволяет Autolist найти ваш новый маркер списка.
Вот непревзойденная статья о моделях LUA, но вы можете найти примеры для этих моделей в разделе предварительно загруженных шаблонов.
Вот как определить свой собственный список:
local my_list_patterns = {
test = " %a[.)] "
}
require ( ' autolist ' ). setup ({
lists = {
markdown = {
" %a[.)] " , -- insert your custom lua pattern here
my_list_patterns . test , -- or use a variable
},
},
}
}) Теперь ваш шаблон LUA (в данном случае %a[.)] Который соответствует спискам ASCII) будет применяться к файлам уценки.
Есть ли в нем отображение для переключения флажок, как Bullets.vim? Да.
Поддерживает ли он списки флажков? Да.
Обнаружил, что плагин ломается при использовании Autolist? Смотрите #43. По сути, вам нужно убедиться, что аутолист загружается после всех других плагинов. Если это не работает, не стесняйтесь создавать новую проблему. Кроме того, убедитесь, что капитализация ваших отображений является правильной, или Autolist не обнаруживает другие плагины ( <cr> должен быть <CR> ).
Вдохновленный этой суть
«Все программное обеспечение добавляет функции, пока оно не станет досадно сложным. Затем оно заменяется« более простым »решением, которое добавляет функции до тех пор, пока оно не станет таким же сложным».
Ищу участников, потому что у меня есть школьная работа, а это значит, что я иногда не могу не отставать от проблем