Continuación automática de la lista y formato para Neovim, alimentado por Lua
Esta pregunta puede interpretarse de dos maneras. ¿Por qué creé autolista y por qué debería usar Autolist?
Suena simple, pero todo lo que quería era un complemento de continuación de la lista en Lua. Bullets.vim funciona, pero está escrito en Vimscript y tiene más de mil líneas de largo. No hace falta decir que no pude encontrar uno adecuado, así que decidí crear el mío.
Los archivos autolist.nvim's
son relativamente pequeños, con los archivos completos con comentarios y formateo. Se esfuerza por ser lo más mínimo posible, al implementar la funcionalidad básica de las listas automáticas, e implementa el contexto consciente de la numeración/marcado de las entradas de la lista, para que se le quite el formato y haga que funcione en segundo plano mientras escribe sus pensamientos.
Esto está utilizando lazy.nvim, pero también puede adaptarlo a otros administradores de paquetes:
{
" 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 ,
},
-|+|*
o 1.|2.|3.
)enter
/ return
y se creará automáticamente una nueva entrada de la listaenter
/ return
en una entrada de lista vacía la eliminará, dejándolo con una nueva oración nueva. - [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
}
Aquí están todas las funciones públicas:
AutolistNewBullet
: agrega una nueva bala en la línea actualAutolistRecalculate
: Recalcula una lista ordenadaAutolistToggleCheckbox
: alternar una casilla de verificación en la línea actualAutolistCycleNext
: cicla el tipo de lista reenvía de acuerdo con config.cycle
AutolistCyclePrev
: arriba, pero al revésAutolistTab
: tiene un caso de uso especial en el que desea sangrar la lista cuando presione la pestaña. Si desea sangrar la lista cuando presiona <ct>
, solo necesita asignar <ct>
para AutolistRecalculate
porque AutolistTab
básicamente convierte una pestaña en <ct>
con recalcule.AutolistShiftTab
: lo mismo que se indicó para replicar procesadores de palabras. El mapeo <s-tab>
a esto lo convertirá en <cd>AutolistRecalculate
. Todas las funciones descritas anteriormente tienen contrapartes LUA que son solo versiones de casos de serpientes de los comandos de casos Pascal. Por ejemplo, AutolistNewBullet
tiene la contraparte de la caja de serpiente require("autolist").new_bullet()
Hay dos funciones especiales para LUA: require("autolist").cycle_next_dr
y require("autolist").cycle_prev_dr
, que proporcionan versiones repetibles de puntos de AutolistCycleNext
y AutolistCyclePrev
.
En pocas palabras, todo lo que necesita hacer es hacer una coincidencia de patrones LUA que permita a Autolist encontrar su nuevo marcador de lista.
Aquí hay un artículo no muuito sobre patrones de Lua, pero puede encontrar ejemplos para estos patrones en la sección de patrones precargados.
Aquí le mostramos cómo definir su lista personalizada:
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
},
},
}
})
Ahora su patrón LUA (en este caso %a[.)]
Que coincide con las listas ASCII) se aplicará a los archivos de Markdown.
¿Tiene una asignación para alternar una casilla de verificación como Bullets.vim tiene? Sí.
¿Admite listas de casilla de verificación? Sí.
¿Encontraste que un complemento se rompe cuando usas Autolist? Ver #43. Básicamente, debe asegurarse de que se cargue autolista después de todos los otros complementos. Si eso no funciona, no dude en crear un nuevo problema. Además, asegúrese de que la capitalización de sus asignaciones sea correcta, o autolista no detecte los otros complementos ( <cr>
debería ser <CR>
).
Inspirado en esta esencia
"Todo el software agrega características hasta que sea molesto complicado. Luego se reemplaza por una solución" más simple "que agrega características hasta que sea exactamente tan complicada".
Buscando contribuyentes porque tengo trabajo escolar, lo que significa que a veces no puedo seguir el ritmo de los problemas