Files
neogen/lua/neogen.lua
Daniel Mathiot 499a4301fa Fix first time insert mode
I did a silly workaround because when at normal mode and going to insert
mode, it is not the same as being in insert mode and going to insert
mode. Somehow the cursor jumping is broken.

So what i did was to call a insert_mode a first time before any actual
jumping.
2021-08-28 01:31:51 +02:00

137 lines
5.2 KiB
Lua

local ok, ts_utils = pcall(require, "nvim-treesitter.ts_utils")
assert(ok, "neogen requires nvim-treesitter to operate :(")
neogen = {}
-- Require utilities
neogen.utilities = {}
require("neogen.utilities.extractors")
require("neogen.utilities.nodes")
require("neogen.utilities.cursor")
-- Require defaults
require("neogen.locators.default")
require("neogen.granulators.default")
require("neogen.generators.default")
neogen.generate = function(opts)
opts = opts or {
type = "func",
}
vim.treesitter.get_parser(0):for_each_tree(function(tree, language_tree)
local language = neogen.configuration.languages[language_tree:lang()]
if language then
language.locator = language.locator or neogen.default_locator
language.granulator = language.granulator or neogen.default_granulator
language.generator = language.generator or neogen.default_generator
if not language.parent[opts.type] or not language.data[opts.type] then
return
end
-- Use the language locator to locate one of the required parent nodes above the cursor
local located_parent_node = language.locator({
root = tree:root(),
current = ts_utils.get_node_at_cursor(0),
}, language.parent[opts.type])
if not located_parent_node then
return
end
-- Use the language granulator to get the required content inside the node found with the locator
local data = language.granulator(located_parent_node, language.data[opts.type])
if data then
-- Will try to generate the documentation from a template and the data found from the granulator
local to_place, start_column, content = language.generator(
located_parent_node,
data,
language.template,
opts.type
)
if #content ~= 0 then
neogen.utilities.cursor.del_extmarks() -- Delete previous extmarks before setting any new ones
local jump_text = language.jump_text or neogen.configuration.jump_text
--- Removes jump_text marks and keep the second part of jump_text|other_text if there is one (which is other_text)
local delete_marks = function(v)
local pattern = jump_text .. "[|%w]+"
local matched = string.match(v, pattern)
if matched then
local split = vim.split(matched, "|", true)
if #split == 2 and neogen.configuration.input_after_comment == false then
return string.gsub(v, jump_text .. "|", "")
end
else
return string.gsub(v, jump_text, "")
end
return string.gsub(v, pattern, "")
end
local content_with_marks = vim.deepcopy(content)
-- delete all jump_text marks
content = vim.tbl_map(delete_marks, content)
-- Append the annotation in required place
vim.fn.append(to_place, content)
-- Place cursor after annotations and start editing
if neogen.configuration.input_after_comment == true then
-- Creates extmarks for the content
for i, value in pairs(content_with_marks) do
local input_start, _ = string.find(value, jump_text)
if input_start then
neogen.utilities.cursor.create(to_place + i, input_start)
end
end
if neogen.utilities.cursor.jumpable() then
neogen.utilities.cursor.jump({ first_time = true })
end
end
end
end
end
end)
end
function neogen.jump_next()
neogen.utilities.cursor.jump()
end
function neogen.jumpable()
return neogen.utilities.cursor.jumpable()
end
function neogen.generate_command()
vim.api.nvim_command('command! -range -bar Neogen lua require("neogen").generate()')
end
neogen.setup = function(opts)
neogen.configuration = vim.tbl_deep_extend("keep", opts or {}, {
input_after_comment = true, -- bool, If you want to jump with the cursor after annotation
jump_text = "$1", -- symbol to find for jumping cursor in template
jump_map = "<C-e>",
-- DEFAULT CONFIGURATION
languages = {
lua = require("neogen.configurations.lua"),
python = require("neogen.configurations.python"),
javascript = require("neogen.configurations.javascript"),
c = require("neogen.configurations.c"),
},
})
if neogen.configuration.enabled == true then
neogen.generate_command()
vim.api.nvim_set_keymap("i", neogen.configuration.jump_map, "<cmd>lua require('neogen').jump_next()<CR>", {})
end
end
return neogen