{"id":13897508,"url":"https://github.com/google/vimdoc","last_synced_at":"2025-10-06T17:04:19.782Z","repository":{"id":15111371,"uuid":"17838265","full_name":"google/vimdoc","owner":"google","description":"Helpfile generation for vim ","archived":false,"fork":false,"pushed_at":"2024-09-09T22:38:52.000Z","size":146,"stargazers_count":303,"open_issues_count":51,"forks_count":29,"subscribers_count":19,"default_branch":"main","last_synced_at":"2025-10-02T13:38:12.862Z","etag":null,"topics":["vim"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/google.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-03-17T18:12:29.000Z","updated_at":"2025-09-27T16:30:25.000Z","dependencies_parsed_at":"2024-08-28T18:49:19.849Z","dependency_job_id":"8e477cdc-f8e9-499d-833b-ff32cc09dae5","html_url":"https://github.com/google/vimdoc","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/google/vimdoc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fvimdoc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fvimdoc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fvimdoc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fvimdoc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/google","download_url":"https://codeload.github.com/google/vimdoc/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fvimdoc/sbom","scorecard":{"id":438153,"data":{"date":"2025-08-11","repo":{"name":"github.com/google/vimdoc","commit":"9ff61d26ff559fe5f1b7c8efb5751cfd973c60e2"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.5,"checks":[{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/discord.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/tests.yml:10","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":5,"reason":"Found 10/19 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/discord.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/google/vimdoc/discord.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/google/vimdoc/tests.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/google/vimdoc/tests.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:45","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:46","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.7.1 not signed: https://api.github.com/repos/google/vimdoc/releases/81507235","Warn: release artifact v0.7.0 not signed: https://api.github.com/repos/google/vimdoc/releases/41594746","Warn: release artifact v0.6.0 not signed: https://api.github.com/repos/google/vimdoc/releases/1332466","Warn: release artifact v0.5.1 not signed: https://api.github.com/repos/google/vimdoc/releases/569638","Warn: release artifact v0.5.0 not signed: https://api.github.com/repos/google/vimdoc/releases/543287","Warn: release artifact v0.7.1 does not have provenance: https://api.github.com/repos/google/vimdoc/releases/81507235","Warn: release artifact v0.7.0 does not have provenance: https://api.github.com/repos/google/vimdoc/releases/41594746","Warn: release artifact v0.6.0 does not have provenance: https://api.github.com/repos/google/vimdoc/releases/1332466","Warn: release artifact v0.5.1 does not have provenance: https://api.github.com/repos/google/vimdoc/releases/569638","Warn: release artifact v0.5.0 does not have provenance: https://api.github.com/repos/google/vimdoc/releases/543287"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/google/.github/SECURITY.md:1","Info: Found linked content: github.com/google/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/google/.github/SECURITY.md:1","Info: Found text in security policy: github.com/google/.github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T05:07:45.743Z","repository_id":15111371,"created_at":"2025-08-19T05:07:45.743Z","updated_at":"2025-08-19T05:07:45.743Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278331925,"owners_count":25969647,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["vim"],"created_at":"2024-08-06T18:03:39.227Z","updated_at":"2025-10-06T17:04:19.764Z","avatar_url":"https://github.com/google.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"Vimdoc - Helpfile generation for vim plugins\n============================================\n\nVimdoc generates vim helpfiles from documentation in vimscript files. You\nannotate vimscript like this:\n\n    \"\"\n    \" This is my function. It does different things to the {required} argument,\n    \" depending upon the [optional] argument.\n    function! myplugin#MyFunction(required, ...) abort\n      ...\n    endfunction\n\nand you get helpfiles that look like this:\n\n    ===========================================================================\n    FUNCTIONS                                              *myplugin-functions*\n\n    myplugin#MyFunction({required}, [optional])         *myplugin#MyFunction()*\n      This is my function. It does different things to the {required} argument,\n      depending upon the [optional] argument.\n\nThis allows you to keep all of your documentation in one place (the code!) and\ngenerate nicely formatted help files without manually aligning text and adding\ntags and so on.\n\nTo see an example of vimdoc in use, see\n[maktaba](https://github.com/google/maktaba), specifically the\n[helloworld](https://github.com/google/maktaba/tree/HEAD/examples/helloworld)\nexample plugin therein, which shows some of the basics.\n\n**Vimdoc is unstable**. It's a collection of regexes and hacks masquerading as\na complete vim documentation tool. But it works, and it's useful, and it will\ncontinue to be useful while it gets cleaned up.\n\nInstallation\n------------\n\nUse setup.py to install vimdoc in the usual way. On most systems, this is:\n\n    python setup.py config\n    python setup.py build\n    sudo python setup.py install\n\nExecution\n---------\n\nRun vimdoc on a directory containing a plugin. It will generate a help file in\nthe 'doc' directory of that plugin. For example:\n\n    vimdoc plugins/myplugin\n\nwill generate the helpfile\n\n    plugins/myplugin/doc/myplugin.txt\n\nUsage\n-----\n\nVimdoc operates on comment blocks, which are a continuous group of lines\nstarting with the \"\" header:\n\n    \"\"\n    \" Documentation for function\n    function! ...\n\nVimdoc automatically recognizes the type of these blocks. It can detect the\nfollowing:\n\n- function definitions\n- command definitions\n- global settings\n- maktaba flags\n- plugin descriptions (at the top of plugin files)\n\nThe names of functions/commands/settings are automatically detected from the\nline below the comment block. The arguments for functions/commands are\nautomatically deduced from the body of the text and (in the case of functions)\nfrom the name of the arguments in the function definition, as follows:\n\n- If the names of all mentioned required arguments in the comment block match\n  the names of the arguments in the function definition, then the required\n  arguments are ordered according to their placement in the function definition.\n- Otherwise, the names used in the comment block are used instead of the names\n  used in the function definition, in the order of mention in the comment block.\n- Optional arguments (which cannot be named in a function definition, as their\n  existence is indicated only by an ellipsis) are used as named in the comment\n  block, in the order of mention.\n\nThese defaults are usually correct, but can be overridden.\n\nVimdoc has a number of builtin directives, which are marked by @ signs.\n\nIt also detects your plugin's addon-info.json file if present (see the\n[documentation](http://vim-wiki.mawercer.de/wiki/topic/addon-info.json.html) and\nrelevant [VAM help](https://github.com/MarcWeber/vim-addon-manager/blob/HEAD/doc/vim-addon-manager-additional-documentation.txt)).\n\n### Block Directives\n\nBlock directives take up an entire line in the comment block. They look like\nthis:\n\n    \"\"\n    \" @usage req1 req2 \\[opt1] \\[opt2]\n    \" description...\n    function! MyFunction(badName1, badName2, ...)\n\nAvailable block directives include:\n\n- `@stylized name` allows you to define the stylized version of a plugin name\n  (for example, myplugin could be stylized as \"My Plugin\").\n- `@library` marks your plugin as a library plugin. This makes functions public\n  by default.\n- `@public` marks a function public. In most plugins, functions are private by\n  default, though this default may be overridden on a per-plugin basis.\n- `@private` marks a function private.\n- `@section name[, id]` allows you to write a new section for the helpfile. The\n  id will be a lowercased version of name if omitted.\n- `@parentsection id` defines the current section as a child of the given\n  section. Must be contained within a `@section` block.\n- `@subsection name` defines a subsection (heading) within a section block.\n- `@backmatter id` declares a block to be rendered at the end of the given\n  section.\n- `@order ...` allows you to define the order of the sections. Sections with a\n  `@parentsection` may not be included here.\n- `@dict name` (above blank lines) allows you to define a new dictionary.\n- `@dict dict.fn` (above a function) allows you to add a function to\n  a dictionary.\n- `@usage ...` allows you to rename and reorder the arguments of a function or\n  command.\n- `@all` denotes that the remainder of the block will be included in all usages\n  (in the case of multiple overloaded usages).\n- `@function ...` allows you to alter the function tag directly, for when @usage\n  does not offer enough control.\n- `@command ...` allows you to alter the command tag directly, for when @usage\n  does not offer enough control.\n- `@setting name` declares a setting (global or per-buffer configuration\n  variable).\n- `@default arg=value` describes the default value of an optional arg.\n- `@throws exception` describes the type of exceptions that a function or\n  command may throw.\n- `@deprecated reason` marks a command or function as deprecated and excludes it\n  from the docs.\n\nThe global directives (@stylized, @order, and @library) are all detected from\ninside a @section block (usually the Introduction section).\n\n### Inline Directives\n\nInline directives occur in the body of comment blocks. Most take one argument\nenclosed in parenthesis.\n\n- `@function(name)` generates a link to a function defined in the plugin.\n- `@command(name)` generates a link to a command defined in the plugin.\n- `@flag(name)` generates a link to a flag defined in the plugin.\n- `@setting(name)` generates a link to a setting defined in the plugin.\n- `@section(id)` generates a link to a section defined in the plugin.\n- `@dict(name)` generates a link to a dictionary defined in the plugin.\n- `@plugin(attr)` Outputs some plugin data, such as the name or author. `attr`\n  must be one of `stylized`, `name`, or `author`. If the attr (and parenthesis)\n  are left off, `stylized` is used.\n\n### Other Metadata\n\nSome metadata for your plugin is not configured via vimdoc directives, but comes\nfrom other sources.\n\nBy default, the `name` for the plugin is the name of its top-level directory. If\nan\n[addon-info.json](http://vim-wiki.mawercer.de/wiki/topic/addon-info.json.html)\nfile is present and contains an explicit \"name\" field, vimdoc will use that\nplugin name instead. This is important if the plugin lives in a directory with a\n\"vim\" prefix or suffix, such as \"vim-dispatch\". This plugin name will appear in\nthe helpfile header and determine the name of the helpfile itself.\n\nVimdoc will also take the `author` and `description` values from the \"author\"\nand \"description\" fields in addon-info.json.\n\n\nSyntax\n------\n\nVimdoc syntax is reminiscent of helpfile syntax.\n\n- Use quotes to reference settings, such as 'filetype'.\n- Use brackets to reference [optional] function arguments.\n- Use braces to reference {required} function arguments.\n- Use |pipes| to link to tags in other helpfiles.\n\nHelpfile Structure\n------------------\n\nThe generated helpfile for a plugin has the following structure:\n\n```\nHeader\nTable of Contents\n1. Introduction\n2. Configuration\n3. Commands\n5. Settings\n6. Dictionaries\n7. Functions\n8. Mappings\n9. About\n```\n\nAll of these (except Header and Table of Contents) are optional and predicated\nupon the comment blocks existing in the right places in the file. You may\neliminate sections by omitting the comment blocks. You may add custom sections\nwith the @section directive.\n\n#### Header\nThe header is a simple line or two following the vim helpfile style guide. It\nlooks something like:\n\n    *myplugin*     My Plugin’s Tagline\n    author                                                *Stylized-Name*\n\n#### Table of Contents\nOf the form\n\n    =====================================================================\n    CONTENTS                                          *myplugin-contents*\n      1. Introduction                                    |myplugin-intro|\n      2. Configuration                                  |myplugin-config|\n      ...\n\nAnd so on for each section.\n\n#### Introduction\n\nThe introductory comment block is used to populate this section.\n\n#### Configuration\n\nThis section contains descriptions of all the flags and settings that were\nannotated by vimdoc comment blocks.\n\nAny global `let` command with a doc comment will automatically be detected as a\nsetting:\n\n    \"\"\n    \" Enable a thing.\n    let g:myplugin_enable_thing = 1\n\nYou can use the `@setting` block directive to declare settings vimdoc doesn't\nrecognize:\n\n    \"\"\n    \" @setting g:myplugin_secret_number\n    \" A secret number.\n    echo 'The number is' get(g:, 'myplugin_secret_number', b:changedtick)\n\n    \"\"\n    \" @setting b:myplugin_enable_thing\n    \" Enable a thing in the current buffer.\n\nMaktaba flags with doc comments are also automatically recognized:\n\n    \"\"\n    \" Supported things.\n    call s:plugin.Flag('things', ['a', 'b'])\n\n#### Commands\n\nContains a list of commands available to the user. Vimdoc understands -bang,\n-nargs, -range, -count, -register, and -buffer. (It ignores -bar.) It will\nparse out the arguments in the order that they are mentioned in the comment\nblock above the command and will generate a usage line for the command. For\nexample, the following comment block:\n\n    \"\"\n    \" Spawns two new zerglings from the given {hatchery}\n    \" Attacks all units in the selected [range] upon spawning.\n    \" [larva], if given, will be used to spawn the zerglings.\n    \" Otherwise a larva will be selected at random.\n    \" [!] forces the zerglings to spawn even if you don’t have enough\n    \" overlords. Caution: this may make your swarm uncontrollable.\n    command -range -bang -nargs=+ -bar SpawnZerglings\n        \\ call zerg#spawn(ZERGLINGS, '\u003cbang\u003e' == '!', \u003cf-args\u003e)\n\nwill generate the following usage line:\n\n    :[range]SpawnZerglings[!] {hatchery} [larva]\n\nYou can override the usage line with the @usage command, which takes a list of\narguments. Any arguments that look like vim variable names (\\I\\i+) will be\nassumed to be parameters, and their required-ness will be inferred from the\ndocs. You can force required-ness by providing arguments that look like vim\nvariables wrapped in curly (required) or square (optional) brackets. Empty\ncurly brackets stand in for the remainder of the inferred required variables.\nEmpty square brackets stand in for the remainder of the inferred optional\nvariables. For example:\n\n    \"\"\n    \" @usage {} [first] []\n    \" Start with {base}, add [second] to [first] and divide by [third].\n    command SomeCommand ...\n\ngenerates:\n\n    :SomeCommand {base} [first] [second] [third]\n\nFor more advanced usage, you may use the @command directive. This is useful\neither when your command takes a non-standard argument list (like :substitute)\nor when your command is not recognized by vimdoc (when you :execute 'command'\ns:name).\n\nThe @command directive takes one argument, which is the entire usage line. {}\nexpands to all of the inferred required parameters, [] to all of the inferred\noptional parameters, and \u003c\u003e to the complete inferred command name with built-in\nflags included. For example:\n\n    \"\"\n    \" @command \u003c\u003e/{pattern}/{string}/[flags] [count]\n    command -range -bang -nargs=1 Substitute ...\n\ngenerates the usage line:\n\n    :[range]Substitute[!]/{pattern}/{string}/[flags] [count]\n\nAn argument which may be given multiple times should be suffixed with an\nellipsis. For example, {arg...} documents an argument that may appear once or\nmore and [arg...] denotes an argument that may appear zero or more times.\n\n\nSometimes you want a command to have more than one usage. For that you may use\nmore than one usage directive. Example:\n\n    \"\"\n    \" @usage {list} {index} {item}\n    \" Add {item} to {list} at {index}.\n    \" @usage {dict} {key} {value}\n    \" Set {dict} {key} to {value}.\n    \" @all\n    \" WARNING: Will launch the nuclear missiles.\n\nThis will generate two docs for the command: one for list, one for dicts. An\n@all directive denotes that the remainder of the block will be included in all\nusages. In the above example, the warning will be included in both the list and\nthe dict version of the command docs.\n\n#### Dictionaries\n\nVimscript kinda-sorta supports object oriented programming via dictionaries\nwith functions attached. (See :help Dictionary-function.) Vimdoc helps you\ngroup these dictionaries and their methods in one place in the documentation.\n\nYou may describe a dictionary object type using the @dict annotation in\na comment block that is above a blank line. Then you may annotate the\ndictionary functions with the @dict directive to have them grouped with the\ndictionary description. (Such functions will not be listed in the functions\nsection.)\n\n#### Functions\n\nFunction documentation is very similar to command documentation.\n\nThe order of required parameters is inferred by looking at the function\ndeclaration.\n\nThe order of optional parameters is inferred by the order they are mentioned in\nthe comment block. Use the @usage command as described in the Command section\nto correct the order of optional arguments.\n\nFunctions may have multiple usages just like commands. Functions are not\nexposed in the help docs by default. Use @public to make them public by\ndefault.\n\n@function can be used to tell vimdoc about a non-obvious function (such as one\ncreated by :execute). (), {}, and [] expand as in @command.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogle%2Fvimdoc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgoogle%2Fvimdoc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogle%2Fvimdoc/lists"}