Continue et formatage de liste automatique pour Neovim, propulsé par Lua
Cette question peut être interprétée de deux manières. Pourquoi ai-je créé Autolist et pourquoi vous devriez utiliser Autolist.
Cela semble simple, mais tout ce que je voulais, c'était un plugin de continuation de liste à Lua. Bullets.vim fonctionne, mais il est écrit en vimscript et fait plus de mille lignes. Inutile de dire que je ne pouvais pas en trouver un approprié, alors j'ai décidé de créer le mien.
Les fichiers autolist.nvim's sont relativement petits, avec les fichiers complets avec commentaires et formatage. Il s'efforce d'être aussi minimal que possible, tout en implémentant des fonctionnalités de base des listes automatiques, et met en œuvre un contexte de renumérotation / marquage des entrées de liste, pour vous éloigner de la mise en forme et le faire fonctionner en arrière-plan pendant que vous écrivez vos pensées.
Il s'agit d'utiliser Lazy.nvim, mais vous pouvez également l'adapter à d'autres gestionnaires de packages:
{
" 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 ,
},-|+|* ou 1.|2.|3. )enter / return et une nouvelle entrée de liste sera automatiquement crééeenter / return sur une entrée de liste vide le supprimera, vous laissant une nouvelle nouvelle phrase. - [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
}Voici toutes les fonctions publiques:
AutolistNewBullet : ajoute une nouvelle balle sur la ligne actuelleAutolistRecalculate : recalcule une liste ordonnéeAutolistToggleCheckbox : bascule une case à cocher sur la ligne actuelleAutolistCycleNext config.cycleAutolistCyclePrev : ci-dessus, mais en arrièreAutolistTab : a un cas d'utilisation spécial où vous souhaitez mettre en œuvre la liste lorsque vous appuyez sur l'onglet. Si vous souhaitez mettre en œuvre la liste lorsque vous appuyez sur <ct> , vous n'avez qu'à cartographier <ct> pour AutolistRecalculate car AutolistTab transforme essentiellement un onglet en <ct> avec recalculé.AutolistShiftTab : Même chose que ci-dessus, utilisé pour reproduire les traitements de texte. Le mappage <s-tab> à cela le convertira en <cd>AutolistRecalculate . Toutes les fonctions décrites ci-dessus ont des homologues LUA qui ne sont que des versions de cas de serpent des commandes de cas Pascal. Par exemple, AutolistNewBullet a le homologue du boîtier de serpent require("autolist").new_bullet()
Il existe deux fonctions spéciales pour LUA: require("autolist").cycle_next_dr et require("autolist").cycle_prev_dr , qui fournissent des versions à points révisables d' AutolistCycleNext et AutolistCyclePrev .
En un mot, il vous suffit de faire une correspondance de modèle LUA qui permet à Autolist de trouver votre nouveau marqueur de liste.
Voici un article non BAD sur les modèles LUA, mais vous pouvez trouver des exemples pour ces modèles dans la section des modèles préchargés.
Voici comment définir votre liste personnalisée:
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
},
},
}
}) Maintenant, votre modèle LUA (dans ce cas %a[.)] Qui correspond aux listes ASCII) sera appliquée aux fichiers de marque.
A-t-il un mappage pour basculer une case à cocher comme Bullets.vim a? Oui.
Prend-il en charge les listes de cases à cocher? Oui.
Vous avez constaté qu'un plugin se casse lorsque vous utilisez Autolist? Voir # 43. Fondamentalement, vous devez vous assurer que Autolist se charge après tous les autres plugins. Si cela ne fonctionne pas, n'hésitez pas à créer un nouveau problème. Assurez-vous également que la capitalisation de vos mappages est correcte ou que Autolist ne détectera pas les autres plugins ( <cr> devrait être <CR> ).
Inspiré par cet escroc
"Tous les logiciels ajoutent des fonctionnalités jusqu'à ce qu'il soit ennuyeux.
à la recherche de contributeurs parce que j'ai des travaux scolaires, ce qui signifie que je ne peux parfois pas suivre les problèmes