============================================================================== ------------------------------------------------------------------------------ Table of contents: Neogen's purpose....................................................|neogen| The setup function..........................................|neogen.setup()| Usage.........................................................|neogen-usage| Configure the setup...................................|neogen-configuration| Generate annotations.....................................|neogen.generate()| Contributing................................................|neogen-develop| Configurations for the template table........|neogen-template-configuration| API to customize templates.............................|neogen-template-api| ------------------------------------------------------------------------------ *neogen* What is Neogen ? # Abstract~ Neogen is an extensible and extremely configurable annotation generator for your favorite languages Want to know what the supported languages are ? Check out the up-to-date readme section: https://github.com/danymat/neogen#supported-languages # Concept~ - Create annotations with one keybind, and jump your cursor in the inserted annotation - Defaults for multiple languages and annotation conventions - Extremely customizable and extensible - Written in lua (and uses Tree-sitter) ------------------------------------------------------------------------------ *neogen.setup()* `neogen.setup`({opts}) Module setup Parameters~ {opts} `(table)` Config table (see |neogen.configuration|) Usage~ `require('neogen').setup({})` (replace `{}` with your `config` table) ------------------------------------------------------------------------------ *neogen-usage* Neogen Usage Neogen will use Treesitter parsing to properly generate annotations. The basic idea is that Neogen will generate annotation to the type you're in. For example, if you have a csharp function like (note the cursor position): > public class HelloWorld { public static void Main(string[] args) { # CURSOR HERE Console.WriteLine("Hello world!"); return true; } public int someMethod(string str, ref int nm, void* ptr) { return 1; } } < and you call `:Neogen class`, it will generate the annotation for the upper class: > /// /// ... /// public class HelloWorld { < Currently supported types are `func`, `class`, `type`, `file`. Check out the up-to-date readme section: https://github.com/danymat/neogen#supported-languages To know the supported types for a certain language NOTE: calling `:Neogen` without any type is the same as `:Neogen func` ------------------------------------------------------------------------------ *neogen-configuration* `neogen.configuration` # Basic configurations~ Neogen provides those defaults, and you can change them to suit your needs > neogen.configuration = { -- Enables Neogen capabilities enabled = true, -- Go to annotation after insertion, and change to insert mode input_after_comment = true, -- Symbol to find for jumping cursor in template jump_text = "$1", -- Configuration for default languages languages = {}, } < # Notes~ - to configure a language, just add your configurations in the `languages` table For example, for the `lua` lang: > languages = { lua = { -- Configuration here } } < - `jump_text` is widely used and will certainly break most language templates. I'm thinking of removing it from defaults so that it can't be modified ------------------------------------------------------------------------------ *neogen.generate()* `neogen.generate`({opts}) The only function required to use Neogen. It'll try to find the first parent that matches a certain type. For example, if you are inside a function, and called `generate({ type = "func" })`, Neogen will go until the start of the function and start annotating for you. Parameters~ {opts} `(table)` Options to change default behaviour of generation. - {opts.type} `(string?, default: "func")` Which type we are trying to use for generating annotations. Currently supported: `func`, `class`, `type`, `file` ------------------------------------------------------------------------------ *neogen.get_template()* `neogen.get_template`({filetype}) Get a template for a particular filetype Parameters~ {filetype} `(string)` Return~ `(neogen.TemplateConfig|nil)` ------------------------------------------------------------------------------ *neogen-develop* Contribute to Neogen * Want to add a new language? 1. Using the defaults to generate a new language support: https://github.com/danymat/neogen/blob/main/docs/adding-languages.md 2. (advanced) Only if the defaults aren't enough, please see here: https://github.com/danymat/neogen/blob/main/docs/advanced-integration.md * Want to contribute to an existing language? I guess you can still read the previous links, as they have some valuable knowledge inside. You can go and directly open/edit the configuration file relative to the language you want to contribute to. Feel free to submit a PR, I will be happy to help you ! ============================================================================== ------------------------------------------------------------------------------ *neogen-template-configuration* Each filetype has a template configuration. A template configuration is responsible for explicitely adding templates corresponding to annotation conventions, as well as providing custom configurations in order to be precise about how to customize the annotations. We exposed some API to help you customize a template, and add your own custom annotations For this, please go to |neogen.template_api| Type~ neogen.TemplateConfig Default values: > local neogen_template = { annotation_convention = nil, use_default_comment = false, } < ------------------------------------------------------------------------------ # neogen.TemplateConfig~ Class~ {neogen.TemplateConfig} see |template_config| Fields~ {annotation_convention} `(string)` select which annotation convention to use {use_default_comment} `(boolean)` Prepend default filetype comment before a annotation {append} `(neogen.TemplateConfig.Append|nil)` custom placement of the annotation {position} `(fun(node: userdata, type: string): number,number)` Provide an absolute position for the annotation If values are `nil`, use default positioning Class~ {neogen.TemplateConfig.Append} {child_name} `(string)` Which child node to use for appending the annotation {fallback} `(string)` Node to fallback if `child_name` is not found {position} "'after'"|"'before'" Place the annotation relative to position with `child_name` or `fallback` {disabled} `(table|nil)` Disable custom placement for provided types For example, to customize the placement for a python annotation, we can use `append`, like so: > python = { template = { append = { child_name = "comment", fallback = "block", position = "after" } } } < Here, we instruct the generator to place the annotation "after" the "comment" (if not found: "block") node Results in: > def test(): """ """ pass < Or: > def test(): # This is a comment """ """ pass < ------------------------------------------------------------------------------ *neogen-template-api* # Templates API~ Welcome to the neogen API section for templates. A template is an entity relative to a filetype that holds configurations for how to place annotations. With it, you can add an annotation convention to a filetype, change defaults, and even provide your own annotation convention ! I exposed some API's, available after you get a template. Please see |neogen.get_template()| for how to get a template. Example: > neogen.get_template("python"):config({ annotation_convention = ... }) < ------------------------------------------------------------------------------ *neogen-template-api.config()* Updates a template configuration `:config`({tbl}) Parameters~ {tbl} neogen.TemplateConfig Override the template with provided config ------------------------------------------------------------------------------ *neogen-template-api.add_annotation()* Add an annotation convention to the template `:add_annotation`({name}) Parameters~ {name} `(string)` The name of the annotation convention ------------------------------------------------------------------------------ *neogen-template-api.add_default_annotation()* Add an annotation convention to the template and make it the default `:add_default_annotation`({name}) Parameters~ {name} `(string)` The name of the annotation convention vim:tw=78:ts=8:noet:ft=help:norl: