From cba03e1c2dcec6a51ce6a25c78f9cbc29befa400 Mon Sep 17 00:00:00 2001 From: Alisue Date: Sun, 4 Feb 2024 05:44:32 +0900 Subject: [PATCH 1/4] :memo: Rewrite documentation for denops v6 --- book.toml | 3 +- src/SUMMARY.md | 25 +- src/faq.md | 24 + src/getting-started/README.md | 68 + src/getting-started/explanation.md | 241 + src/getting-started/img/README-01.png | Bin 0 -> 12955 bytes .../adding-a-skelton-of-denops-plugin-1.png | Bin 22239 -> 0 bytes src/img/adding-an-api-1.png | Bin 20539 -> 0 bytes src/img/adding-an-api-2.png | Bin 106588 -> 0 bytes src/img/calling-vimneovim-features-1.png | Bin 20648 -> 0 bytes .../developing-more-applicative-plugin-2.png | Bin 34860 -> 0 bytes .../developing-more-applicative-plugin-3.png | Bin 34954 -> 0 bytes src/img/faq-1.png | Bin 0 -> 55333 bytes src/img/faq-2.png | Bin 0 -> 32340 bytes src/install.md | 115 +- src/introduction.md | 59 +- src/tutorial.md | 24 +- .../adding-a-skelton-of-denops-plugin.md | 26 - src/tutorial/adding-an-api.md | 43 - src/tutorial/calling-vimneovim-features.md | 42 - .../developing-more-applicative-plugin.md | 111 - src/tutorial/developing-your-first-plugin.md | 12 - src/tutorial/developing-your-next-plugins.md | 14 - src/tutorial/helloworld/README.md | 11 + src/tutorial/helloworld/adding-an-api.md | 44 + .../helloworld/calling-vim-features.md | 64 + .../creating-a-minimal-denops-plugin.md | 53 + .../creating-a-minimal-vim-plugin.md | 60 + .../helloworld/img/adding-an-api-01.png | Bin 0 -> 11220 bytes .../img/calling-vim-features-01.png | Bin 0 -> 13235 bytes .../creating-a-minimal-denops-plugin-01.png | Bin 0 -> 6517 bytes .../img/creating-a-minimal-vim-plugin-01.png | Bin 0 -> 9620 bytes src/tutorial/making-a-directory-tree.md | 29 - src/tutorial/maze/README.md | 15 + .../adjusting-maze-size-to-fit-the-window.md | 58 + .../maze/creating-applicative-plugin.md | 85 + .../img/fitting-maze-to-the-window-01.png | Bin 0 -> 16840 bytes .../img/outputting-content-to-buffer-01.png | Bin 0 -> 22645 bytes .../properly-create-a-virtual-buffer-01.png | Bin 0 -> 18546 bytes .../img/utilizing-third-party-library-01.png} | Bin .../maze/outputting-content-to-buffer.md | 31 + .../maze/properly-configured-the-buffer.md | 47 + .../maze/properly-create-a-virtual-buffer.md | 72 + .../maze/reduce-the-number-of-rpc-calls.md | 103 + .../maze/utilizing-denops-std-library.md | 90 + .../maze/utilizing-third-party-library.md | 101 + src/tutorial/preparing-deno-and-denops.md | 43 - src/tutorial/vimneovim-configuration.md | 19 - theme/highlight.js | 3902 +++++++++++++++++ 49 files changed, 5199 insertions(+), 435 deletions(-) create mode 100644 src/faq.md create mode 100644 src/getting-started/README.md create mode 100644 src/getting-started/explanation.md create mode 100644 src/getting-started/img/README-01.png delete mode 100644 src/img/adding-a-skelton-of-denops-plugin-1.png delete mode 100644 src/img/adding-an-api-1.png delete mode 100644 src/img/adding-an-api-2.png delete mode 100644 src/img/calling-vimneovim-features-1.png delete mode 100644 src/img/developing-more-applicative-plugin-2.png delete mode 100644 src/img/developing-more-applicative-plugin-3.png create mode 100644 src/img/faq-1.png create mode 100644 src/img/faq-2.png delete mode 100644 src/tutorial/adding-a-skelton-of-denops-plugin.md delete mode 100644 src/tutorial/adding-an-api.md delete mode 100644 src/tutorial/calling-vimneovim-features.md delete mode 100644 src/tutorial/developing-more-applicative-plugin.md delete mode 100644 src/tutorial/developing-your-first-plugin.md delete mode 100644 src/tutorial/developing-your-next-plugins.md create mode 100644 src/tutorial/helloworld/README.md create mode 100644 src/tutorial/helloworld/adding-an-api.md create mode 100644 src/tutorial/helloworld/calling-vim-features.md create mode 100644 src/tutorial/helloworld/creating-a-minimal-denops-plugin.md create mode 100644 src/tutorial/helloworld/creating-a-minimal-vim-plugin.md create mode 100644 src/tutorial/helloworld/img/adding-an-api-01.png create mode 100644 src/tutorial/helloworld/img/calling-vim-features-01.png create mode 100644 src/tutorial/helloworld/img/creating-a-minimal-denops-plugin-01.png create mode 100644 src/tutorial/helloworld/img/creating-a-minimal-vim-plugin-01.png delete mode 100644 src/tutorial/making-a-directory-tree.md create mode 100644 src/tutorial/maze/README.md create mode 100644 src/tutorial/maze/adjusting-maze-size-to-fit-the-window.md create mode 100644 src/tutorial/maze/creating-applicative-plugin.md create mode 100644 src/tutorial/maze/img/fitting-maze-to-the-window-01.png create mode 100644 src/tutorial/maze/img/outputting-content-to-buffer-01.png create mode 100644 src/tutorial/maze/img/properly-create-a-virtual-buffer-01.png rename src/{img/developing-more-applicative-plugin-1.png => tutorial/maze/img/utilizing-third-party-library-01.png} (100%) create mode 100644 src/tutorial/maze/outputting-content-to-buffer.md create mode 100644 src/tutorial/maze/properly-configured-the-buffer.md create mode 100644 src/tutorial/maze/properly-create-a-virtual-buffer.md create mode 100644 src/tutorial/maze/reduce-the-number-of-rpc-calls.md create mode 100644 src/tutorial/maze/utilizing-denops-std-library.md create mode 100644 src/tutorial/maze/utilizing-third-party-library.md delete mode 100644 src/tutorial/preparing-deno-and-denops.md delete mode 100644 src/tutorial/vimneovim-configuration.md create mode 100644 theme/highlight.js diff --git a/book.toml b/book.toml index 0cddb7c..93641a5 100644 --- a/book.toml +++ b/book.toml @@ -5,5 +5,4 @@ multilingual = false src = "src" title = "Denops Documentation" -[preprocessor.plantuml] -plantuml-cmd="http://www.plantuml.com/plantuml" +[preprocessor.alerts] diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 56be2d9..154fcdd 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -3,13 +3,18 @@ [Introduction](./introduction.md) - [Install](./install.md) -- [Tutorial](./tutorial.md) - - [Preparing Deno and Denops](./tutorial/preparing-deno-and-denops.md) - - [Developing Your First Plugin](./tutorial/developing-your-first-plugin.md) - - [Vim/Neovim Configuration](./tutorial/vimneovim-configuration.md) - - [Making a Plugin Directory Tree](./tutorial/making-a-directory-tree.md) - - [Adding a Skelton of Denops Plugin](./tutorial/adding-a-skelton-of-denops-plugin.md) - - [Adding an API](./tutorial/adding-an-api.md) - - [Calling Vim/Neovim Features](./tutorial/calling-vimneovim-features.md) - - [Developing More Applicative Plugin](./tutorial/developing-more-applicative-plugin.md) - - [Developing Your Next Plugins](./tutorial/developing-your-next-plugins.md) +- [Getting Started](./getting-started/README.md) + - [Explanation of the Getting started](./getting-started/explanation.md) +- [Tutorial (Hello world)](./tutorial/helloworld/README.md) + - [Creating a minimal Vim plugin](./tutorial/helloworld/creating-a-minimal-vim-plugin.md) + - [Creating a minimal Denops plugin](./tutorial/helloworld/creating-a-minimal-denops-plugin.md) + - [Adding Denops APIs](./tutorial/helloworld/adding-an-api.md) + - [Calling Vim features](./tutorial/helloworld/calling-vim-features.md) +- [Tutorial (Maze)](./tutorial/maze/README.md) + - [Utilizing third-party library](./tutorial/maze/utilizing-third-party-library.md) + - [Outputting content to buffer](./tutorial/maze/outputting-content-to-buffer.md) + - [Adjusting maze size to fit the window](./tutorial/maze/adjusting-maze-size-to-fit-the-window.md) + - [Properly create a virtual buffer](./tutorial/maze/properly-create-a-virtual-buffer.md) + - [Properly configured the buffer](./tutorial/maze/properly-configured-the-buffer.md) + - [Reduce the number of RPC calls](./tutorial/maze/reduce-the-number-of-rpc-calls.md) +- [FAQ](./faq.md) diff --git a/src/faq.md b/src/faq.md new file mode 100644 index 0000000..b61009a --- /dev/null +++ b/src/faq.md @@ -0,0 +1,24 @@ +# FAQ + +## How to Check Denops Startup Time + +To check the startup time of Denops or Denops plugins, utilize +[denops-startup-recorder]. This plugin visualizes the timing of events related +to Denops and Denops plugin startup. + +[denops-startup-recorder]: https://github.com/vim-denops/denops-startup-recorder.vim + +It shows the result in echo area like: + +![](./img/faq-1.png) + +## How to Check Denops Performance + +To assess Denops performance, employ [denops-benchmark]. This plugin measures +the number of operations or characters that can be processed in milliseconds. + +[denops-benchmark]: https://github.com/vim-denops/denops-benchmark.vim + +It shows the result in a buffer like: + +![](./img/faq-2.png) diff --git a/src/getting-started/README.md b/src/getting-started/README.md new file mode 100644 index 0000000..a092f6b --- /dev/null +++ b/src/getting-started/README.md @@ -0,0 +1,68 @@ +# Getting Started + +[Denops] ([/ˈdiːnoʊps/](http://ipa-reader.xyz/?text=%CB%88di%CB%90no%CA%8Aps), +pronounced `dee-nops`) is an ecosystem for [Vim] / [Neovim] that empowers +developers to write plugins in [TypeScript] / [JavaScript] powered by [Deno]. + +Let's start by creating a simple plugin to learn how to develop Denops plugins. + +## Create a Plugin + +Create a directory named `denops-getting-started` in your home directory and a +file named `main.ts` within it, under `denops/denops-getting-started/`: + +``` +$HOME +└── denops-getting-started + └── denops + └── denops-getting-started + └── main.ts +``` + +Next, write the following TypeScript code in `main.ts`: + +```typescript +import type { Denops } from "https://deno.land/x/denops_std@v6.0.0/mod.ts"; + +export function main(denops: Denops): void { + denops.dispatcher = { + async hello() { + await denops.cmd(`echo "Hello, Denops!"`); + }, + }; +} +``` + +## Activate the Plugin + +Add the following line to your Vim or Neovim configuration file (e.g., +`~/.vimrc` or `~/.config/nvim/init.vim`): + +```vim +set runtimepath+=~/denops-getting-started +``` + +Or Neovim Lua configuration file (e.g., `~/.config/nvim/init.lua`): + +```lua +vim.opt.runtimepath:append("~/denops-getting-started") +``` + +## Try the Plugin + +Restart Vim/Neovim and execute the following command: + +```vim +:call denops#request('denops-getting-started', 'hello', []) +``` + +You should see "Hello, Denops!" displayed on the screen like: + +![](./img/README-01.png) + +[Denops]: https://github.com/vim-denops/denops.vim +[Vim]: https://www.vim.org/ +[Neovim]: https://neovim.io/ +[TypeScript]: https://www.typescriptlang.org/ +[JavaScript]: https://developer.mozilla.org/en-US/docs/Web/JavaScript +[Deno]: https://deno.land/ diff --git a/src/getting-started/explanation.md b/src/getting-started/explanation.md new file mode 100644 index 0000000..2655ffd --- /dev/null +++ b/src/getting-started/explanation.md @@ -0,0 +1,241 @@ +# Explanation of the Getting Started + +In this section, we'll provide detailed information about the Getting Started. +If you find it too detailed, feel free to skip this section and move on to the +next chapter, especially if your goal is to start developing a Denops plugin +promptly. + +## What is Denops? + +Denops claims to be an ecosystem for developing Vim / Neovim (hereafter, when we +refer to Vim without restriction, we also include Neovim) plugins using Deno, +but, in reality, it is a Vim plugin with the following features: + +- Detection and registration of Denops plugins +- Launching and connecting to Deno processes +- Calling Deno process-side functions from Vim via RPC (Remote Procedure Call) +- Calling Vim features from Deno process-side via RPC + +By utilizing this plugin, you can control Vim from code written in TypeScript +(Denops plugins). + +> [!NOTE] +> +> [RPC (Remote Procedure Call)](https://en.wikipedia.org/wiki/Remote_procedure_call) +> is used, and while Vim uses a +> [JSON-based custom specification](https://vim-jp.org/vimdoc-en/channel.html#channel-use), +> Neovim uses [MessagePack-RPC](https://github.com/msgpack-rpc/msgpack-rpc) (a +> slightly modified specification). However, Denops abstracts away these +> differences, so Denops plugin developers don't need to be aware of the RPC +> specification differences between Vim and Neovim. + +## What is a Vim Plugin? + +When Vim starts, it searches for files named `plugin/*.vim` in directories +specified in `runtimepath`. Additionally, if a function like `foo#bar#hoge()` is +called, it searches for files named `autoload/foo/bar.vim` in the `runtimepath` +and reads the file, calling the `foo#bar#hoge()` function defined within. + +A Vim plugin is a set of predefined features provided to users, utilizing the +functionality mentioned above. Typically, an entry point is defined in +`plugin/{plugin_name}.vim`, and detailed features are implemented in +`autoload/{plugin_name}.vim` or `autoload/{plugin_name}/*.vim`. For example, +here is the directory structure for a Vim plugin named `hello`: + +``` +vim-hello +├── autoload +│ └── hello.vim # Defines the function `hello#hello()` +└── plugin + └── hello.vim # Defines the `Hello` command +``` + +> [!NOTE] +> +> For more detailed information on creating Vim plugins, refer to +> `:help write-plugin`. + +## What is a Denops Plugin? + +When Denops is installed, in addition to Vim plugins, files named +`denops/*/main.ts` are also searched when Vim starts. If a corresponding file is +found, Denops registers the parent directory name (`foo` in the case of +`denops/foo/main.ts`) as the plugin name. Then, it imports the corresponding +file as a TypeScript module and calls the function named `main`. + +A Denops plugin, similar to a Vim plugin, provides a set of features written in +TypeScript to users. Since Denops plugins typically include both TypeScript and +Vim script code, the directory structure looks like an extension of the Vim +plugin structure with an added `denops` directory. For example, here is the +directory structure for a Denops plugin named `hello`: + +``` +denops-hello +├── autoload +│ └── hello.vim # Tasks better written in Vim script (may not exist) +├── denops +│ └── hello +│ └── main.ts # Entry point for the Denops plugin (mandatory) +└── plugin + └── hello.vim # Entry point written in Vim script (optional) +``` + +In the Getting Started, we created a file named +`denops/denops-getting-started/main.ts` and added its parent directory +(`denops-getting-started`) to `runtimepath`. There were no `autoload` or +`plugin` directories because we didn't provide an entry point that Vim could +easily call. + +## Understanding the Code in Getting Started + +In the Getting Started, we wrote the following code in the `main.ts` file: + +```typescript +import type { Denops } from "https://deno.land/x/denops_std@v6.0.0/mod.ts"; + +export function main(denops: Denops): void { + denops.dispatcher = { + async hello() { + await denops.cmd(`echo "Hello, Denops!"`); + }, + }; +} +``` + +Let's break down this code step by step. + +### About Imports + +```typescript +import type { Denops } from "https://deno.land/x/denops_std@v6.0.0/mod.ts"; +``` + +The first line imports the `Denops` type from the [denops_std] standard library. +You can find detailed information about the library by checking the URL: +`https://deno.land/x/denops_std@v6.0.0` (remove `/mod.ts`). We fixed the version +in the import URL, so it's recommended to check for details and update to the +latest version URL. + +Note that we use `import type` syntax, which is part of TypeScript's +[Type-Only Imports and Export](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). +This syntax can be written as `import { type Denops }` with the same meaning. +Using `import { Denops }` for a type-only import is also valid. + +> [!NOTE] +> +> Denops plugins are dynamically imported, so there might be differences in +> Denops versions between development and usage. Therefore, to minimize +> differences between Denops versions, only the `Denops` type information is +> exposed. The implementation can be found in +> [`denops/@denops-private/denops.ts`](https://github.com/vim-denops/denops.vim/blob/main/denops/%40denops-private/denops.ts), +> but it is not publicly exposed for the reasons mentioned above. +> +> This type information is provided by [denops_core], and [denops_std] simply +> re-exports the type information from [denops_core]. However, [denops_core] is +> intended to be referenced only by [denops.vim] and [denops_std], so Denops +> plugin developers don't need to use it directly. + +### About Entry Point + +```typescript +export function main(denops: Denops): void { + // Omitted... +} +``` + +The above code exports the `main` function. The `main` function is called by +Denops, and it takes the +[Denops instance](https://deno.land/x/denops_std/mod.ts?s=Denops) (`denops`) as +an argument. Denops plugins use this `denops` to add user-defined APIs or call +Vim's features. + +### About User-Defined APIs + +```typescript +denops.dispatcher = { + async hello() { + // Omitted... + }, +}; +``` + +The code above adds a user-defined API named `hello` to `denops.dispatcher`. +`denops.dispatcher` is defined as follows, and each method takes `unknown` types +for both arguments and return values: + +```typescript +interface Dispatcher { + [key: string]: (...args: unknown[]) => unknown; +} +``` + +By defining methods in `denops.dispatcher`, you can freely define APIs. Since +the methods registered in `denops.dispatcher` are always called with `await`, +you can make them asynchronous by returning a `Promise`. + +The methods defined in `denops.dispatcher` can be called from Vim using the +following functions: + +| Function | Description | +| ---------------------- | -------------------------------------------------------------------------------- | +| `denops#request` | Synchronously calls a user-defined API and returns the result. | +| `denops#request_async` | Asynchronously calls a user-defined API and passes the result to callbacks. | +| `denops#notify` | Calls a user-defined API without waiting for completion and discards the result. | + +At the end of the Getting Started, we used +`denops#request('denops-getting-started', 'hello', [])` to call the user-defined +API named `hello` in `denops-getting-started` plugin. + +### About Calling Vim's features + +```typescript +await denops.cmd(`echo "Hello, Denops!"`); +``` + +With the received `denops`, you can call Vim functions, execute Vim commands, or +evaluate Vim expressions. In the example above, the `hello` API internally uses +`denops.cmd` to execute the `echo` command in Vim. The `denops` object provides +several methods: + +| Method | Description | +| ---------- | ---------------------------------------------------------------------------------------------------------- | +| `call` | Calls a Vim function and returns the result. | +| `batch` | Calls multiple Vim functions in bulk and returns the results in bulk. | +| `cmd` | Executes a Vim command. If `ctx` is provided, it is expanded as local variables. | +| `eval` | Evaluate a Vim expression and returns the result. If `ctx` is provided, it is expanded as local variables. | +| `dispatch` | Calls a user-defined API of another Denops plugin and returns the result. | + +Although `denops` provides low-level interfaces, [denops_std] combines these +low-level interfaces to offer higher-level interfaces. Therefore, it's +recommended to use [denops_std] to call Vim's features in actual plugin +development. + +For example, use +[`function` module](https://deno.land/x/denops_std@v6.0.0/function/mod.ts) to +call Vim's function instead of `denops.call` like: + +```typescript +import * as fn from "https://deno.land/x/denops_std@v6.0.0/function/mod.ts"; + +// Bad (result1 is `unknown`) +const result1 = await denops.call("expand", "%"); + +// Good (result2 is `string`) +const result2 = await fn.expand(denops, "%"); +``` + +If developers use `function` module instead, they can benefit from features like +auto-completion and type checking provided by LSP (Language Server Protocol). + +## Next Steps + +In the next step, follow the tutorial to learn how to develop a minimum Denops +plugin. + +- [Tutorial (Hello World)](../tutorial/helloworld/README.md) +- [Tutorial (Maze)](../tutorial/maze/README.md) +- [API reference](https://deno.land/x/denops_std/mod.ts) + +[denops.vim]: https://github.com/vim-denops/denops.vim +[denops_std]: https://deno.land/x/denops_std +[denops_core]: https://deno.land/x/denops_core diff --git a/src/getting-started/img/README-01.png b/src/getting-started/img/README-01.png new file mode 100644 index 0000000000000000000000000000000000000000..20282074f244f951713b7c86342e57176f90b1d9 GIT binary patch literal 12955 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 diff --git a/src/img/adding-an-api-2.png b/src/img/adding-an-api-2.png deleted file mode 100644 index 56c0039967ceee40961c620028018ab2e138af58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106588 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 LMTt_e_W}P8?n#D6 diff --git a/src/img/calling-vimneovim-features-1.png b/src/img/calling-vimneovim-features-1.png deleted file mode 100644 index 6175246e96b29f47a5e8200f76d1826dcd79beef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20648 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%0D$?A7 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 literal 0 HcmV?d00001 diff --git a/src/img/faq-2.png b/src/img/faq-2.png new file mode 100644 index 0000000000000000000000000000000000000000..be65513d78edba0fe3996b31e9e653ec3e622b4b GIT binary patch literal 32340 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 8.1.2424 or [Neovim][Neovim] >= 0.4.4 -- [Deno][Deno] >= 1.11.0 +Denops requires [Deno] to be installed on your system. Please refer to +[Deno's official manual](https://docs.deno.com/runtime/manual#install-deno) for +installation instructions. -Make sure `deno` command is executable from your Vim/Neovim by: - -``` -:echo exepath('deno') -``` - -It would show an executable path of `deno` command. If nothing is shown, make -sure the `$PATH` is correct in your Vim/Neovim. - -Use `g:denops#deno` if you'd like to specify deno executable manually like: +After installing Deno, ensure that the `deno` command is accessible from your +Vim. ```vim -let g:denops#deno = '/opt/deno/bin/deno' +:echo execpath("deno") ``` -[vim]: https://www.vim.org/ -[neovim]: https://neovim.io/ -[deno]: https://deno.land/ +It should display the path to the `deno` command. If it prints an empty string, +add the path to the `deno` command to your `PATH` environment variable. -## Install +> [!TIP] +> +> If you prefer not to modify the `PATH` environment variable, you can set the +> executable path to the `g:denops#deno` variable in your `vimrc` file like +> this: +> +> ```vim +> let g:denops#deno = "/path/to/deno" +> ``` -Denops must be installed in a `runtimepath`, like a general Vim plugin. Install -it with your favorite Vim plugin managers like: +[Deno]: https://deno.land/ -### By [vim-plug][vim-plug] +## Installation -Add `vim-denops/denops.vim` like: +Denops itself is a Vim plugin and can be installed using a Vim plugin manager, +similar to other Vim plugins. -``` +##### [vim-plug](https://github.com/junegunn/vim-plug) + +```vim Plug 'vim-denops/denops.vim' ``` -Then execute `:PlugInstall` to install. - -[vim-plug]: https://github.com/junegunn/vim-plug +##### [Jetpack.vim](https://github.com/tani/vim-jetpack) -### By [minpac][minpac] - -Add `vim-denops/denops.vim` like: - -``` -call minpac#add('vim-denops/denops.vim') +```vim +Jetpack 'vim-denops/denops.vim' ``` -Then execute `:call minpac#update()` to install. - -[minpac]: https://github.com/k-takata/minpac +##### [dein.vim](https://github.com/Shougo/dein.vim) -### By [dein.vim][dein.vim] +```vim +call dein#add('vim-denops/denops.vim') +``` -Add `vim-denops/denops.vim` like: +##### [minpac](https://github.com/k-takata/minpac) -``` -call dein#add('vim-denops/denops.vim') +```vim +call minpac#add('vim-denops/denops.vim') ``` -Then execute `:call dein#install()` to install. +##### [lazy.nvim](https://github.com/folke/lazy.nvim) -[dein.vim]: https://github.com/Shougo/dein.vim +```lua +require("lazy").setup({ + "vim-denops/denops.vim", + -- ... +}) +``` -## Check health +## Health Check -Denops support `:checkheath` (Neovim) or `:CheckHealth` (Vim with -[vim-healthcheck][vim-healthcheck]) to check denops health like: +Denops provides a health checker to confirm that Denops is installed correctly. +You can check the health of Denops by running the `:checkhealth` command +(Neovim) or `:CheckHealth` (Vim with [vim-healthcheck]). ``` -health#denops#check -======================================================================== - - INFO: Supported Deno version: `1.11.0` - - INFO: Detected Deno version: `1.11.5` - - OK: Deno version check: passed - - INFO: Supported Neovim version: `0.4.4` - - INFO: Detected Neovim version: `0.5.0` - - OK: Neovim version check: passed - - INFO: Denops status: `running` - - OK: Denops status check: passed +============================================================================== +denops: health#denops#check + +- Supported Deno version: `1.38.5` +- Detected Deno version: `1.39.4` +- OK Deno version check: passed +- Supported Neovim version: `0.9.4` +- Detected Neovim version: `0.9.5` +- OK Neovim version check: passed +- Denops status: `running` +- OK Denops status check: passed ``` -Execute those commands to investigate why denops does not work. - [vim-healthcheck]: https://github.com/rhysd/vim-healthcheck diff --git a/src/introduction.md b/src/introduction.md index 3804157..0afa18c 100644 --- a/src/introduction.md +++ b/src/introduction.md @@ -1,19 +1,48 @@ -# Denops +# Introduction -

- -

+
+Denops Mascot +
-[Denops][Denops] is an ecosystem of Vim/Neovim which allows developers to write -plugins in [Deno][Deno]. It has the following features: +**[Denops]** +([/ˈdiːnoʊps/](http://ipa-reader.xyz/?text=%CB%88di%CB%90no%CA%8Aps), pronounced +as `dee-nops`) is an ecosystem designed for developing plugins for [Vim] and +[Neovim] using [Deno] (a [TypeScript] / [JavaScript] runtime). -- Same code can be used in both Vim and Neovim -- Can be installed as a Vim plugin -- Deno uses V8 engine which is much faster than Vim script -- User don't need to manage library dependencies -- Denops runs as a separate process, so Vim won't freeze -- Each plugin work on its own thread, so that there is less chance of - interference +Denops and Denops plugins (Vim plugins powered by Denops) offer the following +features: -[deno]: https://deno.land -[denops]: https://github.com/vim-denops/denops.vim +- **Installable as a Vim plugin**:
Denops follows the standard Vim plugin + architecture. Users can install Denops itself and Denops plugins using a Vim + plugin manager, just like any other Vim plugins. +- **Unified codebase for Vim and Neovim**:
Denops provides a unified API for + both Vim and Neovim. You can write a plugin that functions on both Vim and + Neovim with a single codebase. +- **No worries about dependency management**:
Deno includes a built-in + dependency management system, allowing developers to write plugins with + third-party libraries without concerns about dependency management. +- **Simple and efficient code**:
Deno utilizes the V8 engine, significantly + faster than Vim script. You can write a plugin with straightforward code, + without the need for complex optimizations solely for performance. +- **Risk-free execution**:
Denops plugins run in a separate process from Vim + / Neovim. Even if a plugin freezes, Vim / Neovim remains unaffected. + +Check out [vim-denops](https://github.com/topics/vim-denops) GitHub Topics to +discover Vim plugins using Denops. + +Denops is primarily developed and maintained by the [vim-denops] organization +(separated from the [vim-jp] organization). For questions, you can use +[GitHub Discussions](https://github.com/orgs/vim-denops/discussions) (English), +or visit the [#tech-denops](https://vim-jp.slack.com/archives/C01N4L5362D) +channel on +[Slack workspace for vim-jp](https://join.slack.com/t/vim-jp/shared_invite/zt-zcifn2id-e6EsDjIKEzx~UlF~hE2Njg) +(Japanese). + +[Denops]: https://github.com/vim-denops/denops.vim +[Vim]: https://www.vim.org/ +[Neovim]: https://neovim.io/ +[TypeScript]: https://www.typescriptlang.org/ +[JavaScript]: https://developer.mozilla.org/en-US/docs/Web/JavaScript +[Deno]: https://deno.land/ +[vim-jp]: https://github.com/vim-jp +[vim-denops]: https://github.com/vim-denops diff --git a/src/tutorial.md b/src/tutorial.md index f6a35cc..f4fc703 100644 --- a/src/tutorial.md +++ b/src/tutorial.md @@ -6,10 +6,10 @@ This article is a tutorial on developing Denops plugins. In this tutorial, we use the following software and version as of writing. -- [denops.vim v1.0.0](https://github.com/vim-denops/denops.vim/releases/tag/v1.0.0) - (2021-07-19) -- [denops_std v1.0.0](https://github.com/vim-denops/deno-denops-std/releases/tag/v1.0.0) - (2021-07-19) +- [denops.vim v6.0.0](https://github.com/vim-denops/denops.vim/releases/tag/v6.0.0) + (2024-02-03) +- [denops_std v6.0.0](https://github.com/vim-denops/deno-denops-std/releases/tag/v6.0.0) + (2024-02-03) [vim-jp]: https://vim-jp.org/ [denops.vim]: https://github.com/vim-denops/denops.vim @@ -17,11 +17,11 @@ In this tutorial, we use the following software and version as of writing. ## Glossary -| Term | Meaning | -| ------------------------ | -------------------------------------------------------------------------- | -| vim | Vim or Neovim. | -| vim plugin | Vim plugin or Neovim plugin. | -| [Deno][deno] | A JavaScript and TypeScript runtime. | -| [Denops][denops.vim] | An ecosystem for vim plugins based on Deno runtime. | -| Denops plugin | A vim plugin that works on both Vim and Neovim and is written with Denops. | -| [denops.vim][denops.vim] | The name of the vim plugin to introduce Denops into vim. | +| Term | Meaning | +| ------------- | -------------------------------------------------------------------------- | +| Vim | Vim or Neovim. | +| Vim plugin | Vim plugin or Neovim plugin. | +| [Deno] | A JavaScript and TypeScript runtime. | +| Denops | An ecosystem for vim plugins based on Deno runtime. | +| Denops plugin | A vim plugin that works on both Vim and Neovim and is written with Denops. | +| [denops.vim] | The name of the vim plugin to introduce Denops into vim. | diff --git a/src/tutorial/adding-a-skelton-of-denops-plugin.md b/src/tutorial/adding-a-skelton-of-denops-plugin.md deleted file mode 100644 index 8e9ec5f..0000000 --- a/src/tutorial/adding-a-skelton-of-denops-plugin.md +++ /dev/null @@ -1,26 +0,0 @@ -# Adding a Skelton of Denops Plugin - -Once a Denops plugin is loaded, Denops calls the `main` function exported from -`main.ts` of the plugin code. So initially you can write `main.ts` like: - -```ts:main.ts -import { Denops } from "https://deno.land/x/denops_std@v1.0.0/mod.ts"; - -export async function main(denops: Denops): Promise { - // Plugin program starts from here - console.log("Hello Denops!"); -}; -``` - -An argument `denops` is passed to the `main` function, where `denops` is an -instance of `Denops` class exported from [denops-std][denops-std]. - -Then you restart vim, and you can see a message `[denops] Hello Denops!` on the -vim window. - -![](../img/adding-a-skelton-of-denops-plugin-1.png) - -[denops-std]: https://deno.land/x/denops_std - -If you are too lazy to restart vim, you can simply run -`:call denops#server#restart()` on vim to reload Denops only. diff --git a/src/tutorial/adding-an-api.md b/src/tutorial/adding-an-api.md deleted file mode 100644 index fc7a38f..0000000 --- a/src/tutorial/adding-an-api.md +++ /dev/null @@ -1,43 +0,0 @@ -# Adding an API - -Each Denops plugin registers one or more functions as APIs to Denops. First, try -to write an `echo()` function that returns a given string and register it as an -API. You can rewrite `main.ts` as follows: - -```ts:main.ts -import { Denops } from "https://deno.land/x/denops_std@v1.0.0/mod.ts"; -import { ensureString } from "https://deno.land/x/unknownutil@v0.1.1/mod.ts"; - -export async function main(denops: Denops): Promise { - denops.dispatcher = { - async echo(text: unknown): Promise { - // assure `text` is string type. - ensureString(text); - return await Promise.resolve(text); - }, - }; -}; -``` - -Note that you can register a function that satisfies the following as an API: - -- All of its arguments must be of type `unknown`. -- The type of its return value must be either `Promise` or - `Promise`. - -Thus an `echo` API is registered to the `helloworld` plugin. To call an API, you -can use a vim command of the form `denops#request({plugin}, {func}, {args})`. So -you can use the `echo` API to execute the command below after restarting vim: - -```vim -:echo denops#request('helloworld', 'echo', ["Hello Denops!"]) -``` - -If it goes well, you will see `Hello Denops!`. - -![](../img/adding-an-api-1.png) - -If a non-string argument is passed to the `echo` API, such as -`denops#request('helloworld', 'echo', [123])`, Denops will raise an error: - -![](../img/adding-an-api-2.png) diff --git a/src/tutorial/calling-vimneovim-features.md b/src/tutorial/calling-vimneovim-features.md deleted file mode 100644 index c20e37e..0000000 --- a/src/tutorial/calling-vimneovim-features.md +++ /dev/null @@ -1,42 +0,0 @@ -# Calling Vim/Neovim Features - -If you want to use a vim feature from your Denops plugin, you can call it via -the `denops` instance passed to the plugin's `main` function. You can rewrite -`main.ts` like below to register the `echo` API as a vim command: - -```ts:main.ts -import { Denops } from "https://deno.land/x/denops_std@v1.0.0/mod.ts"; -import { execute } from "https://deno.land/x/denops_std@v1.0.0/helper/mod.ts"; -import { ensureString } from "https://deno.land/x/unknownutil@v0.1.1/mod.ts"; - -export async function main(denops: Denops): Promise { - denops.dispatcher = { - async echo(text: unknown): Promise { - ensureString(text); - return await Promise.resolve(text); - }, - }; - - await execute( - denops, - `command! -nargs=1 HelloWorldEcho echomsg denops#request('${denops.name}', 'echo', [])`, - ); -}; -``` - -The helper function `execute()` receives a multiline string and executes it as a -Vim script, where `denops.name` represents the name of the running plugin -itself. Once vim is restarted, the `HelloWorldEcho` command will be registered. -Then you can run: - -```vim -:HelloWorldEcho Hello Vim! -``` - -If the plugin has been registered successfully, you will see `Hello Vim!` as a -result. - -![](../img/calling-vimneovim-features-1.png) - -If you want to learn more details on `denops` API, you can refer to -[denops-std API document](https://doc.deno.land/https/deno.land/x/denops_std/mod.ts#Denops). diff --git a/src/tutorial/developing-more-applicative-plugin.md b/src/tutorial/developing-more-applicative-plugin.md deleted file mode 100644 index b23be8b..0000000 --- a/src/tutorial/developing-more-applicative-plugin.md +++ /dev/null @@ -1,111 +0,0 @@ -# Developing More Applicative Plugin - -Now you have learned the basics of developing Denpos plugins in the previous -sections. Then it would be best if you tried to create a more functional plugin. - -So let me ask you, out of the blue, have you ever itched to solve mazes while -programming? I never have. In any case, there may be people who love solving -mazes and can't get enough of it. So let's try to develop a Denops plugin that -can generate and display a maze in vim at any time. - -Of course, it would be nice to start by coding a maze generation algorithm. -However, you are now with Deno so that you can use a third-party library -[maze_generator](https://deno.land/x/maze_generator@v0.4.0) for your -convenience. First, you should define a `Maze` command similarly to -`HelloWorldEcho`; `Maze` generates a maze and outputs it with `console.log()`. - -```ts:main.ts -import { Denops } from "https://deno.land/x/denops_std@v1.0.0/mod.ts"; -import { Maze } from "https://deno.land/x/maze_generator@v0.4.0/mod.js"; - -export async function main(denops: Denops): Promise { - denops.dispatcher = { - async maze(): Promise { - const maze = new Maze({}).generate(); - const content = maze.getString(); - console.log(content); - }, - }; - - await denops.cmd(`command! Maze call denops#request('${denops.name}', 'maze', [])`); -}; -``` - -Restarting vim, and you will see a maze by commands: - -```vim -:Maze -:mes -``` - -![](../img/developing-more-applicative-plugin-1.png) - -Well done! But it is a little boring... So let's try to modify the code to make -a generated maze output to a buffer. - -```ts:main.ts -import { Denops } from "https://deno.land/x/denops_std@v1.0.0/mod.ts"; -import { Maze } from "https://deno.land/x/maze_generator@v0.4.0/mod.js"; - -export async function main(denops: Denops): Promise { - denops.dispatcher = { - async maze(): Promise { - const maze = new Maze({}).generate(); - const content = maze.getString(); - await denops.cmd("enew"); - await denops.call("setline", 1, content.split(/\n/)); - }, - }; - - await denops.cmd(`command! Maze call denops#request('${denops.name}', 'maze', [])`); -}; -``` - -In this code, `denops.cmd()` executes the vim command `enew` to open a new -buffer in the current window and then `denops.call()` calls the vim function -`setline()` to write the maze to the buffer. Restart vim, rerun the commands, -and then you can see: - -![](../img/developing-more-applicative-plugin-2.png) - -Awesome! Even if it looks like enough, you can improve your code a bit more. -Here is an example of a modification so that the `Maze` command can receive a -vim command other than `enew`, make a produced maze fit the current display -area, etc.: - -```ts:main.ts -import { Denops } from "https://deno.land/x/denops_std@v1.0.0/mod.ts"; -import { execute } from "https://deno.land/x/denops_std@v1.0.0/helper/mod.ts"; -import { Maze } from "https://deno.land/x/maze_generator@v0.4.0/mod.js"; -import { ensureString } from "https://deno.land/x/unknownutil@v0.1.1/mod.ts"; - -export async function main(denops: Denops): Promise { - denops.dispatcher = { - async maze(opener: unknown): Promise { - ensureString(opener); - const [xSize, ySize] = (await denops.eval("[&columns, &lines]")) as [ - number, - number - ]; - const maze = new Maze({ - xSize: xSize / 3, - ySize: ySize / 3, - }).generate(); - const content = maze.getString(); - await denops.cmd(opener || "new"); - await denops.call("setline", 1, content.split(/\r?\n/g)); - await execute(denops, ` - setlocal bufhidden=wipe buftype=nofile - setlocal nobackup noswapfile - setlocal nomodified nomodifiable - `); - }, - }; - - await denops.cmd(`command! -nargs=? -bar Maze call denops#request('${denops.name}', 'maze', [])`); -}; -``` - -Now you can see a smaller maze shown on the window. - -![](../img/developing-more-applicative-plugin-3.png) diff --git a/src/tutorial/developing-your-first-plugin.md b/src/tutorial/developing-your-first-plugin.md deleted file mode 100644 index cd7057e..0000000 --- a/src/tutorial/developing-your-first-plugin.md +++ /dev/null @@ -1,12 +0,0 @@ -# Developing Your First Plugin - -Now you are ready to write a Denops plugin. It would be better to start by -developing a small plugin. So we will name the plugin `helloworld` and place it -under `~/dps-helloworld`. - -- [Vim/Neovim Configuration](./vimneovim-configuration.md) -- [Making a Plugin Directory Tree](./making-a-directory-tree.md) -- [Adding a Skelton of Denops Plugin](./adding-a-skelton-of-denops-plugin.md) -- [Adding an API](./adding-an-api.md) -- [Calling Vim/Neovim Features](./calling-vimneovim-features.md) -- [Developing More Applicative Plugin](./developing-more-applicative-plugin.md) diff --git a/src/tutorial/developing-your-next-plugins.md b/src/tutorial/developing-your-next-plugins.md deleted file mode 100644 index 1b20b1c..0000000 --- a/src/tutorial/developing-your-next-plugins.md +++ /dev/null @@ -1,14 +0,0 @@ -# Developing Your Next Plugins - -How do you feel about Denops plugin development? I think you could understand -that you can create Vim/Neovim plugins with Denops so easily. Denops is a -fantastic portable ecosystem for Vim/Neovim plugins, though it is going under -development. If you are interested in creating Denops plugins, this tutorial and -the following documents will help you. - -- [denops-std API Document](https://doc.deno.land/https/deno.land/x/denops_std/mod.ts) -- [denops Sample Project](https://github.com/vim-denops/denops-helloworld.vim) -- [denops Developer's Channel (vim-jp - Slack)](https://vim-jp.slack.com/archives/C01N4L5362D) - -We are looking forward to your feedback and contributions to our development. 🙇 diff --git a/src/tutorial/helloworld/README.md b/src/tutorial/helloworld/README.md new file mode 100644 index 0000000..3ad9983 --- /dev/null +++ b/src/tutorial/helloworld/README.md @@ -0,0 +1,11 @@ +# Tutorial: Hello World + +In this chapter, we will create a minimal Denops plugin that greets the user. +Most of the code resembles the previous +[Getting Started](../../getting-started/index.html), so feel free to skip this +chapter if you are already familiar with it. + +> [!NOTE] +> +> The plugin we will create in this section can be found at +> [https://github.com/vim-denops/denops-helloworld.vim](https://github.com/vim-denops/denops-helloworld.vim) diff --git a/src/tutorial/helloworld/adding-an-api.md b/src/tutorial/helloworld/adding-an-api.md new file mode 100644 index 0000000..d0b5695 --- /dev/null +++ b/src/tutorial/helloworld/adding-an-api.md @@ -0,0 +1,44 @@ +# Adding Denops API to the Plugin + +In the previous section, we created a minimal Denops plugin. In this section, we +will enhance the plugin by adding an API. + +Open `denops/denops-helloworld/main.ts` and rewrite the content with the +following code: + +```typescript:denops/denops-helloworld/main.ts +import type { Denops } from "https://deno.land/x/denops_std@v6.0.0/mod.ts"; +import { assert, is } from "https://deno.land/x/unknownutil@v3.14.1/mod.ts"; + +export function main(denops: Denops): void { + denops.dispatcher = { + hello(name) { + assert(name, is.String); + return `Hello, ${name || "Denops"}!`; + }, + }; +} +``` + +The above code adds a new API `hello` to the plugin. The `hello` API takes a +string `name` and returns a greeting message. See +[About User-Defined APIs in Explanation of the Getting started](../../getting-started/explanation.md#about-user-defined-apis) +for details about User-Defined APIs. + +> [!NOTE] +> +> While Vim script does not facilitate types, Denops uses `unknown` types on the +> interface between Vim and Denops. That's why we use +> [unknownutil](https://deno.land/x/unknownutil) to ensure that the `name` is of +> type `string` in the above code. + +Once you've updated the file, restart Vim, and execute the following command, +you will see the message "Hello, Your name!". + +``` +:echo denops#request("denops-helloworld", "hello", ["Your name"]) +``` + +As shown, users can call the Denops API via the `denops#request()` function. + +![](./img/adding-an-api-01.png) diff --git a/src/tutorial/helloworld/calling-vim-features.md b/src/tutorial/helloworld/calling-vim-features.md new file mode 100644 index 0000000..33f50a3 --- /dev/null +++ b/src/tutorial/helloworld/calling-vim-features.md @@ -0,0 +1,64 @@ +# Calling Vim Features from the Plugin + +If you want to use a Vim feature from your Denops plugin, you can call it via +the `denops` instance passed to the plugin's `main` function. You can rewrite +`main.ts` as follows to register the `DenopsHello` as a Vim command: + +```ts:denops/denops-helloworld/main.ts +import { Denops } from "https://deno.land/x/denops_std@v6.0.0/mod.ts"; +import { assert, is } from "https://deno.land/x/unknownutil@v3.14.1/mod.ts"; + +export function main(denops: Denops): void { + denops.dispatcher = { + async init() { + // This is just an example. + // Developers usually should define commands directly in Vim script. + await denops.cmd( + `command! -nargs=? DenopsHello echomsg denops#request('denops-helloworld', 'hello', [])`, + ); + }, + + hello(name) { + assert(name, is.String); + return `Hello, ${name || "Denops"}!`; + }, + }; +} +``` + +Then, rewrite `plugin/denops-helloworld.vim` to automatically call the `init` +API on plugin load via the `DenopsPluginPost:{plugin_name}` autocmd: + +```vim:plugin/denops-helloworld.vim +if exists('g:loaded_denops_helloworld') + finish +endif +let g:loaded_denops_helloworld = 1 + +augroup denops_helloworld + autocmd! + autocmd User DenopsPluginPost:denops-helloworld + \ call denops#notify('denops-helloworld', 'init', []) +augroup END +``` + +Once Vim is restarted, the `DenopsHello` command will be registered. + +Then you can run: + +```vim +:DenopsHello Your name +``` + +If the plugin has been registered successfully, you will see `Hello, Your name!` +as a result. + +![](./img/calling-vim-features-01.png) + +## Next Steps + +In the next step, follow the tutorial to learn how to develop a real Denops +plugin. + +- [Tutorial (Maze)](../tutorial/maze/README.md) +- [API reference](https://deno.land/x/denops_std/mod.ts) diff --git a/src/tutorial/helloworld/creating-a-minimal-denops-plugin.md b/src/tutorial/helloworld/creating-a-minimal-denops-plugin.md new file mode 100644 index 0000000..5b9a758 --- /dev/null +++ b/src/tutorial/helloworld/creating-a-minimal-denops-plugin.md @@ -0,0 +1,53 @@ +# Creating a Minimal Denops Plugin + +When [denops.vim] is installed, it searches for files named `denops/*/main.ts` +in addition to Vim plugins when Vim starts. + +If a corresponding file is found, Denops registers the parent directory name +(`foo` in the case of `denops/foo/main.ts`) as the plugin name. It then imports +the corresponding file as a TypeScript module and calls the function named +`main`. + +> [!NOTE] +> +> Denops plugins typically include both TypeScript and Vim script code, so the +> directory structure looks like an extension of the Vim plugin structure with +> an added `denops` directory. + +[denops.vim]: https://github.com/vim-denops/denops.vim + +Let's add `denops/denops-helloworld/main.ts` to the `denops-helloworld` +directory that we created in the previous section. The directory tree will be as +follows: + +``` +denops-helloworld +├── denops +│ └── denops-helloworld +│ └── main.ts +└── plugin + └── denops-helloworld.vim +``` + +Here is the content of the `denops/denops-helloworld/main.ts` file: + +```typescript:denops/denops-helloworld/main.ts +import type { Denops } from "https://deno.land/x/denops_std@v6.0.0/mod.ts"; + +export function main(denops: Denops): void { + console.log("Hello, Denops from TypeScript!"); +} +``` + +> [!WARNING] +> +> As shown above, developers can use `console.log` (or `console.warn`, +> `console.error`, etc.) for debug output. The content will be echoed to Vim. +> However, it is not recommended to use `console.log` in production code. +> Instead, use `denops.cmd("echo '...'")` or the `echo` function in the `helper` +> module of the `denops_std` library. + +Once you've created the file, restart Vim, and "Hello, Denops from TypeScript!" +will be displayed on Vim startup. + +![](./img/creating-a-minimal-denops-plugin-01.png) diff --git a/src/tutorial/helloworld/creating-a-minimal-vim-plugin.md b/src/tutorial/helloworld/creating-a-minimal-vim-plugin.md new file mode 100644 index 0000000..1cf9d19 --- /dev/null +++ b/src/tutorial/helloworld/creating-a-minimal-vim-plugin.md @@ -0,0 +1,60 @@ +# Creating a Minimal Vim Plugin + +Let's start by crafting a minimal Vim plugin called `denops-helloworld`. + +Create a directory named `denops-helloworld` in your home directory and a Vim +script file as follows: + +``` +denops-helloworld +└── plugin + └── denops-helloworld.vim +``` + +The content of the `plugin/denops-helloworld.vim` file is as follows: + +```vim:plugin/denops-helloworld.vim +if exists('g:loaded_denops_helloworld') + finish +endif +let g:loaded_denops_helloworld = 1 + +command! DenopsHello echo 'Hello, Denops!' +``` + +The initial four lines (as shown below) serve as a guard, preventing the plugin +from being loaded more than once. Using this guard is a common practice to +ensure the plugin is loaded only once. + +```vim +if exists('g:loaded_denops_helloworld') + finish +endif +let g:loaded_denops_helloworld = 1 +``` + +The final line (as displayed below) defines a command named `DenopsHello` that +invokes the `echo 'Hello, Denops!'` command. Thus, when you execute +`:DenopsHello` in Vim, it will display "Hello, Denops!". + +```vim +command! DenopsHello echo 'Hello, Denops!' +``` + +Upon startup, Vim searches and loads files named `plugin/*.vim` in directories +specified in `runtimepath`. To activate the plugin, add the following line to +your Vim configuration file (e.g., `~/.vimrc` or `~/.config/nvim/init.vim`): + +```vim +set runtimepath+=~/denops-helloworld +``` + +For Neovim's Lua configuration file (e.g., `~/.config/nvim/init.lua`), use: + +```lua +vim.opt.runtimepath:append("~/denops-helloworld") +``` + +Restart Vim and execute `:DenopsHello` to witness the message "Hello, Denops!". + +![](./img/creating-a-minimal-vim-plugin-01.png) diff --git a/src/tutorial/helloworld/img/adding-an-api-01.png b/src/tutorial/helloworld/img/adding-an-api-01.png new file mode 100644 index 0000000000000000000000000000000000000000..392d1560871e44ba5598c6fb227d232b8bca0662 GIT binary patch literal 11220 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 F{67@ItU~|* literal 0 HcmV?d00001 diff --git a/src/tutorial/helloworld/img/calling-vim-features-01.png b/src/tutorial/helloworld/img/calling-vim-features-01.png new file mode 100644 index 0000000000000000000000000000000000000000..21329e66af7de392816be9160c8ef7dfb78cdf97 GIT binary patch literal 13235 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 literal 0 HcmV?d00001 diff --git a/src/tutorial/helloworld/img/creating-a-minimal-vim-plugin-01.png b/src/tutorial/helloworld/img/creating-a-minimal-vim-plugin-01.png new file mode 100644 index 0000000000000000000000000000000000000000..646ad438fd1d87351ce77361114d880bb72da2dd GIT binary patch literal 9620 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 RzrTW!ek(6tB&zrM{{YkZ_=o@i literal 0 HcmV?d00001 diff --git a/src/tutorial/making-a-directory-tree.md b/src/tutorial/making-a-directory-tree.md deleted file mode 100644 index d82f0ba..0000000 --- a/src/tutorial/making-a-directory-tree.md +++ /dev/null @@ -1,29 +0,0 @@ -# Making a Plugin Directory Tree - -Next, you have to make a directory `~/dps-helloworld` to store plugin codes and -change the current working directory to it. If you use Windows, you should find -and use equivalent commands. - -```sh -mkdir ~/dps-helloworld -cd ~/dps-helloworld -``` - -Then make a minimum directory tree and a code file required by Denops at least: - -```sh -mkdir -p denops/helloworld -touch denops/helloworld/main.ts -``` - -Finally, you will get a directory tree like: - -``` -dps-helloworld -└── denops - └── helloworld - └── main.ts -``` - -This directory tree is a basis for developing a Denops plugin; Denops loads -`denops/*/main.ts` on `runtimepath` automatically after your vim starts up. diff --git a/src/tutorial/maze/README.md b/src/tutorial/maze/README.md new file mode 100644 index 0000000..bec0a89 --- /dev/null +++ b/src/tutorial/maze/README.md @@ -0,0 +1,15 @@ +# Tutorial (Maze) + +Now that you have grasped the basics of developing Denops plugins in the +previous chapters, it's time to delve into creating a more functional plugin. + +So, out of the blue, have you ever felt the urge to solve mazes while +programming? Personally, I haven't, but there might be enthusiasts who enjoy it +immensely. In any case, let's embark on developing a Denops plugin that can +generate and display a maze in Vim at any time. Well, don't ask me why we would +want to do that. + +> [!NOTE] +> +> The plugin we will create in this chapter can be found at +> [https://github.com/vim-denops/denops-maze.vim](https://github.com/vim-denops/denops-maze.vim) diff --git a/src/tutorial/maze/adjusting-maze-size-to-fit-the-window.md b/src/tutorial/maze/adjusting-maze-size-to-fit-the-window.md new file mode 100644 index 0000000..0f34a95 --- /dev/null +++ b/src/tutorial/maze/adjusting-maze-size-to-fit-the-window.md @@ -0,0 +1,58 @@ +# Adjusting Maze Size to Fit the Window + +In the previous section, we outputted the maze to a buffer. However, the maze +size can sometimes be too large or too small for the window. It would be better +to have a maze that fits the current window size. + +Let's modify the plugin to ensure the generated maze fits the current window +size. + +```typescript:denops/denops-helloworld/main.ts +import type { Denops } from "https://deno.land/x/denops_std@v6.0.0/mod.ts"; +import * as fn from "https://deno.land/x/denops_std@v6.0.0/function/mod.ts"; +import { Maze } from "https://deno.land/x/maze_generator@v0.4.0/mod.js"; + +export function main(denops: Denops): void { + denops.dispatcher = { + async maze() { + await denops.cmd("enew"); + + const winWidth = await fn.winwidth(denops, 0); + const winHeight = await fn.winheight(denops, 0); + const maze = new Maze({ + xSize: winWidth / 3, + ySize: winHeight / 3, + }).generate(); + const content = maze.getString(); + + await fn.setline(denops, 1, content.split(/\r?\n/g)); + }, + }; +} +``` + +In this code, we utilize the `function` module (aliased to `fn`) of `denops_std` +(Denops Standard Library) to call `winwidth()`, `winheight()`, and `setline()` +functions. Then, we create a maze that fits the current window size and write it +to the buffer. + +So why do we use the `function` module instead of `denops.call`? With +`denops.call`, developers must know the function name, arguments, return type, +and manually cast the return value to the expected type (like `as string`). +However, with the `function` module, developers can use auto-completion, type +checking, etc. It is more convenient and safe to use the `function` module. + +> [!TIP] +> +> The `function` module of the `denops_std` library provides a set of functions +> that are available on both Vim and Neovim. If you'd like to use Vim or Neovim +> only functions, use the `vim` or `nvim` module under the `function` module +> instead. +> +> See the +> [function module of denops_std API document](https://doc.deno.land/https/deno.land/x/denops_std/function/mod.ts) +> for more details. + +Restart Vim, rerun the `:Maze` command, and then you can see: + +![](./img/fitting-maze-to-the-window-01.png) diff --git a/src/tutorial/maze/creating-applicative-plugin.md b/src/tutorial/maze/creating-applicative-plugin.md new file mode 100644 index 0000000..850eddd --- /dev/null +++ b/src/tutorial/maze/creating-applicative-plugin.md @@ -0,0 +1,85 @@ +# How to create an applicative plugin + +In the previous section, we created a plugin that outputs a maze to a buffer. +However, who wants to see a maze in a buffer that is too small or too large for +it? It would be better to see a maze that fits the current window size. + +In this section, we will modify the plugin to make the generated maze fit the +current window size. So, let's create a production ready enterprise edition of +the maze plugin that will satisfy your crazy addictive maze solver friend. + +First, modify `plugin/denops-maze.vim` to accept the `Maze` command with an +optional argument. + +```vim:plugin/denops-maze.vim +if exists('g:loaded_denops_maze') + finish +endif +let g:loaded_denops_maze = 1 + +" Function called once the plugin is loaded +function! s:init() abort + command! -nargs=? Maze call denops#request('denops-maze', 'maze', []) +endfunction + +augroup denops_maze + autocmd! + autocmd User DenopsPluginPost:denops-maze call s:init() +augroup END +``` + +Then, modify the `main.ts` file to accept the optional argument for a custom +opener, generate a maze that fits the current window size, configure the buffer +options to make it non-file readonly buffer, etc. + +```ts:denops/denops-maze/main.ts +import type { Denops } from "https://deno.land/x/denops_std@v6.0.0/mod.ts"; +import { batch, collect } from "https://deno.land/x/denops_std@v6.0.0/batch/mod.ts"; +import * as fn from "https://deno.land/x/denops_std@v6.0.0/function/mod.ts"; +import * as op from "https://deno.land/x/denops_std@v6.0.0/option/mod.ts"; +import { Maze } from "https://deno.land/x/maze_generator@v0.4.0/mod.js"; +import { assert, is } from "https://deno.land/x/unknownutil@v3.14.1/mod.ts"; + +export function main(denops: Denops): void { + denops.dispatcher = { + async maze(opener) { + assert(opener, is.String); + const [xSize, ySize] = await collect(denops, (denops) => [ + op.columns.get(denops), + op.lines.get(denops), + ]); + const maze = new Maze({ + xSize: xSize / 3, + ySize: ySize / 3, + }).generate(); + const content = maze.getString(); + await batch(denops, (denops) => { + await denops.cmd(opener || "new"); + await op.modifiable.setLocal(denops, true); + await fn.setline(denops, 1, content.split(/\r?\n/g)); + await op.bufhidden.setLocal(denops, "wipe"); + await op.buftype.setLocal(denops, "nofile"); + await op.swapfile.setLocal(denops, false); + await op.modifiable.setLocal(denops, false); + await op.modified.setLocal(denops, false); + }); + }, + }; +}; +``` + +In above code, we utilize the following denops_std modules: + +- `batch` and `collect` functions in a `batch` module to execute multiple + commands in a single RPC +- `function` module to call Vim's functions +- `option` module to get and set Vim's options + +See the +[denops_std API document](https://doc.deno.land/https/deno.land/x/denops_std/mod.ts) +for more details about each modules. + +That's it. Now you can see a smaller maze shown on the window with `:Maze` +command. + +![](../img/developing-more-applicative-plugin-3.png) diff --git a/src/tutorial/maze/img/fitting-maze-to-the-window-01.png b/src/tutorial/maze/img/fitting-maze-to-the-window-01.png new file mode 100644 index 0000000000000000000000000000000000000000..e0fc5ccf6d72568f3411afb11d91a66b5901eea8 GIT binary patch literal 16840 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 E0LHTOU;qFB literal 0 HcmV?d00001 diff --git a/src/tutorial/maze/img/outputting-content-to-buffer-01.png b/src/tutorial/maze/img/outputting-content-to-buffer-01.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb02794c1a1852ec66625de1b45254539319645 GIT binary patch literal 22645 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 Ci>$x^ literal 0 HcmV?d00001 diff --git a/src/tutorial/maze/img/properly-create-a-virtual-buffer-01.png b/src/tutorial/maze/img/properly-create-a-virtual-buffer-01.png new file mode 100644 index 0000000000000000000000000000000000000000..275121161e4506e19b07e7100a718c211c05ebeb GIT binary patch literal 18546 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 [!NOTE] +> +> Vim may execute some events between RPC calls, so the current buffer or window +> really may be changed from what we expected. Denops plugin developers should +> be careful about this. The best practice for avoiding this problem is to avoid +> using _current_ and always specify the buffer number or window number. + +After that, we use `buffer.replace` to replace the content of the buffer. +Actually, replacing the buffer content is a bit tricky. Developers should care +about `modifiable` options to avoid unmodifiable errors, `foldmethod` options to +keep foldings, and should remove the buffer content that is not replaced by +`setline` or `setbufline`, etc. The `buffer.replace` function will care about +all of those, so developers should avoid using `setline` or `setbufline` +directly. + +At the end, we call `buffer.concrete` to concretize the buffer content. This +function defines `BufReadCmd` autocmd to restore the content when the buffer is +reloaded. Without this, the buffer content will be discarded when the user +executes the `:edit` command. + +Restart Vim, rerun the `:Maze` command, and then you can see: + +![](./img/properly-create-a-virtual-buffer-01.png) + +Try the `:edit` command on the buffer, and you can see the maze is still there. diff --git a/src/tutorial/maze/reduce-the-number-of-rpc-calls.md b/src/tutorial/maze/reduce-the-number-of-rpc-calls.md new file mode 100644 index 0000000..737bcbd --- /dev/null +++ b/src/tutorial/maze/reduce-the-number-of-rpc-calls.md @@ -0,0 +1,103 @@ +# Reducing the Number of RPC Calls + +As Denops employs RPC to interact with Vim, the volume of RPC calls +significantly influences the plugin's performance. In this section, we aim to +enhance performance by reducing the number of RPC calls using the `batch` module +from `denops_std`. Let's revise the `main.ts` file as follows: + +```typescript:denops/denops-maze/main.ts +import type { Denops } from "https://deno.land/x/denops_std@v6.0.0/mod.ts"; +import { batch, collect } from "https://deno.land/x/denops_std@v6.0.0/batch/mod.ts"; +import * as buffer from "https://deno.land/x/denops_std@v6.0.0/buffer/mod.ts"; +import * as fn from "https://deno.land/x/denops_std@v6.0.0/function/mod.ts"; +import * as op from "https://deno.land/x/denops_std@v6.0.0/option/mod.ts"; +import { Maze } from "https://deno.land/x/maze_generator@v0.4.0/mod.js"; + +export function main(denops: Denops): void { + denops.dispatcher = { + async maze() { + const { bufnr, winnr } = await buffer.open(denops, "maze://"); + + const [winWidth, winHeight] = await collect(denops, (denops) => [ + fn.winwidth(denops, winnr), + fn.winheight(denops, winnr), + ]); + const maze = new Maze({ + xSize: winWidth / 3, + ySize: winHeight / 3, + }).generate(); + const content = maze.getString(); + + await batch(denops, async (denops) => { + await buffer.replace(denops, bufnr, content.split(/\r?\n/g)); + await buffer.concrete(denops, bufnr); + await op.bufhidden.setLocal(denops, "wipe"); + await op.modifiable.setLocal(denops, false); + }); + }, + }; +} +``` + +In this code, we use the `collect` function to gather window size values and the +`batch` function to execute multiple commands in a single RPC. This optimization +significantly reduces the number of RPC calls, thereby improving the plugin's +performance. + +The `collect` function is designed for collecting multiple values in a single +RPC, offering the following features: + +- Execution of `denops.call` or `denops.eval` within the `collect` is delayed + and executed in a single RPC with the results. +- The result of `denops.call` or `denops.eval` in the `collect` is always falsy, + indicating that branching (if, switch, etc.) is not allowed. +- Execution of `denops.redraw` or `denops.cmd` in the `collect` is not allowed. +- Execution of `batch` or `collect` in the `collect` is not allowed, indicating + that nesting is not allowed. + +In short, only the following operations are allowed in the `collect`: + +- `denops.call` or `denops.eval` that returns a value. +- Functions in the `function` module that return a value. +- Functions in the `option` module that return a value. +- Functions in the `variable` module that return a value. + +The `batch` function is designed for executing multiple commands in a single +RPC, offering the following features: + +- Execution of `denops.call`, `denops.cmd`, or `denops.eval` in the `batch` is + delayed and executed in a single RPC without the results. +- The result of `denops.call` or `denops.eval` in the `batch` is always falsy, + indicating that branching (if, switch, etc.) is not allowed. +- Execution of `denops.redraw` is accumulated and only executed once at the end + of the `batch`. +- Execution of `batch` in the `batch` is allowed, indicating that nesting is + allowed. +- Execution of `collect` in the `batch` is not allowed, indicating that nesting + is not allowed. + +In short, only the following operations are allowed in the `batch`: + +- `denops.call`, `denops.cmd`, or `denops.eval` (without the results). +- Functions in the `function` module (without the results). +- Functions in the `option` module (without the results). +- Functions in the `variable` module (without the results). +- Functions in other modules that do not call `collect` internally. + +In the previous code, the number of RPC calls was more than 7, but after using +`batch` and `collect`, the number of RPC calls is reduced to 3. Although this is +a small plugin, the performance improvement may not be noticeable. However, in a +larger plugin, the performance improvement will be significant. + +Restart Vim, rerun the `:Maze` command, and confirm that the plugin works +properly with `batch` and `collect`. + +## Next Steps + +In the next step, read API references or real-world plugins + +- [API reference](https://deno.land/x/denops_std/mod.ts) +- [lambdalisue/gin.vim](https://github.com/lambdalisue/gin.vim) +- [vim-skk/skkeleton](https://github.com/vim-skk/skkeleton) +- [Shougo/ddu.vim](https://github.com/Shougo/ddu.vim) +- [Find one from the `vim-denops` topic](https://github.com/topics/vim-denops) diff --git a/src/tutorial/maze/utilizing-denops-std-library.md b/src/tutorial/maze/utilizing-denops-std-library.md new file mode 100644 index 0000000..c7f2be7 --- /dev/null +++ b/src/tutorial/maze/utilizing-denops-std-library.md @@ -0,0 +1,90 @@ +# Utilizing Denops Standard library + +In the previous section, we created a plugin that outputs a maze to a buffer. +However, the plugin has the following problems: + +- The maze does not fit the window size. The maze may be too large for it +- The buffer is modifiable so that the content may accidentally be modified +- When user execute `:edit` command, the maze is disappeared + +Additionally, we used `denops.cmd` or `denops.call` to execute Vim commands and +functions directly. However, it was a bit painful to use those because we must +know the definitions of the commands and functions. No auto-completion, no type +checking, etc. + +In this section, we introduce Denops standard library (`denops_std`) to solves +all above problems. The plugin will output the maze to non-file like buffer that +is non-modifiable and the content is remained even if user execute `:edit` +command. + +First, modify the `denops/denops-helloworld/main.ts` file as follows: + +```typescript:denops/denops-helloworld/main.ts +import type { Denops } from "https://deno.land/x/denops_std@v6.0.0/mod.ts"; +import * as buffer from "https://deno.land/x/denops_std@v6.0.0/buffer/mod.ts"; +import * as fn from "https://deno.land/x/denops_std@v6.0.0/function/mod.ts"; +import * as op from "https://deno.land/x/denops_std@v6.0.0/option/mod.ts"; +import { Maze } from "https://deno.land/x/maze_generator@v0.4.0/mod.js"; + +export function main(denops: Denops): void { + denops.dispatcher = { + async maze() { + // Get the current window size + const winWidth = await fn.winwidth(denops, 0); + const winHeight = await fn.winheight(denops, 0); + + // Create a maze that fits the current window size + const maze = new Maze({ + xSize: winWidth / 3, + ySize: winHeight / 3, + }).generate(); + const content = maze.getString(); + + // Open a 'maze://' buffer with specified opener + const { bufnr } = await buffer.open(denops, "maze://"); + + // Replace the buffer content with the maze + await buffer.replace(denops, bufnr, content.split(/\r?\n/g)); + + // Concrete (fix) the buffer content + await buffer.concrete(denops, bufnr); + + // Set the buffer options + await op.bufhidden.setLocal(denops, "wipe"); + await op.modifiable.setLocal(denops, false); + }, + }; +} +``` + +Let's break down this code step by step. + +### Get the current window size + +```typescript +// Get the current window size +const winWidth = await fn.winwidth(denops, 0); +const winHeight = await fn.winheight(denops, 0); +``` + +This code call Vim's `winwidth` and `winheight` functions to get the current +window size. While `function` module (alised to `fn`) of `denops_std` provides a +set of functions that are available on both Vim and Neovim, LSP can provide +auto-completion and type checking for the functions. + +> [!NOTE] +> +> The `function` module of the `denops_std` library provides a set of functions +> that are available on both Vim and Neovim. If you'd like to use Vim or Neovim +> only functions, use the `vim` or `nvim` module under the `function` module +> instead. +> +> See the +> [function module of denops_std API document](https://doc.deno.land/https/deno.land/x/denops_std/function/mod.ts) +> for more details. + +### Open a 'maze://' buffer with specified opener + +```typescript +const { bufnr } = await buffer.open(denops, "maze://"); +``` diff --git a/src/tutorial/maze/utilizing-third-party-library.md b/src/tutorial/maze/utilizing-third-party-library.md new file mode 100644 index 0000000..e662614 --- /dev/null +++ b/src/tutorial/maze/utilizing-third-party-library.md @@ -0,0 +1,101 @@ +# Utilizing Third-Party Library + +Certainly, starting with coding a maze generation algorithm would be nice. +However, since you're now using Deno, you can conveniently employ a third-party +library called [maze_generator](https://deno.land/x/maze_generator@v0.4.0). +Let's define a `Maze` command similar to `DenopsHello`; `Maze` generates a maze +and outputs it. + +> [!NOTE] +> +> The `maze_generator` library is a third-party library that generates a maze. +> It is not a part of Deno or Denops. You can use any third-party library that +> is compatible with Deno in your Denops plugin. Thanks to Deno, developers and +> users don't need to worry about the installation of third-party libraries. +> Deno automatically downloads and caches the library when it is imported. + +Create the `denops-maze` plugin and place it under `~/denops-maze`. The +directory tree will look like this: + +``` +~/denops-maze +├── denops +│ └── denops-maze +│ └── main.ts +└── plugin + └── denops-maze.vim +``` + +The content of the `denops/denops-maze/main.ts` file will be: + +```typescript:denops/denops-maze/main.ts +import type { Denops } from "https://deno.land/x/denops_std@v6.0.0/mod.ts"; +import { Maze } from "https://deno.land/x/maze_generator@v0.4.0/mod.js"; + +export function main(denops: Denops): void { + denops.dispatcher = { + maze() { + const maze = new Maze({}).generate(); + const content = maze.getString(); + console.log(content); + }, + }; +} +``` + +The content of the `plugin/denops-maze.vim` file will be: + +```vim:plugin/denops-maze.vim +if exists('g:loaded_denops_maze') + finish +endif +let g:loaded_denops_maze = 1 + +" Function called once the plugin is loaded +function! s:init() abort + command! Maze call denops#request('denops-maze', 'maze', []) +endfunction + +augroup denops_maze + autocmd! + autocmd User DenopsPluginPost:denops-maze call s:init() +augroup END +``` + +> [!TIP] +> +> The `Maze` command is defined once the plugin is loaded with the above code. +> If you wish to define the command immediately after Vim startup, you can +> define the command and use `denops#plugin#wait()` or +> `denops#plugin#wait_async()` in the function to wait for plugin load, like +> this: +> +> ```vim +> if exists('g:loaded_denops_maze') +> finish +> endif +> let g:loaded_denops_maze = 1 +> +> function! s:maze() abort +> if denops#plugin#wait('denops-maze') +> " Something went wrong +> return +> endif +> call denops#request('denops-maze', 'maze', []) +> endfunction +> +> command! Maze call s:maze() +> ``` + +Don't forget to activate the plugin by adding the following line to your +`vimrc`: + +```vim +set runtimepath+=~/denops-maze +``` + +Then, restart Vim and execute `:Maze` to see the generated maze. Note that it +may take a few seconds for the first startup because Deno will download the +dependencies, but it happens only once. + +![Utilizing Third-Party Library](./img/utilizing-third-party-library-01.png) diff --git a/src/tutorial/preparing-deno-and-denops.md b/src/tutorial/preparing-deno-and-denops.md deleted file mode 100644 index 55076ad..0000000 --- a/src/tutorial/preparing-deno-and-denops.md +++ /dev/null @@ -1,43 +0,0 @@ -# Preparing Deno and Denops - -First of all, whichever you want to either use or develop Denops plugins, you -have to install tools; [Deno][Deno] and [Denops][denops.vim] in addition to your -vim. - -[denops.vim]: https://github.com/vim-denops/denops.vim -[deno]: https://deno.land/ - -## Installing Deno - -Deno can be installed to follow the instructions in the -[Deno document](https://deno.land/#installation). In addition, you can check if -Deno has been installed successfully by -[the command](https://deno.land/#getting-started): - -```sh -deno run https://deno.land/std/examples/welcome.ts -``` - -If you have already installed Deno, upgrade it to the latest version. - -```sh -deno upgrade -``` - -## Installing Denops - -It is necessary for using Denops to install as a vim plugin -[denops.vim][denops.vim]. For example, when you use [vim-plug][vim-plug] as a -vim plugin manager, add the following command to your `.vimrc` and execute -`:PlugInstall` on vim to install Denops. - -```vim -Plug 'vim-denops/denops.vim' -``` - -[vim-plug]: https://github.com/junegunn/vim-plug - -If you prefer another vim plugin manager, you can find instructions for it on -the [Install](../install.md) page. - -Thus Deno and Denops are available in your environment. diff --git a/src/tutorial/vimneovim-configuration.md b/src/tutorial/vimneovim-configuration.md deleted file mode 100644 index 45b2061..0000000 --- a/src/tutorial/vimneovim-configuration.md +++ /dev/null @@ -1,19 +0,0 @@ -# Vim/Neovim Configuration - -Vim plugins have to be located under a path in `runtimepath` on your vim -configuration. Denops plugins also have to be placed in `runtimepath` because -they are also vim plugins. To add the plugin path to your `.vimrc`, you write: - -```vim -set runtimepath^=~/dps-helloworld -``` - -The other setting to add to your `.vimrc` is to make Denops launch in debug mode -to enable type checkings at startup of Deno: - -```vim -let g:denops#debug = 1 -``` - -Note that running Denops in debug mode has a performance problem. Once your -development goes well, it would be better for you to disable the debug mode. diff --git a/theme/highlight.js b/theme/highlight.js new file mode 100644 index 0000000..8c711e9 --- /dev/null +++ b/theme/highlight.js @@ -0,0 +1,3902 @@ +/*! + Highlight.js v11.9.0 (git: b7ec4bfafc) + (c) 2006-2023 undefined and other contributors + License: BSD-3-Clause + */ +var hljs = (function () { + "use strict"; + + /* eslint-disable no-multi-assign */ + + function deepFreeze(obj) { + if (obj instanceof Map) { + obj.clear = + obj.delete = + obj.set = + function () { + throw new Error("map is read-only"); + }; + } else if (obj instanceof Set) { + obj.add = + obj.clear = + obj.delete = + function () { + throw new Error("set is read-only"); + }; + } + + // Freeze self + Object.freeze(obj); + + Object.getOwnPropertyNames(obj).forEach((name) => { + const prop = obj[name]; + const type = typeof prop; + + // Freeze prop if it is an object or function and also not already frozen + if ( + (type === "object" || type === "function") && !Object.isFrozen(prop) + ) { + deepFreeze(prop); + } + }); + + return obj; + } + + /** @typedef {import('highlight.js').CallbackResponse} CallbackResponse */ + /** @typedef {import('highlight.js').CompiledMode} CompiledMode */ + /** @implements CallbackResponse */ + + class Response { + /** + * @param {CompiledMode} mode + */ + constructor(mode) { + // eslint-disable-next-line no-undefined + if (mode.data === undefined) mode.data = {}; + + this.data = mode.data; + this.isMatchIgnored = false; + } + + ignoreMatch() { + this.isMatchIgnored = true; + } + } + + /** + * @param {string} value + * @returns {string} + */ + function escapeHTML(value) { + return value + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } + + /** + * performs a shallow merge of multiple objects into one + * + * @template T + * @param {T} original + * @param {Record[]} objects + * @returns {T} a single new object + */ + function inherit$1(original, ...objects) { + /** @type Record */ + const result = Object.create(null); + + for (const key in original) { + result[key] = original[key]; + } + objects.forEach(function (obj) { + for (const key in obj) { + result[key] = obj[key]; + } + }); + return /** @type {T} */ (result); + } + + /** + * @typedef {object} Renderer + * @property {(text: string) => void} addText + * @property {(node: Node) => void} openNode + * @property {(node: Node) => void} closeNode + * @property {() => string} value + */ + + /** @typedef {{scope?: string, language?: string, sublanguage?: boolean}} Node */ + /** @typedef {{walk: (r: Renderer) => void}} Tree */ + /** */ + + const SPAN_CLOSE = ""; + + /** + * Determines if a node needs to be wrapped in + * + * @param {Node} node */ + const emitsWrappingTags = (node) => { + // rarely we can have a sublanguage where language is undefined + // TODO: track down why + return !!node.scope; + }; + + /** + * @param {string} name + * @param {{prefix:string}} options + */ + const scopeToCSSClass = (name, { prefix }) => { + // sub-language + if (name.startsWith("language:")) { + return name.replace("language:", "language-"); + } + // tiered scope: comment.line + if (name.includes(".")) { + const pieces = name.split("."); + return [ + `${prefix}${pieces.shift()}`, + ...(pieces.map((x, i) => `${x}${"_".repeat(i + 1)}`)), + ].join(" "); + } + // simple scope + return `${prefix}${name}`; + }; + + /** @type {Renderer} */ + class HTMLRenderer { + /** + * Creates a new HTMLRenderer + * + * @param {Tree} parseTree - the parse tree (must support `walk` API) + * @param {{classPrefix: string}} options + */ + constructor(parseTree, options) { + this.buffer = ""; + this.classPrefix = options.classPrefix; + parseTree.walk(this); + } + + /** + * Adds texts to the output stream + * + * @param {string} text */ + addText(text) { + this.buffer += escapeHTML(text); + } + + /** + * Adds a node open to the output stream (if needed) + * + * @param {Node} node */ + openNode(node) { + if (!emitsWrappingTags(node)) return; + + const className = scopeToCSSClass(node.scope, { + prefix: this.classPrefix, + }); + this.span(className); + } + + /** + * Adds a node close to the output stream (if needed) + * + * @param {Node} node */ + closeNode(node) { + if (!emitsWrappingTags(node)) return; + + this.buffer += SPAN_CLOSE; + } + + /** + * returns the accumulated buffer + */ + value() { + return this.buffer; + } + + // helpers + + /** + * Builds a span element + * + * @param {string} className */ + span(className) { + this.buffer += ``; + } + } + + /** @typedef {{scope?: string, language?: string, children: Node[]} | string} Node */ + /** @typedef {{scope?: string, language?: string, children: Node[]} } DataNode */ + /** @typedef {import('highlight.js').Emitter} Emitter */ + /** */ + + /** @returns {DataNode} */ + const newNode = (opts = {}) => { + /** @type DataNode */ + const result = { children: [] }; + Object.assign(result, opts); + return result; + }; + + class TokenTree { + constructor() { + /** @type DataNode */ + this.rootNode = newNode(); + this.stack = [this.rootNode]; + } + + get top() { + return this.stack[this.stack.length - 1]; + } + + get root() { + return this.rootNode; + } + + /** @param {Node} node */ + add(node) { + this.top.children.push(node); + } + + /** @param {string} scope */ + openNode(scope) { + /** @type Node */ + const node = newNode({ scope }); + this.add(node); + this.stack.push(node); + } + + closeNode() { + if (this.stack.length > 1) { + return this.stack.pop(); + } + // eslint-disable-next-line no-undefined + return undefined; + } + + closeAllNodes() { + while (this.closeNode()); + } + + toJSON() { + return JSON.stringify(this.rootNode, null, 4); + } + + /** + * @typedef { import("./html_renderer").Renderer } Renderer + * @param {Renderer} builder + */ + walk(builder) { + // this does not + return this.constructor._walk(builder, this.rootNode); + // this works + // return TokenTree._walk(builder, this.rootNode); + } + + /** + * @param {Renderer} builder + * @param {Node} node + */ + static _walk(builder, node) { + if (typeof node === "string") { + builder.addText(node); + } else if (node.children) { + builder.openNode(node); + node.children.forEach((child) => this._walk(builder, child)); + builder.closeNode(node); + } + return builder; + } + + /** + * @param {Node} node + */ + static _collapse(node) { + if (typeof node === "string") return; + if (!node.children) return; + + if (node.children.every((el) => typeof el === "string")) { + // node.text = node.children.join(""); + // delete node.children; + node.children = [node.children.join("")]; + } else { + node.children.forEach((child) => { + TokenTree._collapse(child); + }); + } + } + } + + /** + Currently this is all private API, but this is the minimal API necessary + that an Emitter must implement to fully support the parser. + + Minimal interface: + + - addText(text) + - __addSublanguage(emitter, subLanguageName) + - startScope(scope) + - endScope() + - finalize() + - toHTML() + + */ + + /** + * @implements {Emitter} + */ + class TokenTreeEmitter extends TokenTree { + /** + * @param {*} options + */ + constructor(options) { + super(); + this.options = options; + } + + /** + * @param {string} text + */ + addText(text) { + if (text === "") return; + + this.add(text); + } + + /** @param {string} scope */ + startScope(scope) { + this.openNode(scope); + } + + endScope() { + this.closeNode(); + } + + /** + * @param {Emitter & {root: DataNode}} emitter + * @param {string} name + */ + __addSublanguage(emitter, name) { + /** @type DataNode */ + const node = emitter.root; + if (name) node.scope = `language:${name}`; + + this.add(node); + } + + toHTML() { + const renderer = new HTMLRenderer(this, this.options); + return renderer.value(); + } + + finalize() { + this.closeAllNodes(); + return true; + } + } + + /** + * @param {string} value + * @returns {RegExp} + */ + + /** + * @param {RegExp | string } re + * @returns {string} + */ + function source(re) { + if (!re) return null; + if (typeof re === "string") return re; + + return re.source; + } + + /** + * @param {RegExp | string } re + * @returns {string} + */ + function lookahead(re) { + return concat("(?=", re, ")"); + } + + /** + * @param {RegExp | string } re + * @returns {string} + */ + function anyNumberOfTimes(re) { + return concat("(?:", re, ")*"); + } + + /** + * @param {RegExp | string } re + * @returns {string} + */ + function optional(re) { + return concat("(?:", re, ")?"); + } + + /** + * @param {...(RegExp | string) } args + * @returns {string} + */ + function concat(...args) { + const joined = args.map((x) => source(x)).join(""); + return joined; + } + + /** + * @param { Array } args + * @returns {object} + */ + function stripOptionsFromArgs(args) { + const opts = args[args.length - 1]; + + if (typeof opts === "object" && opts.constructor === Object) { + args.splice(args.length - 1, 1); + return opts; + } else { + return {}; + } + } + + /** @typedef { {capture?: boolean} } RegexEitherOptions */ + + /** + * Any of the passed expresssions may match + * + * Creates a huge this | this | that | that match + * @param {(RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions]} args + * @returns {string} + */ + function either(...args) { + /** @type { object & {capture?: boolean} } */ + const opts = stripOptionsFromArgs(args); + const joined = "(" + + (opts.capture ? "" : "?:") + + args.map((x) => source(x)).join("|") + ")"; + return joined; + } + + /** + * @param {RegExp | string} re + * @returns {number} + */ + function countMatchGroups(re) { + return (new RegExp(re.toString() + "|")).exec("").length - 1; + } + + /** + * Does lexeme start with a regular expression match at the beginning + * @param {RegExp} re + * @param {string} lexeme + */ + function startsWith(re, lexeme) { + const match = re && re.exec(lexeme); + return match && match.index === 0; + } + + // BACKREF_RE matches an open parenthesis or backreference. To avoid + // an incorrect parse, it additionally matches the following: + // - [...] elements, where the meaning of parentheses and escapes change + // - other escape sequences, so we do not misparse escape sequences as + // interesting elements + // - non-matching or lookahead parentheses, which do not capture. These + // follow the '(' with a '?'. + const BACKREF_RE = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; + + // **INTERNAL** Not intended for outside usage + // join logically computes regexps.join(separator), but fixes the + // backreferences so they continue to match. + // it also places each individual regular expression into it's own + // match group, keeping track of the sequencing of those match groups + // is currently an exercise for the caller. :-) + /** + * @param {(string | RegExp)[]} regexps + * @param {{joinWith: string}} opts + * @returns {string} + */ + function _rewriteBackreferences(regexps, { joinWith }) { + let numCaptures = 0; + + return regexps.map((regex) => { + numCaptures += 1; + const offset = numCaptures; + let re = source(regex); + let out = ""; + + while (re.length > 0) { + const match = BACKREF_RE.exec(re); + if (!match) { + out += re; + break; + } + out += re.substring(0, match.index); + re = re.substring(match.index + match[0].length); + if (match[0][0] === "\\" && match[1]) { + // Adjust the backreference. + out += "\\" + String(Number(match[1]) + offset); + } else { + out += match[0]; + if (match[0] === "(") { + numCaptures++; + } + } + } + return out; + }).map((re) => `(${re})`).join(joinWith); + } + + /** @typedef {import('highlight.js').Mode} Mode */ + /** @typedef {import('highlight.js').ModeCallback} ModeCallback */ + + // Common regexps + const MATCH_NOTHING_RE = /\b\B/; + const IDENT_RE = "[a-zA-Z]\\w*"; + const UNDERSCORE_IDENT_RE = "[a-zA-Z_]\\w*"; + const NUMBER_RE = "\\b\\d+(\\.\\d+)?"; + const C_NUMBER_RE = + "(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)"; // 0x..., 0..., decimal, float + const BINARY_NUMBER_RE = "\\b(0b[01]+)"; // 0b... + const RE_STARTERS_RE = + "!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~"; + + /** + * @param { Partial & {binary?: string | RegExp} } opts + */ + const SHEBANG = (opts = {}) => { + const beginShebang = /^#![ ]*\//; + if (opts.binary) { + opts.begin = concat( + beginShebang, + /.*\b/, + opts.binary, + /\b.*/, + ); + } + return inherit$1({ + scope: "meta", + begin: beginShebang, + end: /$/, + relevance: 0, + /** @type {ModeCallback} */ + "on:begin": (m, resp) => { + if (m.index !== 0) resp.ignoreMatch(); + }, + }, opts); + }; + + // Common modes + const BACKSLASH_ESCAPE = { + begin: "\\\\[\\s\\S]", + relevance: 0, + }; + const APOS_STRING_MODE = { + scope: "string", + begin: "'", + end: "'", + illegal: "\\n", + contains: [BACKSLASH_ESCAPE], + }; + const QUOTE_STRING_MODE = { + scope: "string", + begin: '"', + end: '"', + illegal: "\\n", + contains: [BACKSLASH_ESCAPE], + }; + const PHRASAL_WORDS_MODE = { + begin: + /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/, + }; + /** + * Creates a comment mode + * + * @param {string | RegExp} begin + * @param {string | RegExp} end + * @param {Mode | {}} [modeOptions] + * @returns {Partial} + */ + const COMMENT = function (begin, end, modeOptions = {}) { + const mode = inherit$1( + { + scope: "comment", + begin, + end, + contains: [], + }, + modeOptions, + ); + mode.contains.push({ + scope: "doctag", + // hack to avoid the space from being included. the space is necessary to + // match here to prevent the plain text rule below from gobbling up doctags + begin: "[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", + end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/, + excludeBegin: true, + relevance: 0, + }); + const ENGLISH_WORD = either( + // list of common 1 and 2 letter words in English + "I", + "a", + "is", + "so", + "us", + "to", + "at", + "if", + "in", + "it", + "on", + // note: this is not an exhaustive list of contractions, just popular ones + /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, // contractions - can't we'd they're let's, etc + /[A-Za-z]+[-][a-z]+/, // `no-way`, etc. + /[A-Za-z][a-z]{2,}/, // allow capitalized words at beginning of sentences + ); + // looking like plain text, more likely to be a comment + mode.contains.push( + { + // TODO: how to include ", (, ) without breaking grammars that use these for + // comment delimiters? + // begin: /[ ]+([()"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()":]?([.][ ]|[ ]|\))){3}/ + // --- + + // this tries to find sequences of 3 english words in a row (without any + // "programming" type syntax) this gives us a strong signal that we've + // TRULY found a comment - vs perhaps scanning with the wrong language. + // It's possible to find something that LOOKS like the start of the + // comment - but then if there is no readable text - good chance it is a + // false match and not a comment. + // + // for a visual example please see: + // https://github.com/highlightjs/highlight.js/issues/2827 + + begin: concat( + /[ ]+/, // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */ + "(", + ENGLISH_WORD, + /[.]?[:]?([.][ ]|[ ])/, + "){3}", + ), // look for 3 words in a row + }, + ); + return mode; + }; + const C_LINE_COMMENT_MODE = COMMENT("//", "$"); + const C_BLOCK_COMMENT_MODE = COMMENT("/\\*", "\\*/"); + const HASH_COMMENT_MODE = COMMENT("#", "$"); + const NUMBER_MODE = { + scope: "number", + begin: NUMBER_RE, + relevance: 0, + }; + const C_NUMBER_MODE = { + scope: "number", + begin: C_NUMBER_RE, + relevance: 0, + }; + const BINARY_NUMBER_MODE = { + scope: "number", + begin: BINARY_NUMBER_RE, + relevance: 0, + }; + const REGEXP_MODE = { + scope: "regexp", + begin: /\/(?=[^/\n]*\/)/, + end: /\/[gimuy]*/, + contains: [ + BACKSLASH_ESCAPE, + { + begin: /\[/, + end: /\]/, + relevance: 0, + contains: [BACKSLASH_ESCAPE], + }, + ], + }; + const TITLE_MODE = { + scope: "title", + begin: IDENT_RE, + relevance: 0, + }; + const UNDERSCORE_TITLE_MODE = { + scope: "title", + begin: UNDERSCORE_IDENT_RE, + relevance: 0, + }; + const METHOD_GUARD = { + // excludes method names from keyword processing + begin: "\\.\\s*" + UNDERSCORE_IDENT_RE, + relevance: 0, + }; + + /** + * Adds end same as begin mechanics to a mode + * + * Your mode must include at least a single () match group as that first match + * group is what is used for comparison + * @param {Partial} mode + */ + const END_SAME_AS_BEGIN = function (mode) { + return Object.assign(mode, { + /** @type {ModeCallback} */ + "on:begin": (m, resp) => { + resp.data._beginMatch = m[1]; + }, + /** @type {ModeCallback} */ + "on:end": (m, resp) => { + if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); + }, + }); + }; + + var MODES = /*#__PURE__*/ Object.freeze({ + __proto__: null, + APOS_STRING_MODE: APOS_STRING_MODE, + BACKSLASH_ESCAPE: BACKSLASH_ESCAPE, + BINARY_NUMBER_MODE: BINARY_NUMBER_MODE, + BINARY_NUMBER_RE: BINARY_NUMBER_RE, + COMMENT: COMMENT, + C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE, + C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE, + C_NUMBER_MODE: C_NUMBER_MODE, + C_NUMBER_RE: C_NUMBER_RE, + END_SAME_AS_BEGIN: END_SAME_AS_BEGIN, + HASH_COMMENT_MODE: HASH_COMMENT_MODE, + IDENT_RE: IDENT_RE, + MATCH_NOTHING_RE: MATCH_NOTHING_RE, + METHOD_GUARD: METHOD_GUARD, + NUMBER_MODE: NUMBER_MODE, + NUMBER_RE: NUMBER_RE, + PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE, + QUOTE_STRING_MODE: QUOTE_STRING_MODE, + REGEXP_MODE: REGEXP_MODE, + RE_STARTERS_RE: RE_STARTERS_RE, + SHEBANG: SHEBANG, + TITLE_MODE: TITLE_MODE, + UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE, + UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE, + }); + + /** + @typedef {import('highlight.js').CallbackResponse} CallbackResponse + @typedef {import('highlight.js').CompilerExt} CompilerExt + */ + + // Grammar extensions / plugins + // See: https://github.com/highlightjs/highlight.js/issues/2833 + + // Grammar extensions allow "syntactic sugar" to be added to the grammar modes + // without requiring any underlying changes to the compiler internals. + + // `compileMatch` being the perfect small example of now allowing a grammar + // author to write `match` when they desire to match a single expression rather + // than being forced to use `begin`. The extension then just moves `match` into + // `begin` when it runs. Ie, no features have been added, but we've just made + // the experience of writing (and reading grammars) a little bit nicer. + + // ------ + + // TODO: We need negative look-behind support to do this properly + /** + * Skip a match if it has a preceding dot + * + * This is used for `beginKeywords` to prevent matching expressions such as + * `bob.keyword.do()`. The mode compiler automatically wires this up as a + * special _internal_ 'on:begin' callback for modes with `beginKeywords` + * @param {RegExpMatchArray} match + * @param {CallbackResponse} response + */ + function skipIfHasPrecedingDot(match, response) { + const before = match.input[match.index - 1]; + if (before === ".") { + response.ignoreMatch(); + } + } + + /** + * @type {CompilerExt} + */ + function scopeClassName(mode, _parent) { + // eslint-disable-next-line no-undefined + if (mode.className !== undefined) { + mode.scope = mode.className; + delete mode.className; + } + } + + /** + * `beginKeywords` syntactic sugar + * @type {CompilerExt} + */ + function beginKeywords(mode, parent) { + if (!parent) return; + if (!mode.beginKeywords) return; + + // for languages with keywords that include non-word characters checking for + // a word boundary is not sufficient, so instead we check for a word boundary + // or whitespace - this does no harm in any case since our keyword engine + // doesn't allow spaces in keywords anyways and we still check for the boundary + // first + mode.begin = "\\b(" + mode.beginKeywords.split(" ").join("|") + + ")(?!\\.)(?=\\b|\\s)"; + mode.__beforeBegin = skipIfHasPrecedingDot; + mode.keywords = mode.keywords || mode.beginKeywords; + delete mode.beginKeywords; + + // prevents double relevance, the keywords themselves provide + // relevance, the mode doesn't need to double it + // eslint-disable-next-line no-undefined + if (mode.relevance === undefined) mode.relevance = 0; + } + + /** + * Allow `illegal` to contain an array of illegal values + * @type {CompilerExt} + */ + function compileIllegal(mode, _parent) { + if (!Array.isArray(mode.illegal)) return; + + mode.illegal = either(...mode.illegal); + } + + /** + * `match` to match a single expression for readability + * @type {CompilerExt} + */ + function compileMatch(mode, _parent) { + if (!mode.match) return; + if (mode.begin || mode.end) { + throw new Error("begin & end are not supported with match"); + } + + mode.begin = mode.match; + delete mode.match; + } + + /** + * provides the default 1 relevance to all modes + * @type {CompilerExt} + */ + function compileRelevance(mode, _parent) { + // eslint-disable-next-line no-undefined + if (mode.relevance === undefined) mode.relevance = 1; + } + + // allow beforeMatch to act as a "qualifier" for the match + // the full match begin must be [beforeMatch][begin] + const beforeMatchExt = (mode, parent) => { + if (!mode.beforeMatch) return; + // starts conflicts with endsParent which we need to make sure the child + // rule is not matched multiple times + if (mode.starts) throw new Error("beforeMatch cannot be used with starts"); + + const originalMode = Object.assign({}, mode); + Object.keys(mode).forEach((key) => { + delete mode[key]; + }); + + mode.keywords = originalMode.keywords; + mode.begin = concat( + originalMode.beforeMatch, + lookahead(originalMode.begin), + ); + mode.starts = { + relevance: 0, + contains: [ + Object.assign(originalMode, { endsParent: true }), + ], + }; + mode.relevance = 0; + + delete originalMode.beforeMatch; + }; + + // keywords that should have no default relevance value + const COMMON_KEYWORDS = [ + "of", + "and", + "for", + "in", + "not", + "or", + "if", + "then", + "parent", // common variable name + "list", // common variable name + "value", // common variable name + ]; + + const DEFAULT_KEYWORD_SCOPE = "keyword"; + + /** + * Given raw keywords from a language definition, compile them. + * + * @param {string | Record | Array} rawKeywords + * @param {boolean} caseInsensitive + */ + function compileKeywords( + rawKeywords, + caseInsensitive, + scopeName = DEFAULT_KEYWORD_SCOPE, + ) { + /** @type {import("highlight.js/private").KeywordDict} */ + const compiledKeywords = Object.create(null); + + // input can be a string of keywords, an array of keywords, or a object with + // named keys representing scopeName (which can then point to a string or array) + if (typeof rawKeywords === "string") { + compileList(scopeName, rawKeywords.split(" ")); + } else if (Array.isArray(rawKeywords)) { + compileList(scopeName, rawKeywords); + } else { + Object.keys(rawKeywords).forEach(function (scopeName) { + // collapse all our objects back into the parent object + Object.assign( + compiledKeywords, + compileKeywords(rawKeywords[scopeName], caseInsensitive, scopeName), + ); + }); + } + return compiledKeywords; + + // --- + + /** + * Compiles an individual list of keywords + * + * Ex: "for if when while|5" + * + * @param {string} scopeName + * @param {Array} keywordList + */ + function compileList(scopeName, keywordList) { + if (caseInsensitive) { + keywordList = keywordList.map((x) => x.toLowerCase()); + } + keywordList.forEach(function (keyword) { + const pair = keyword.split("|"); + compiledKeywords[pair[0]] = [ + scopeName, + scoreForKeyword(pair[0], pair[1]), + ]; + }); + } + } + + /** + * Returns the proper score for a given keyword + * + * Also takes into account comment keywords, which will be scored 0 UNLESS + * another score has been manually assigned. + * @param {string} keyword + * @param {string} [providedScore] + */ + function scoreForKeyword(keyword, providedScore) { + // manual scores always win over common keywords + // so you can force a score of 1 if you really insist + if (providedScore) { + return Number(providedScore); + } + + return commonKeyword(keyword) ? 0 : 1; + } + + /** + * Determines if a given keyword is common or not + * + * @param {string} keyword */ + function commonKeyword(keyword) { + return COMMON_KEYWORDS.includes(keyword.toLowerCase()); + } + + /* + + For the reasoning behind this please see: + https://github.com/highlightjs/highlight.js/issues/2880#issuecomment-747275419 + + */ + + /** + * @type {Record} + */ + const seenDeprecations = {}; + + /** + * @param {string} message + */ + const error = (message) => { + console.error(message); + }; + + /** + * @param {string} message + * @param {any} args + */ + const warn = (message, ...args) => { + console.log(`WARN: ${message}`, ...args); + }; + + /** + * @param {string} version + * @param {string} message + */ + const deprecated = (version, message) => { + if (seenDeprecations[`${version}/${message}`]) return; + + console.log(`Deprecated as of ${version}. ${message}`); + seenDeprecations[`${version}/${message}`] = true; + }; + + /* eslint-disable no-throw-literal */ + + /** + @typedef {import('highlight.js').CompiledMode} CompiledMode + */ + + const MultiClassError = new Error(); + + /** + * Renumbers labeled scope names to account for additional inner match + * groups that otherwise would break everything. + * + * Lets say we 3 match scopes: + * + * { 1 => ..., 2 => ..., 3 => ... } + * + * So what we need is a clean match like this: + * + * (a)(b)(c) => [ "a", "b", "c" ] + * + * But this falls apart with inner match groups: + * + * (a)(((b)))(c) => ["a", "b", "b", "b", "c" ] + * + * Our scopes are now "out of alignment" and we're repeating `b` 3 times. + * What needs to happen is the numbers are remapped: + * + * { 1 => ..., 2 => ..., 5 => ... } + * + * We also need to know that the ONLY groups that should be output + * are 1, 2, and 5. This function handles this behavior. + * + * @param {CompiledMode} mode + * @param {Array} regexes + * @param {{key: "beginScope"|"endScope"}} opts + */ + function remapScopeNames(mode, regexes, { key }) { + let offset = 0; + const scopeNames = mode[key]; + /** @type Record */ + const emit = {}; + /** @type Record */ + const positions = {}; + + for (let i = 1; i <= regexes.length; i++) { + positions[i + offset] = scopeNames[i]; + emit[i + offset] = true; + offset += countMatchGroups(regexes[i - 1]); + } + // we use _emit to keep track of which match groups are "top-level" to avoid double + // output from inside match groups + mode[key] = positions; + mode[key]._emit = emit; + mode[key]._multi = true; + } + + /** + * @param {CompiledMode} mode + */ + function beginMultiClass(mode) { + if (!Array.isArray(mode.begin)) return; + + if (mode.skip || mode.excludeBegin || mode.returnBegin) { + error( + "skip, excludeBegin, returnBegin not compatible with beginScope: {}", + ); + throw MultiClassError; + } + + if (typeof mode.beginScope !== "object" || mode.beginScope === null) { + error("beginScope must be object"); + throw MultiClassError; + } + + remapScopeNames(mode, mode.begin, { key: "beginScope" }); + mode.begin = _rewriteBackreferences(mode.begin, { joinWith: "" }); + } + + /** + * @param {CompiledMode} mode + */ + function endMultiClass(mode) { + if (!Array.isArray(mode.end)) return; + + if (mode.skip || mode.excludeEnd || mode.returnEnd) { + error("skip, excludeEnd, returnEnd not compatible with endScope: {}"); + throw MultiClassError; + } + + if (typeof mode.endScope !== "object" || mode.endScope === null) { + error("endScope must be object"); + throw MultiClassError; + } + + remapScopeNames(mode, mode.end, { key: "endScope" }); + mode.end = _rewriteBackreferences(mode.end, { joinWith: "" }); + } + + /** + * this exists only to allow `scope: {}` to be used beside `match:` + * Otherwise `beginScope` would necessary and that would look weird + + { + match: [ /def/, /\w+/ ] + scope: { 1: "keyword" , 2: "title" } + } + + * @param {CompiledMode} mode + */ + function scopeSugar(mode) { + if (mode.scope && typeof mode.scope === "object" && mode.scope !== null) { + mode.beginScope = mode.scope; + delete mode.scope; + } + } + + /** + * @param {CompiledMode} mode + */ + function MultiClass(mode) { + scopeSugar(mode); + + if (typeof mode.beginScope === "string") { + mode.beginScope = { _wrap: mode.beginScope }; + } + if (typeof mode.endScope === "string") { + mode.endScope = { _wrap: mode.endScope }; + } + + beginMultiClass(mode); + endMultiClass(mode); + } + + /** + @typedef {import('highlight.js').Mode} Mode + @typedef {import('highlight.js').CompiledMode} CompiledMode + @typedef {import('highlight.js').Language} Language + @typedef {import('highlight.js').HLJSPlugin} HLJSPlugin + @typedef {import('highlight.js').CompiledLanguage} CompiledLanguage + */ + + // compilation + + /** + * Compiles a language definition result + * + * Given the raw result of a language definition (Language), compiles this so + * that it is ready for highlighting code. + * @param {Language} language + * @returns {CompiledLanguage} + */ + function compileLanguage(language) { + /** + * Builds a regex with the case sensitivity of the current language + * + * @param {RegExp | string} value + * @param {boolean} [global] + */ + function langRe(value, global) { + return new RegExp( + source(value), + "m" + + (language.case_insensitive ? "i" : "") + + (language.unicodeRegex ? "u" : "") + + (global ? "g" : ""), + ); + } + + /** + Stores multiple regular expressions and allows you to quickly search for + them all in a string simultaneously - returning the first match. It does + this by creating a huge (a|b|c) regex - each individual item wrapped with () + and joined by `|` - using match groups to track position. When a match is + found checking which position in the array has content allows us to figure + out which of the original regexes / match groups triggered the match. + + The match object itself (the result of `Regex.exec`) is returned but also + enhanced by merging in any meta-data that was registered with the regex. + This is how we keep track of which mode matched, and what type of rule + (`illegal`, `begin`, end, etc). + */ + class MultiRegex { + constructor() { + this.matchIndexes = {}; + // @ts-ignore + this.regexes = []; + this.matchAt = 1; + this.position = 0; + } + + // @ts-ignore + addRule(re, opts) { + opts.position = this.position++; + // @ts-ignore + this.matchIndexes[this.matchAt] = opts; + this.regexes.push([opts, re]); + this.matchAt += countMatchGroups(re) + 1; + } + + compile() { + if (this.regexes.length === 0) { + // avoids the need to check length every time exec is called + // @ts-ignore + this.exec = () => null; + } + const terminators = this.regexes.map((el) => el[1]); + this.matcherRe = langRe( + _rewriteBackreferences(terminators, { joinWith: "|" }), + true, + ); + this.lastIndex = 0; + } + + /** @param {string} s */ + exec(s) { + this.matcherRe.lastIndex = this.lastIndex; + const match = this.matcherRe.exec(s); + if (!match) return null; + + // eslint-disable-next-line no-undefined + const i = match.findIndex((el, i) => i > 0 && el !== undefined); + // @ts-ignore + const matchData = this.matchIndexes[i]; + // trim off any earlier non-relevant match groups (ie, the other regex + // match groups that make up the multi-matcher) + match.splice(0, i); + + return Object.assign(match, matchData); + } + } + + /* + Created to solve the key deficiently with MultiRegex - there is no way to + test for multiple matches at a single location. Why would we need to do + that? In the future a more dynamic engine will allow certain matches to be + ignored. An example: if we matched say the 3rd regex in a large group but + decided to ignore it - we'd need to started testing again at the 4th + regex... but MultiRegex itself gives us no real way to do that. + + So what this class creates MultiRegexs on the fly for whatever search + position they are needed. + + NOTE: These additional MultiRegex objects are created dynamically. For most + grammars most of the time we will never actually need anything more than the + first MultiRegex - so this shouldn't have too much overhead. + + Say this is our search group, and we match regex3, but wish to ignore it. + + regex1 | regex2 | regex3 | regex4 | regex5 ' ie, startAt = 0 + + What we need is a new MultiRegex that only includes the remaining + possibilities: + + regex4 | regex5 ' ie, startAt = 3 + + This class wraps all that complexity up in a simple API... `startAt` decides + where in the array of expressions to start doing the matching. It + auto-increments, so if a match is found at position 2, then startAt will be + set to 3. If the end is reached startAt will return to 0. + + MOST of the time the parser will be setting startAt manually to 0. + */ + class ResumableMultiRegex { + constructor() { + // @ts-ignore + this.rules = []; + // @ts-ignore + this.multiRegexes = []; + this.count = 0; + + this.lastIndex = 0; + this.regexIndex = 0; + } + + // @ts-ignore + getMatcher(index) { + if (this.multiRegexes[index]) return this.multiRegexes[index]; + + const matcher = new MultiRegex(); + this.rules.slice(index).forEach(([re, opts]) => + matcher.addRule(re, opts) + ); + matcher.compile(); + this.multiRegexes[index] = matcher; + return matcher; + } + + resumingScanAtSamePosition() { + return this.regexIndex !== 0; + } + + considerAll() { + this.regexIndex = 0; + } + + // @ts-ignore + addRule(re, opts) { + this.rules.push([re, opts]); + if (opts.type === "begin") this.count++; + } + + /** @param {string} s */ + exec(s) { + const m = this.getMatcher(this.regexIndex); + m.lastIndex = this.lastIndex; + let result = m.exec(s); + + // The following is because we have no easy way to say "resume scanning at the + // existing position but also skip the current rule ONLY". What happens is + // all prior rules are also skipped which can result in matching the wrong + // thing. Example of matching "booger": + + // our matcher is [string, "booger", number] + // + // ....booger.... + + // if "booger" is ignored then we'd really need a regex to scan from the + // SAME position for only: [string, number] but ignoring "booger" (if it + // was the first match), a simple resume would scan ahead who knows how + // far looking only for "number", ignoring potential string matches (or + // future "booger" matches that might be valid.) + + // So what we do: We execute two matchers, one resuming at the same + // position, but the second full matcher starting at the position after: + + // /--- resume first regex match here (for [number]) + // |/---- full match here for [string, "booger", number] + // vv + // ....booger.... + + // Which ever results in a match first is then used. So this 3-4 step + // process essentially allows us to say "match at this position, excluding + // a prior rule that was ignored". + // + // 1. Match "booger" first, ignore. Also proves that [string] does non match. + // 2. Resume matching for [number] + // 3. Match at index + 1 for [string, "booger", number] + // 4. If #2 and #3 result in matches, which came first? + if (this.resumingScanAtSamePosition()) { + if (result && result.index === this.lastIndex); + else { // use the second matcher result + const m2 = this.getMatcher(0); + m2.lastIndex = this.lastIndex + 1; + result = m2.exec(s); + } + } + + if (result) { + this.regexIndex += result.position + 1; + if (this.regexIndex === this.count) { + // wrap-around to considering all matches again + this.considerAll(); + } + } + + return result; + } + } + + /** + * Given a mode, builds a huge ResumableMultiRegex that can be used to walk + * the content and find matches. + * + * @param {CompiledMode} mode + * @returns {ResumableMultiRegex} + */ + function buildModeRegex(mode) { + const mm = new ResumableMultiRegex(); + + mode.contains.forEach((term) => + mm.addRule(term.begin, { rule: term, type: "begin" }) + ); + + if (mode.terminatorEnd) { + mm.addRule(mode.terminatorEnd, { type: "end" }); + } + if (mode.illegal) { + mm.addRule(mode.illegal, { type: "illegal" }); + } + + return mm; + } + + /** skip vs abort vs ignore + * + * @skip - The mode is still entered and exited normally (and contains rules apply), + * but all content is held and added to the parent buffer rather than being + * output when the mode ends. Mostly used with `sublanguage` to build up + * a single large buffer than can be parsed by sublanguage. + * + * - The mode begin ands ends normally. + * - Content matched is added to the parent mode buffer. + * - The parser cursor is moved forward normally. + * + * @abort - A hack placeholder until we have ignore. Aborts the mode (as if it + * never matched) but DOES NOT continue to match subsequent `contains` + * modes. Abort is bad/suboptimal because it can result in modes + * farther down not getting applied because an earlier rule eats the + * content but then aborts. + * + * - The mode does not begin. + * - Content matched by `begin` is added to the mode buffer. + * - The parser cursor is moved forward accordingly. + * + * @ignore - Ignores the mode (as if it never matched) and continues to match any + * subsequent `contains` modes. Ignore isn't technically possible with + * the current parser implementation. + * + * - The mode does not begin. + * - Content matched by `begin` is ignored. + * - The parser cursor is not moved forward. + */ + + /** + * Compiles an individual mode + * + * This can raise an error if the mode contains certain detectable known logic + * issues. + * @param {Mode} mode + * @param {CompiledMode | null} [parent] + * @returns {CompiledMode | never} + */ + function compileMode(mode, parent) { + const cmode = /** @type CompiledMode */ (mode); + if (mode.isCompiled) return cmode; + + [ + scopeClassName, + // do this early so compiler extensions generally don't have to worry about + // the distinction between match/begin + compileMatch, + MultiClass, + beforeMatchExt, + ].forEach((ext) => ext(mode, parent)); + + language.compilerExtensions.forEach((ext) => ext(mode, parent)); + + // __beforeBegin is considered private API, internal use only + mode.__beforeBegin = null; + + [ + beginKeywords, + // do this later so compiler extensions that come earlier have access to the + // raw array if they wanted to perhaps manipulate it, etc. + compileIllegal, + // default to 1 relevance if not specified + compileRelevance, + ].forEach((ext) => ext(mode, parent)); + + mode.isCompiled = true; + + let keywordPattern = null; + if (typeof mode.keywords === "object" && mode.keywords.$pattern) { + // we need a copy because keywords might be compiled multiple times + // so we can't go deleting $pattern from the original on the first + // pass + mode.keywords = Object.assign({}, mode.keywords); + keywordPattern = mode.keywords.$pattern; + delete mode.keywords.$pattern; + } + keywordPattern = keywordPattern || /\w+/; + + if (mode.keywords) { + mode.keywords = compileKeywords( + mode.keywords, + language.case_insensitive, + ); + } + + cmode.keywordPatternRe = langRe(keywordPattern, true); + + if (parent) { + if (!mode.begin) mode.begin = /\B|\b/; + cmode.beginRe = langRe(cmode.begin); + if (!mode.end && !mode.endsWithParent) mode.end = /\B|\b/; + if (mode.end) cmode.endRe = langRe(cmode.end); + cmode.terminatorEnd = source(cmode.end) || ""; + if (mode.endsWithParent && parent.terminatorEnd) { + cmode.terminatorEnd += (mode.end ? "|" : "") + parent.terminatorEnd; + } + } + if (mode.illegal) { + cmode.illegalRe = langRe(/** @type {RegExp | string} */ (mode.illegal)); + } + if (!mode.contains) mode.contains = []; + + mode.contains = [].concat(...mode.contains.map(function (c) { + return expandOrCloneMode(c === "self" ? mode : c); + })); + mode.contains.forEach(function (c) { + compileMode(/** @type Mode */ (c), cmode); + }); + + if (mode.starts) { + compileMode(mode.starts, parent); + } + + cmode.matcher = buildModeRegex(cmode); + return cmode; + } + + if (!language.compilerExtensions) language.compilerExtensions = []; + + // self is not valid at the top-level + if (language.contains && language.contains.includes("self")) { + throw new Error( + "ERR: contains `self` is not supported at the top-level of a language. See documentation.", + ); + } + + // we need a null object, which inherit will guarantee + language.classNameAliases = inherit$1(language.classNameAliases || {}); + + return compileMode(/** @type Mode */ (language)); + } + + /** + * Determines if a mode has a dependency on it's parent or not + * + * If a mode does have a parent dependency then often we need to clone it if + * it's used in multiple places so that each copy points to the correct parent, + * where-as modes without a parent can often safely be re-used at the bottom of + * a mode chain. + * + * @param {Mode | null} mode + * @returns {boolean} - is there a dependency on the parent? + */ + function dependencyOnParent(mode) { + if (!mode) return false; + + return mode.endsWithParent || dependencyOnParent(mode.starts); + } + + /** + * Expands a mode or clones it if necessary + * + * This is necessary for modes with parental dependenceis (see notes on + * `dependencyOnParent`) and for nodes that have `variants` - which must then be + * exploded into their own individual modes at compile time. + * + * @param {Mode} mode + * @returns {Mode | Mode[]} + */ + function expandOrCloneMode(mode) { + if (mode.variants && !mode.cachedVariants) { + mode.cachedVariants = mode.variants.map(function (variant) { + return inherit$1(mode, { variants: null }, variant); + }); + } + + // EXPAND + // if we have variants then essentially "replace" the mode with the variants + // this happens in compileMode, where this function is called from + if (mode.cachedVariants) { + return mode.cachedVariants; + } + + // CLONE + // if we have dependencies on parents then we need a unique + // instance of ourselves, so we can be reused with many + // different parents without issue + if (dependencyOnParent(mode)) { + return inherit$1(mode, { + starts: mode.starts ? inherit$1(mode.starts) : null, + }); + } + + if (Object.isFrozen(mode)) { + return inherit$1(mode); + } + + // no special dependency issues, just return ourselves + return mode; + } + + var version = "11.9.0"; + + class HTMLInjectionError extends Error { + constructor(reason, html) { + super(reason); + this.name = "HTMLInjectionError"; + this.html = html; + } + } + + /* + Syntax highlighting with language autodetection. + https://highlightjs.org/ + */ + + /** + @typedef {import('highlight.js').Mode} Mode + @typedef {import('highlight.js').CompiledMode} CompiledMode + @typedef {import('highlight.js').CompiledScope} CompiledScope + @typedef {import('highlight.js').Language} Language + @typedef {import('highlight.js').HLJSApi} HLJSApi + @typedef {import('highlight.js').HLJSPlugin} HLJSPlugin + @typedef {import('highlight.js').PluginEvent} PluginEvent + @typedef {import('highlight.js').HLJSOptions} HLJSOptions + @typedef {import('highlight.js').LanguageFn} LanguageFn + @typedef {import('highlight.js').HighlightedHTMLElement} HighlightedHTMLElement + @typedef {import('highlight.js').BeforeHighlightContext} BeforeHighlightContext + @typedef {import('highlight.js/private').MatchType} MatchType + @typedef {import('highlight.js/private').KeywordData} KeywordData + @typedef {import('highlight.js/private').EnhancedMatch} EnhancedMatch + @typedef {import('highlight.js/private').AnnotatedError} AnnotatedError + @typedef {import('highlight.js').AutoHighlightResult} AutoHighlightResult + @typedef {import('highlight.js').HighlightOptions} HighlightOptions + @typedef {import('highlight.js').HighlightResult} HighlightResult + */ + + const escape = escapeHTML; + const inherit = inherit$1; + const NO_MATCH = Symbol("nomatch"); + const MAX_KEYWORD_HITS = 7; + + /** + * @param {any} hljs - object that is extended (legacy) + * @returns {HLJSApi} + */ + const HLJS = function (hljs) { + // Global internal variables used within the highlight.js library. + /** @type {Record} */ + const languages = Object.create(null); + /** @type {Record} */ + const aliases = Object.create(null); + /** @type {HLJSPlugin[]} */ + const plugins = []; + + // safe/production mode - swallows more errors, tries to keep running + // even if a single syntax or parse hits a fatal error + let SAFE_MODE = true; + const LANGUAGE_NOT_FOUND = + "Could not find the language '{}', did you forget to load/include a language module?"; + /** @type {Language} */ + const PLAINTEXT_LANGUAGE = { + disableAutodetect: true, + name: "Plain text", + contains: [], + }; + + // Global options used when within external APIs. This is modified when + // calling the `hljs.configure` function. + /** @type HLJSOptions */ + let options = { + ignoreUnescapedHTML: false, + throwUnescapedHTML: false, + noHighlightRe: /^(no-?highlight)$/i, + languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, + classPrefix: "hljs-", + cssSelector: "pre code", + languages: null, + // beta configuration options, subject to change, welcome to discuss + // https://github.com/highlightjs/highlight.js/issues/1086 + __emitter: TokenTreeEmitter, + }; + + /* Utility functions */ + + /** + * Tests a language name to see if highlighting should be skipped + * @param {string} languageName + */ + function shouldNotHighlight(languageName) { + return options.noHighlightRe.test(languageName); + } + + /** + * @param {HighlightedHTMLElement} block - the HTML element to determine language for + */ + function blockLanguage(block) { + let classes = block.className + " "; + + classes += block.parentNode ? block.parentNode.className : ""; + + // language-* takes precedence over non-prefixed class names. + const match = options.languageDetectRe.exec(classes); + if (match) { + const language = getLanguage(match[1]); + if (!language) { + warn(LANGUAGE_NOT_FOUND.replace("{}", match[1])); + warn("Falling back to no-highlight mode for this block.", block); + } + return language ? match[1] : "no-highlight"; + } + + return classes + .split(/\s+/) + .find((_class) => shouldNotHighlight(_class) || getLanguage(_class)); + } + + /** + * Core highlighting function. + * + * OLD API + * highlight(lang, code, ignoreIllegals, continuation) + * + * NEW API + * highlight(code, {lang, ignoreIllegals}) + * + * @param {string} codeOrLanguageName - the language to use for highlighting + * @param {string | HighlightOptions} optionsOrCode - the code to highlight + * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail + * + * @returns {HighlightResult} Result - an object that represents the result + * @property {string} language - the language name + * @property {number} relevance - the relevance score + * @property {string} value - the highlighted HTML code + * @property {string} code - the original raw code + * @property {CompiledMode} top - top of the current mode stack + * @property {boolean} illegal - indicates whether any illegal matches were found + */ + function highlight(codeOrLanguageName, optionsOrCode, ignoreIllegals) { + let code = ""; + let languageName = ""; + if (typeof optionsOrCode === "object") { + code = codeOrLanguageName; + ignoreIllegals = optionsOrCode.ignoreIllegals; + languageName = optionsOrCode.language; + } else { + // old API + deprecated( + "10.7.0", + "highlight(lang, code, ...args) has been deprecated.", + ); + deprecated( + "10.7.0", + "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277", + ); + languageName = codeOrLanguageName; + code = optionsOrCode; + } + + // https://github.com/highlightjs/highlight.js/issues/3149 + // eslint-disable-next-line no-undefined + if (ignoreIllegals === undefined) ignoreIllegals = true; + + /** @type {BeforeHighlightContext} */ + const context = { + code, + language: languageName, + }; + // the plugin can change the desired language or the code to be highlighted + // just be changing the object it was passed + fire("before:highlight", context); + + // a before plugin can usurp the result completely by providing it's own + // in which case we don't even need to call highlight + const result = context.result + ? context.result + : _highlight(context.language, context.code, ignoreIllegals); + + result.code = context.code; + // the plugin can change anything in result to suite it + fire("after:highlight", result); + + return result; + } + + /** + * private highlight that's used internally and does not fire callbacks + * + * @param {string} languageName - the language to use for highlighting + * @param {string} codeToHighlight - the code to highlight + * @param {boolean?} [ignoreIllegals] - whether to ignore illegal matches, default is to bail + * @param {CompiledMode?} [continuation] - current continuation mode, if any + * @returns {HighlightResult} - result of the highlight operation + */ + function _highlight( + languageName, + codeToHighlight, + ignoreIllegals, + continuation, + ) { + const keywordHits = Object.create(null); + + /** + * Return keyword data if a match is a keyword + * @param {CompiledMode} mode - current mode + * @param {string} matchText - the textual match + * @returns {KeywordData | false} + */ + function keywordData(mode, matchText) { + return mode.keywords[matchText]; + } + + function processKeywords() { + if (!top.keywords) { + emitter.addText(modeBuffer); + return; + } + + let lastIndex = 0; + top.keywordPatternRe.lastIndex = 0; + let match = top.keywordPatternRe.exec(modeBuffer); + let buf = ""; + + while (match) { + buf += modeBuffer.substring(lastIndex, match.index); + const word = language.case_insensitive + ? match[0].toLowerCase() + : match[0]; + const data = keywordData(top, word); + if (data) { + const [kind, keywordRelevance] = data; + emitter.addText(buf); + buf = ""; + + keywordHits[word] = (keywordHits[word] || 0) + 1; + if (keywordHits[word] <= MAX_KEYWORD_HITS) { + relevance += keywordRelevance; + } + if (kind.startsWith("_")) { + // _ implied for relevance only, do not highlight + // by applying a class name + buf += match[0]; + } else { + const cssClass = language.classNameAliases[kind] || kind; + emitKeyword(match[0], cssClass); + } + } else { + buf += match[0]; + } + lastIndex = top.keywordPatternRe.lastIndex; + match = top.keywordPatternRe.exec(modeBuffer); + } + buf += modeBuffer.substring(lastIndex); + emitter.addText(buf); + } + + function processSubLanguage() { + if (modeBuffer === "") return; + /** @type HighlightResult */ + let result = null; + + if (typeof top.subLanguage === "string") { + if (!languages[top.subLanguage]) { + emitter.addText(modeBuffer); + return; + } + result = _highlight( + top.subLanguage, + modeBuffer, + true, + continuations[top.subLanguage], + ); + continuations[top.subLanguage] = + /** @type {CompiledMode} */ (result._top); + } else { + result = highlightAuto( + modeBuffer, + top.subLanguage.length ? top.subLanguage : null, + ); + } + + // Counting embedded language score towards the host language may be disabled + // with zeroing the containing mode relevance. Use case in point is Markdown that + // allows XML everywhere and makes every XML snippet to have a much larger Markdown + // score. + if (top.relevance > 0) { + relevance += result.relevance; + } + emitter.__addSublanguage(result._emitter, result.language); + } + + function processBuffer() { + if (top.subLanguage != null) { + processSubLanguage(); + } else { + processKeywords(); + } + modeBuffer = ""; + } + + /** + * @param {string} text + * @param {string} scope + */ + function emitKeyword(keyword, scope) { + if (keyword === "") return; + + emitter.startScope(scope); + emitter.addText(keyword); + emitter.endScope(); + } + + /** + * @param {CompiledScope} scope + * @param {RegExpMatchArray} match + */ + function emitMultiClass(scope, match) { + let i = 1; + const max = match.length - 1; + while (i <= max) { + if (!scope._emit[i]) { + i++; + continue; + } + const klass = language.classNameAliases[scope[i]] || scope[i]; + const text = match[i]; + if (klass) { + emitKeyword(text, klass); + } else { + modeBuffer = text; + processKeywords(); + modeBuffer = ""; + } + i++; + } + } + + /** + * @param {CompiledMode} mode - new mode to start + * @param {RegExpMatchArray} match + */ + function startNewMode(mode, match) { + if (mode.scope && typeof mode.scope === "string") { + emitter.openNode(language.classNameAliases[mode.scope] || mode.scope); + } + if (mode.beginScope) { + // beginScope just wraps the begin match itself in a scope + if (mode.beginScope._wrap) { + emitKeyword( + modeBuffer, + language.classNameAliases[mode.beginScope._wrap] || + mode.beginScope._wrap, + ); + modeBuffer = ""; + } else if (mode.beginScope._multi) { + // at this point modeBuffer should just be the match + emitMultiClass(mode.beginScope, match); + modeBuffer = ""; + } + } + + top = Object.create(mode, { parent: { value: top } }); + return top; + } + + /** + * @param {CompiledMode } mode - the mode to potentially end + * @param {RegExpMatchArray} match - the latest match + * @param {string} matchPlusRemainder - match plus remainder of content + * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode + */ + function endOfMode(mode, match, matchPlusRemainder) { + let matched = startsWith(mode.endRe, matchPlusRemainder); + + if (matched) { + if (mode["on:end"]) { + const resp = new Response(mode); + mode["on:end"](match, resp); + if (resp.isMatchIgnored) matched = false; + } + + if (matched) { + while (mode.endsParent && mode.parent) { + mode = mode.parent; + } + return mode; + } + } + // even if on:end fires an `ignore` it's still possible + // that we might trigger the end node because of a parent mode + if (mode.endsWithParent) { + return endOfMode(mode.parent, match, matchPlusRemainder); + } + } + + /** + * Handle matching but then ignoring a sequence of text + * + * @param {string} lexeme - string containing full match text + */ + function doIgnore(lexeme) { + if (top.matcher.regexIndex === 0) { + // no more regexes to potentially match here, so we move the cursor forward one + // space + modeBuffer += lexeme[0]; + return 1; + } else { + // no need to move the cursor, we still have additional regexes to try and + // match at this very spot + resumeScanAtSamePosition = true; + return 0; + } + } + + /** + * Handle the start of a new potential mode match + * + * @param {EnhancedMatch} match - the current match + * @returns {number} how far to advance the parse cursor + */ + function doBeginMatch(match) { + const lexeme = match[0]; + const newMode = match.rule; + + const resp = new Response(newMode); + // first internal before callbacks, then the public ones + const beforeCallbacks = [newMode.__beforeBegin, newMode["on:begin"]]; + for (const cb of beforeCallbacks) { + if (!cb) continue; + cb(match, resp); + if (resp.isMatchIgnored) return doIgnore(lexeme); + } + + if (newMode.skip) { + modeBuffer += lexeme; + } else { + if (newMode.excludeBegin) { + modeBuffer += lexeme; + } + processBuffer(); + if (!newMode.returnBegin && !newMode.excludeBegin) { + modeBuffer = lexeme; + } + } + startNewMode(newMode, match); + return newMode.returnBegin ? 0 : lexeme.length; + } + + /** + * Handle the potential end of mode + * + * @param {RegExpMatchArray} match - the current match + */ + function doEndMatch(match) { + const lexeme = match[0]; + const matchPlusRemainder = codeToHighlight.substring(match.index); + + const endMode = endOfMode(top, match, matchPlusRemainder); + if (!endMode) return NO_MATCH; + + const origin = top; + if (top.endScope && top.endScope._wrap) { + processBuffer(); + emitKeyword(lexeme, top.endScope._wrap); + } else if (top.endScope && top.endScope._multi) { + processBuffer(); + emitMultiClass(top.endScope, match); + } else if (origin.skip) { + modeBuffer += lexeme; + } else { + if (!(origin.returnEnd || origin.excludeEnd)) { + modeBuffer += lexeme; + } + processBuffer(); + if (origin.excludeEnd) { + modeBuffer = lexeme; + } + } + do { + if (top.scope) { + emitter.closeNode(); + } + if (!top.skip && !top.subLanguage) { + relevance += top.relevance; + } + top = top.parent; + } while (top !== endMode.parent); + if (endMode.starts) { + startNewMode(endMode.starts, match); + } + return origin.returnEnd ? 0 : lexeme.length; + } + + function processContinuations() { + const list = []; + for ( + let current = top; + current !== language; + current = current.parent + ) { + if (current.scope) { + list.unshift(current.scope); + } + } + list.forEach((item) => emitter.openNode(item)); + } + + /** @type {{type?: MatchType, index?: number, rule?: Mode}}} */ + let lastMatch = {}; + + /** + * Process an individual match + * + * @param {string} textBeforeMatch - text preceding the match (since the last match) + * @param {EnhancedMatch} [match] - the match itself + */ + function processLexeme(textBeforeMatch, match) { + const lexeme = match && match[0]; + + // add non-matched text to the current mode buffer + modeBuffer += textBeforeMatch; + + if (lexeme == null) { + processBuffer(); + return 0; + } + + // we've found a 0 width match and we're stuck, so we need to advance + // this happens when we have badly behaved rules that have optional matchers to the degree that + // sometimes they can end up matching nothing at all + // Ref: https://github.com/highlightjs/highlight.js/issues/2140 + if ( + lastMatch.type === "begin" && match.type === "end" && + lastMatch.index === match.index && lexeme === "" + ) { + // spit the "skipped" character that our regex choked on back into the output sequence + modeBuffer += codeToHighlight.slice(match.index, match.index + 1); + if (!SAFE_MODE) { + /** @type {AnnotatedError} */ + const err = new Error(`0 width match regex (${languageName})`); + err.languageName = languageName; + err.badRule = lastMatch.rule; + throw err; + } + return 1; + } + lastMatch = match; + + if (match.type === "begin") { + return doBeginMatch(match); + } else if (match.type === "illegal" && !ignoreIllegals) { + // illegal match, we do not continue processing + /** @type {AnnotatedError} */ + const err = new Error( + 'Illegal lexeme "' + lexeme + '" for mode "' + + (top.scope || "") + '"', + ); + err.mode = top; + throw err; + } else if (match.type === "end") { + const processed = doEndMatch(match); + if (processed !== NO_MATCH) { + return processed; + } + } + + // edge case for when illegal matches $ (end of line) which is technically + // a 0 width match but not a begin/end match so it's not caught by the + // first handler (when ignoreIllegals is true) + if (match.type === "illegal" && lexeme === "") { + // advance so we aren't stuck in an infinite loop + return 1; + } + + // infinite loops are BAD, this is a last ditch catch all. if we have a + // decent number of iterations yet our index (cursor position in our + // parsing) still 3x behind our index then something is very wrong + // so we bail + if (iterations > 100000 && iterations > match.index * 3) { + const err = new Error( + "potential infinite loop, way more iterations than matches", + ); + throw err; + } + + /* + Why might be find ourselves here? An potential end match that was + triggered but could not be completed. IE, `doEndMatch` returned NO_MATCH. + (this could be because a callback requests the match be ignored, etc) + + This causes no real harm other than stopping a few times too many. + */ + + modeBuffer += lexeme; + return lexeme.length; + } + + const language = getLanguage(languageName); + if (!language) { + error(LANGUAGE_NOT_FOUND.replace("{}", languageName)); + throw new Error('Unknown language: "' + languageName + '"'); + } + + const md = compileLanguage(language); + let result = ""; + /** @type {CompiledMode} */ + let top = continuation || md; + /** @type Record */ + const continuations = {}; // keep continuations for sub-languages + const emitter = new options.__emitter(options); + processContinuations(); + let modeBuffer = ""; + let relevance = 0; + let index = 0; + let iterations = 0; + let resumeScanAtSamePosition = false; + + try { + if (!language.__emitTokens) { + top.matcher.considerAll(); + + for (;;) { + iterations++; + if (resumeScanAtSamePosition) { + // only regexes not matched previously will now be + // considered for a potential match + resumeScanAtSamePosition = false; + } else { + top.matcher.considerAll(); + } + top.matcher.lastIndex = index; + + const match = top.matcher.exec(codeToHighlight); + // console.log("match", match[0], match.rule && match.rule.begin) + + if (!match) break; + + const beforeMatch = codeToHighlight.substring(index, match.index); + const processedCount = processLexeme(beforeMatch, match); + index = match.index + processedCount; + } + processLexeme(codeToHighlight.substring(index)); + } else { + language.__emitTokens(codeToHighlight, emitter); + } + + emitter.finalize(); + result = emitter.toHTML(); + + return { + language: languageName, + value: result, + relevance, + illegal: false, + _emitter: emitter, + _top: top, + }; + } catch (err) { + if (err.message && err.message.includes("Illegal")) { + return { + language: languageName, + value: escape(codeToHighlight), + illegal: true, + relevance: 0, + _illegalBy: { + message: err.message, + index, + context: codeToHighlight.slice(index - 100, index + 100), + mode: err.mode, + resultSoFar: result, + }, + _emitter: emitter, + }; + } else if (SAFE_MODE) { + return { + language: languageName, + value: escape(codeToHighlight), + illegal: false, + relevance: 0, + errorRaised: err, + _emitter: emitter, + _top: top, + }; + } else { + throw err; + } + } + } + + /** + * returns a valid highlight result, without actually doing any actual work, + * auto highlight starts with this and it's possible for small snippets that + * auto-detection may not find a better match + * @param {string} code + * @returns {HighlightResult} + */ + function justTextHighlightResult(code) { + const result = { + value: escape(code), + illegal: false, + relevance: 0, + _top: PLAINTEXT_LANGUAGE, + _emitter: new options.__emitter(options), + }; + result._emitter.addText(code); + return result; + } + + /** + Highlighting with language detection. Accepts a string with the code to + highlight. Returns an object with the following properties: + + - language (detected language) + - relevance (int) + - value (an HTML string with highlighting markup) + - secondBest (object with the same structure for second-best heuristically + detected language, may be absent) + + @param {string} code + @param {Array} [languageSubset] + @returns {AutoHighlightResult} + */ + function highlightAuto(code, languageSubset) { + languageSubset = languageSubset || options.languages || + Object.keys(languages); + const plaintext = justTextHighlightResult(code); + + const results = languageSubset.filter(getLanguage).filter(autoDetection) + .map((name) => _highlight(name, code, false)); + results.unshift(plaintext); // plaintext is always an option + + const sorted = results.sort((a, b) => { + // sort base on relevance + if (a.relevance !== b.relevance) return b.relevance - a.relevance; + + // always award the tie to the base language + // ie if C++ and Arduino are tied, it's more likely to be C++ + if (a.language && b.language) { + if (getLanguage(a.language).supersetOf === b.language) { + return 1; + } else if (getLanguage(b.language).supersetOf === a.language) { + return -1; + } + } + + // otherwise say they are equal, which has the effect of sorting on + // relevance while preserving the original ordering - which is how ties + // have historically been settled, ie the language that comes first always + // wins in the case of a tie + return 0; + }); + + const [best, secondBest] = sorted; + + /** @type {AutoHighlightResult} */ + const result = best; + result.secondBest = secondBest; + + return result; + } + + /** + * Builds new class name for block given the language name + * + * @param {HTMLElement} element + * @param {string} [currentLang] + * @param {string} [resultLang] + */ + function updateClassName(element, currentLang, resultLang) { + const language = (currentLang && aliases[currentLang]) || resultLang; + + element.classList.add("hljs"); + element.classList.add(`language-${language}`); + } + + /** + * Applies highlighting to a DOM node containing code. + * + * @param {HighlightedHTMLElement} element - the HTML element to highlight + */ + function highlightElement(element) { + /** @type HTMLElement */ + let node = null; + const language = blockLanguage(element); + + if (shouldNotHighlight(language)) return; + + fire("before:highlightElement", { el: element, language }); + + if (element.dataset.highlighted) { + console.log( + "Element previously highlighted. To highlight again, first unset `dataset.highlighted`.", + element, + ); + return; + } + + // we should be all text, no child nodes (unescaped HTML) - this is possibly + // an HTML injection attack - it's likely too late if this is already in + // production (the code has likely already done its damage by the time + // we're seeing it)... but we yell loudly about this so that hopefully it's + // more likely to be caught in development before making it to production + if (element.children.length > 0) { + if (!options.ignoreUnescapedHTML) { + console.warn( + "One of your code blocks includes unescaped HTML. This is a potentially serious security risk.", + ); + console.warn( + "https://github.com/highlightjs/highlight.js/wiki/security", + ); + console.warn("The element with unescaped HTML:"); + console.warn(element); + } + if (options.throwUnescapedHTML) { + const err = new HTMLInjectionError( + "One of your code blocks includes unescaped HTML.", + element.innerHTML, + ); + throw err; + } + } + + node = element; + const text = node.textContent; + const result = language + ? highlight(text, { language, ignoreIllegals: true }) + : highlightAuto(text); + + element.innerHTML = result.value; + element.dataset.highlighted = "yes"; + updateClassName(element, language, result.language); + element.result = { + language: result.language, + // TODO: remove with version 11.0 + re: result.relevance, + relevance: result.relevance, + }; + if (result.secondBest) { + element.secondBest = { + language: result.secondBest.language, + relevance: result.secondBest.relevance, + }; + } + + fire("after:highlightElement", { el: element, result, text }); + } + + /** + * Updates highlight.js global options with the passed options + * + * @param {Partial} userOptions + */ + function configure(userOptions) { + options = inherit(options, userOptions); + } + + // TODO: remove v12, deprecated + const initHighlighting = () => { + highlightAll(); + deprecated( + "10.6.0", + "initHighlighting() deprecated. Use highlightAll() now.", + ); + }; + + // TODO: remove v12, deprecated + function initHighlightingOnLoad() { + highlightAll(); + deprecated( + "10.6.0", + "initHighlightingOnLoad() deprecated. Use highlightAll() now.", + ); + } + + let wantsHighlight = false; + + /** + * auto-highlights all pre>code elements on the page + */ + function highlightAll() { + // if we are called too early in the loading process + if (document.readyState === "loading") { + wantsHighlight = true; + return; + } + + const blocks = document.querySelectorAll(options.cssSelector); + blocks.forEach(highlightElement); + } + + function boot() { + // if a highlight was requested before DOM was loaded, do now + if (wantsHighlight) highlightAll(); + } + + // make sure we are in the browser environment + if (typeof window !== "undefined" && window.addEventListener) { + window.addEventListener("DOMContentLoaded", boot, false); + } + + /** + * Register a language grammar module + * + * @param {string} languageName + * @param {LanguageFn} languageDefinition + */ + function registerLanguage(languageName, languageDefinition) { + let lang = null; + try { + lang = languageDefinition(hljs); + } catch (error$1) { + error( + "Language definition for '{}' could not be registered.".replace( + "{}", + languageName, + ), + ); + // hard or soft error + if (!SAFE_MODE) throw error$1; + else error(error$1); + // languages that have serious errors are replaced with essentially a + // "plaintext" stand-in so that the code blocks will still get normal + // css classes applied to them - and one bad language won't break the + // entire highlighter + lang = PLAINTEXT_LANGUAGE; + } + // give it a temporary name if it doesn't have one in the meta-data + if (!lang.name) lang.name = languageName; + languages[languageName] = lang; + lang.rawDefinition = languageDefinition.bind(null, hljs); + + if (lang.aliases) { + registerAliases(lang.aliases, { languageName }); + } + } + + /** + * Remove a language grammar module + * + * @param {string} languageName + */ + function unregisterLanguage(languageName) { + delete languages[languageName]; + for (const alias of Object.keys(aliases)) { + if (aliases[alias] === languageName) { + delete aliases[alias]; + } + } + } + + /** + * @returns {string[]} List of language internal names + */ + function listLanguages() { + return Object.keys(languages); + } + + /** + * @param {string} name - name of the language to retrieve + * @returns {Language | undefined} + */ + function getLanguage(name) { + name = (name || "").toLowerCase(); + return languages[name] || languages[aliases[name]]; + } + + /** + * @param {string|string[]} aliasList - single alias or list of aliases + * @param {{languageName: string}} opts + */ + function registerAliases(aliasList, { languageName }) { + if (typeof aliasList === "string") { + aliasList = [aliasList]; + } + aliasList.forEach((alias) => { + aliases[alias.toLowerCase()] = languageName; + }); + } + + /** + * Determines if a given language has auto-detection enabled + * @param {string} name - name of the language + */ + function autoDetection(name) { + const lang = getLanguage(name); + return lang && !lang.disableAutodetect; + } + + /** + * Upgrades the old highlightBlock plugins to the new + * highlightElement API + * @param {HLJSPlugin} plugin + */ + function upgradePluginAPI(plugin) { + // TODO: remove with v12 + if ( + plugin["before:highlightBlock"] && !plugin["before:highlightElement"] + ) { + plugin["before:highlightElement"] = (data) => { + plugin["before:highlightBlock"]( + Object.assign({ block: data.el }, data), + ); + }; + } + if (plugin["after:highlightBlock"] && !plugin["after:highlightElement"]) { + plugin["after:highlightElement"] = (data) => { + plugin["after:highlightBlock"]( + Object.assign({ block: data.el }, data), + ); + }; + } + } + + /** + * @param {HLJSPlugin} plugin + */ + function addPlugin(plugin) { + upgradePluginAPI(plugin); + plugins.push(plugin); + } + + /** + * @param {HLJSPlugin} plugin + */ + function removePlugin(plugin) { + const index = plugins.indexOf(plugin); + if (index !== -1) { + plugins.splice(index, 1); + } + } + + /** + * @param {PluginEvent} event + * @param {any} args + */ + function fire(event, args) { + const cb = event; + plugins.forEach(function (plugin) { + if (plugin[cb]) { + plugin[cb](args); + } + }); + } + + /** + * DEPRECATED + * @param {HighlightedHTMLElement} el + */ + function deprecateHighlightBlock(el) { + deprecated("10.7.0", "highlightBlock will be removed entirely in v12.0"); + deprecated("10.7.0", "Please use highlightElement now."); + + return highlightElement(el); + } + + /* Interface definition */ + Object.assign(hljs, { + highlight, + highlightAuto, + highlightAll, + highlightElement, + // TODO: Remove with v12 API + highlightBlock: deprecateHighlightBlock, + configure, + initHighlighting, + initHighlightingOnLoad, + registerLanguage, + unregisterLanguage, + listLanguages, + getLanguage, + registerAliases, + autoDetection, + inherit, + addPlugin, + removePlugin, + }); + + hljs.debugMode = function () { + SAFE_MODE = false; + }; + hljs.safeMode = function () { + SAFE_MODE = true; + }; + hljs.versionString = version; + + hljs.regex = { + concat: concat, + lookahead: lookahead, + either: either, + optional: optional, + anyNumberOfTimes: anyNumberOfTimes, + }; + + for (const key in MODES) { + // @ts-ignore + if (typeof MODES[key] === "object") { + // @ts-ignore + deepFreeze(MODES[key]); + } + } + + // merge all the modes/regexes into our main object + Object.assign(hljs, MODES); + + return hljs; + }; + + // Other names for the variable may break build script + const highlight = HLJS({}); + + // returns a new instance of the highlighter to be used for extensions + // check https://github.com/wooorm/lowlight/issues/47 + highlight.newInstance = () => HLJS({}); + + return highlight; +})(); +if (typeof exports === "object" && typeof module !== "undefined") { + module.exports = hljs; +} +/*! `lua` grammar compiled for Highlight.js 11.9.0 */ +(function () { + var hljsGrammar = (function () { + "use strict"; + + /* + Language: Lua + Description: Lua is a powerful, efficient, lightweight, embeddable scripting language. + Author: Andrew Fedorov + Category: common, gaming, scripting + Website: https://www.lua.org + */ + + function lua(hljs) { + const OPENING_LONG_BRACKET = "\\[=*\\["; + const CLOSING_LONG_BRACKET = "\\]=*\\]"; + const LONG_BRACKETS = { + begin: OPENING_LONG_BRACKET, + end: CLOSING_LONG_BRACKET, + contains: ["self"], + }; + const COMMENTS = [ + hljs.COMMENT("--(?!" + OPENING_LONG_BRACKET + ")", "$"), + hljs.COMMENT( + "--" + OPENING_LONG_BRACKET, + CLOSING_LONG_BRACKET, + { + contains: [LONG_BRACKETS], + relevance: 10, + }, + ), + ]; + return { + name: "Lua", + keywords: { + $pattern: hljs.UNDERSCORE_IDENT_RE, + literal: "true false nil", + keyword: + "and break do else elseif end for goto if in local not or repeat return then until while", + built_in: + // Metatags and globals: + "_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len " + + "__gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert " + + // Standard methods and properties: + "collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring " + + "module next pairs pcall print rawequal rawget rawset require select setfenv " + + "setmetatable tonumber tostring type unpack xpcall arg self " + + // Library methods and properties (one line per library): + "coroutine resume yield status wrap create running debug getupvalue " + + "debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv " + + "io lines write close flush open output type read stderr stdin input stdout popen tmpfile " + + "math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan " + + "os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall " + + "string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower " + + "table setn insert getn foreachi maxn foreach concat sort remove", + }, + contains: COMMENTS.concat([ + { + className: "function", + beginKeywords: "function", + end: "\\)", + contains: [ + hljs.inherit(hljs.TITLE_MODE, { + begin: "([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*", + }), + { + className: "params", + begin: "\\(", + endsWithParent: true, + contains: COMMENTS, + }, + ].concat(COMMENTS), + }, + hljs.C_NUMBER_MODE, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + { + className: "string", + begin: OPENING_LONG_BRACKET, + end: CLOSING_LONG_BRACKET, + contains: [LONG_BRACKETS], + relevance: 5, + }, + ]), + }; + } + + return lua; + })(); + + hljs.registerLanguage("lua", hljsGrammar); +})(); /*! `shell` grammar compiled for Highlight.js 11.9.0 */ +(function () { + var hljsGrammar = (function () { + "use strict"; + + /* + Language: Shell Session + Requires: bash.js + Author: TSUYUSATO Kitsune + Category: common + Audit: 2020 + */ + + /** @type LanguageFn */ + function shell(hljs) { + return { + name: "Shell Session", + aliases: [ + "console", + "shellsession", + ], + contains: [ + { + className: "meta.prompt", + // We cannot add \s (spaces) in the regular expression otherwise it will be too broad and produce unexpected result. + // For instance, in the following example, it would match "echo /path/to/home >" as a prompt: + // echo /path/to/home > t.exe + begin: /^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/, + starts: { + end: /[^\\](?=\s*$)/, + subLanguage: "bash", + }, + }, + ], + }; + } + + return shell; + })(); + + hljs.registerLanguage("shell", hljsGrammar); +})(); /*! `typescript` grammar compiled for Highlight.js 11.9.0 */ +(function () { + var hljsGrammar = (function () { + "use strict"; + + const IDENT_RE = "[A-Za-z$_][0-9A-Za-z$_]*"; + const KEYWORDS = [ + "as", // for exports + "in", + "of", + "if", + "for", + "while", + "finally", + "var", + "new", + "function", + "do", + "return", + "void", + "else", + "break", + "catch", + "instanceof", + "with", + "throw", + "case", + "default", + "try", + "switch", + "continue", + "typeof", + "delete", + "let", + "yield", + "const", + "class", + // JS handles these with a special rule + // "get", + // "set", + "debugger", + "async", + "await", + "static", + "import", + "from", + "export", + "extends", + ]; + const LITERALS = [ + "true", + "false", + "null", + "undefined", + "NaN", + "Infinity", + ]; + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects + const TYPES = [ + // Fundamental objects + "Object", + "Function", + "Boolean", + "Symbol", + // numbers and dates + "Math", + "Date", + "Number", + "BigInt", + // text + "String", + "RegExp", + // Indexed collections + "Array", + "Float32Array", + "Float64Array", + "Int8Array", + "Uint8Array", + "Uint8ClampedArray", + "Int16Array", + "Int32Array", + "Uint16Array", + "Uint32Array", + "BigInt64Array", + "BigUint64Array", + // Keyed collections + "Set", + "Map", + "WeakSet", + "WeakMap", + // Structured data + "ArrayBuffer", + "SharedArrayBuffer", + "Atomics", + "DataView", + "JSON", + // Control abstraction objects + "Promise", + "Generator", + "GeneratorFunction", + "AsyncFunction", + // Reflection + "Reflect", + "Proxy", + // Internationalization + "Intl", + // WebAssembly + "WebAssembly", + ]; + + const ERROR_TYPES = [ + "Error", + "EvalError", + "InternalError", + "RangeError", + "ReferenceError", + "SyntaxError", + "TypeError", + "URIError", + ]; + + const BUILT_IN_GLOBALS = [ + "setInterval", + "setTimeout", + "clearInterval", + "clearTimeout", + + "require", + "exports", + + "eval", + "isFinite", + "isNaN", + "parseFloat", + "parseInt", + "decodeURI", + "decodeURIComponent", + "encodeURI", + "encodeURIComponent", + "escape", + "unescape", + ]; + + const BUILT_IN_VARIABLES = [ + "arguments", + "this", + "super", + "console", + "window", + "document", + "localStorage", + "sessionStorage", + "module", + "global", // Node.js + ]; + + const BUILT_INS = [].concat( + BUILT_IN_GLOBALS, + TYPES, + ERROR_TYPES, + ); + + /* + Language: JavaScript + Description: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions. + Category: common, scripting, web + Website: https://developer.mozilla.org/en-US/docs/Web/JavaScript + */ + + /** @type LanguageFn */ + function javascript(hljs) { + const regex = hljs.regex; + /** + * Takes a string like " { + const tag = "", + end: "", + }; + // to avoid some special cases inside isTrulyOpeningTag + const XML_SELF_CLOSING = /<[A-Za-z0-9\\._:-]+\s*\/>/; + const XML_TAG = { + begin: /<[A-Za-z0-9\\._:-]+/, + end: /\/[A-Za-z0-9\\._:-]+>|\/>/, + /** + * @param {RegExpMatchArray} match + * @param {CallbackResponse} response + */ + isTrulyOpeningTag: (match, response) => { + const afterMatchIndex = match[0].length + match.index; + const nextChar = match.input[afterMatchIndex]; + if ( + // HTML should not include another raw `<` inside a tag + // nested type? + // `>`, etc. + nextChar === "<" || + // the , gives away that this is not HTML + // `` + nextChar === "," + ) { + response.ignoreMatch(); + return; + } + + // `` + // Quite possibly a tag, lets look for a matching closing tag... + if (nextChar === ">") { + // if we cannot find a matching closing tag, then we + // will ignore it + if (!hasClosingTag(match, { after: afterMatchIndex })) { + response.ignoreMatch(); + } + } + + // `` (self-closing) + // handled by simpleSelfClosing rule + + let m; + const afterMatch = match.input.substring(afterMatchIndex); + + // some more template typing stuff + // (key?: string) => Modify< + if ((m = afterMatch.match(/^\s*=/))) { + response.ignoreMatch(); + return; + } + + // `` + // technically this could be HTML, but it smells like a type + // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276 + if ((m = afterMatch.match(/^\s+extends\s+/))) { + if (m.index === 0) { + response.ignoreMatch(); + // eslint-disable-next-line no-useless-return + return; + } + } + }, + }; + const KEYWORDS$1 = { + $pattern: IDENT_RE, + keyword: KEYWORDS, + literal: LITERALS, + built_in: BUILT_INS, + "variable.language": BUILT_IN_VARIABLES, + }; + + // https://tc39.es/ecma262/#sec-literals-numeric-literals + const decimalDigits = "[0-9](_?[0-9])*"; + const frac = `\\.(${decimalDigits})`; + // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral + // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals + const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`; + const NUMBER = { + className: "number", + variants: [ + // DecimalLiteral + { + begin: `(\\b(${decimalInteger})((${frac})|\\.)?|(${frac}))` + + `[eE][+-]?(${decimalDigits})\\b`, + }, + { + begin: `\\b(${decimalInteger})\\b((${frac})\\b|\\.)?|(${frac})\\b`, + }, + + // DecimalBigIntegerLiteral + { begin: `\\b(0|[1-9](_?[0-9])*)n\\b` }, + + // NonDecimalIntegerLiteral + { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" }, + { begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" }, + { begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" }, + + // LegacyOctalIntegerLiteral (does not include underscore separators) + // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals + { begin: "\\b0[0-7]+n?\\b" }, + ], + relevance: 0, + }; + + const SUBST = { + className: "subst", + begin: "\\$\\{", + end: "\\}", + keywords: KEYWORDS$1, + contains: [], // defined later + }; + const HTML_TEMPLATE = { + begin: "html`", + end: "", + starts: { + end: "`", + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST, + ], + subLanguage: "xml", + }, + }; + const CSS_TEMPLATE = { + begin: "css`", + end: "", + starts: { + end: "`", + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST, + ], + subLanguage: "css", + }, + }; + const GRAPHQL_TEMPLATE = { + begin: "gql`", + end: "", + starts: { + end: "`", + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST, + ], + subLanguage: "graphql", + }, + }; + const TEMPLATE_STRING = { + className: "string", + begin: "`", + end: "`", + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST, + ], + }; + const JSDOC_COMMENT = hljs.COMMENT( + /\/\*\*(?!\/)/, + "\\*/", + { + relevance: 0, + contains: [ + { + begin: "(?=@[A-Za-z]+)", + relevance: 0, + contains: [ + { + className: "doctag", + begin: "@[A-Za-z]+", + }, + { + className: "type", + begin: "\\{", + end: "\\}", + excludeEnd: true, + excludeBegin: true, + relevance: 0, + }, + { + className: "variable", + begin: IDENT_RE$1 + "(?=\\s*(-)|$)", + endsParent: true, + relevance: 0, + }, + // eat spaces (not newlines) so we can find + // types or variables + { + begin: /(?=[^\n])\s/, + relevance: 0, + }, + ], + }, + ], + }, + ); + const COMMENT = { + className: "comment", + variants: [ + JSDOC_COMMENT, + hljs.C_BLOCK_COMMENT_MODE, + hljs.C_LINE_COMMENT_MODE, + ], + }; + const SUBST_INTERNALS = [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + HTML_TEMPLATE, + CSS_TEMPLATE, + GRAPHQL_TEMPLATE, + TEMPLATE_STRING, + // Skip numbers when they are part of a variable name + { match: /\$\d+/ }, + NUMBER, + // This is intentional: + // See https://github.com/highlightjs/highlight.js/issues/3288 + // hljs.REGEXP_MODE + ]; + SUBST.contains = SUBST_INTERNALS + .concat({ + // we need to pair up {} inside our subst to prevent + // it from ending too early by matching another } + begin: /\{/, + end: /\}/, + keywords: KEYWORDS$1, + contains: [ + "self", + ].concat(SUBST_INTERNALS), + }); + const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains); + const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([ + // eat recursive parens in sub expressions + { + begin: /\(/, + end: /\)/, + keywords: KEYWORDS$1, + contains: ["self"].concat(SUBST_AND_COMMENTS), + }, + ]); + const PARAMS = { + className: "params", + begin: /\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS$1, + contains: PARAMS_CONTAINS, + }; + + // ES6 classes + const CLASS_OR_EXTENDS = { + variants: [ + // class Car extends vehicle + { + match: [ + /class/, + /\s+/, + IDENT_RE$1, + /\s+/, + /extends/, + /\s+/, + regex.concat( + IDENT_RE$1, + "(", + regex.concat(/\./, IDENT_RE$1), + ")*", + ), + ], + scope: { + 1: "keyword", + 3: "title.class", + 5: "keyword", + 7: "title.class.inherited", + }, + }, + // class Car + { + match: [ + /class/, + /\s+/, + IDENT_RE$1, + ], + scope: { + 1: "keyword", + 3: "title.class", + }, + }, + ], + }; + + const CLASS_REFERENCE = { + relevance: 0, + match: regex.either( + // Hard coded exceptions + /\bJSON/, + // Float32Array, OutT + /\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/, + // CSSFactory, CSSFactoryT + /\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/, + // FPs, FPsT + /\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/, + // P + // single letters are not highlighted + // BLAH + // this will be flagged as a UPPER_CASE_CONSTANT instead + ), + className: "title.class", + keywords: { + _: [ + // se we still get relevance credit for JS library classes + ...TYPES, + ...ERROR_TYPES, + ], + }, + }; + + const USE_STRICT = { + label: "use_strict", + className: "meta", + relevance: 10, + begin: /^\s*['"]use (strict|asm)['"]/, + }; + + const FUNCTION_DEFINITION = { + variants: [ + { + match: [ + /function/, + /\s+/, + IDENT_RE$1, + /(?=\s*\()/, + ], + }, + // anonymous function + { + match: [ + /function/, + /\s*(?=\()/, + ], + }, + ], + className: { + 1: "keyword", + 3: "title.function", + }, + label: "func.def", + contains: [PARAMS], + illegal: /%/, + }; + + const UPPER_CASE_CONSTANT = { + relevance: 0, + match: /\b[A-Z][A-Z_0-9]+\b/, + className: "variable.constant", + }; + + function noneOf(list) { + return regex.concat("(?!", list.join("|"), ")"); + } + + const FUNCTION_CALL = { + match: regex.concat( + /\b/, + noneOf([ + ...BUILT_IN_GLOBALS, + "super", + "import", + ]), + IDENT_RE$1, + regex.lookahead(/\(/), + ), + className: "title.function", + relevance: 0, + }; + + const PROPERTY_ACCESS = { + begin: regex.concat( + /\./, + regex.lookahead( + regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/), + ), + ), + end: IDENT_RE$1, + excludeBegin: true, + keywords: "prototype", + className: "property", + relevance: 0, + }; + + const GETTER_OR_SETTER = { + match: [ + /get|set/, + /\s+/, + IDENT_RE$1, + /(?=\()/, + ], + className: { + 1: "keyword", + 3: "title.function", + }, + contains: [ + { // eat to avoid empty params + begin: /\(\)/, + }, + PARAMS, + ], + }; + + const FUNC_LEAD_IN_RE = "(\\(" + + "[^()]*(\\(" + + "[^()]*(\\(" + + "[^()]*" + + "\\)[^()]*)*" + + "\\)[^()]*)*" + + "\\)|" + hljs.UNDERSCORE_IDENT_RE + ")\\s*=>"; + + const FUNCTION_VARIABLE = { + match: [ + /const|var|let/, + /\s+/, + IDENT_RE$1, + /\s*/, + /=\s*/, + /(async\s*)?/, // async is optional + regex.lookahead(FUNC_LEAD_IN_RE), + ], + keywords: "async", + className: { + 1: "keyword", + 3: "title.function", + }, + contains: [ + PARAMS, + ], + }; + + return { + name: "JavaScript", + aliases: ["js", "jsx", "mjs", "cjs"], + keywords: KEYWORDS$1, + // this will be extended by TypeScript + exports: { PARAMS_CONTAINS, CLASS_REFERENCE }, + illegal: /#(?![$_A-z])/, + contains: [ + hljs.SHEBANG({ + label: "shebang", + binary: "node", + relevance: 5, + }), + USE_STRICT, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + HTML_TEMPLATE, + CSS_TEMPLATE, + GRAPHQL_TEMPLATE, + TEMPLATE_STRING, + COMMENT, + // Skip numbers when they are part of a variable name + { match: /\$\d+/ }, + NUMBER, + CLASS_REFERENCE, + { + className: "attr", + begin: IDENT_RE$1 + regex.lookahead(":"), + relevance: 0, + }, + FUNCTION_VARIABLE, + { // "value" container + begin: "(" + hljs.RE_STARTERS_RE + + "|\\b(case|return|throw)\\b)\\s*", + keywords: "return throw case", + relevance: 0, + contains: [ + COMMENT, + hljs.REGEXP_MODE, + { + className: "function", + // we have to count the parens to make sure we actually have the + // correct bounding ( ) before the =>. There could be any number of + // sub-expressions inside also surrounded by parens. + begin: FUNC_LEAD_IN_RE, + returnBegin: true, + end: "\\s*=>", + contains: [ + { + className: "params", + variants: [ + { + begin: hljs.UNDERSCORE_IDENT_RE, + relevance: 0, + }, + { + className: null, + begin: /\(\s*\)/, + skip: true, + }, + { + begin: /\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS$1, + contains: PARAMS_CONTAINS, + }, + ], + }, + ], + }, + { // could be a comma delimited list of params to a function call + begin: /,/, + relevance: 0, + }, + { + match: /\s+/, + relevance: 0, + }, + { // JSX + variants: [ + { begin: FRAGMENT.begin, end: FRAGMENT.end }, + { match: XML_SELF_CLOSING }, + { + begin: XML_TAG.begin, + // we carefully check the opening tag to see if it truly + // is a tag and not a false positive + "on:begin": XML_TAG.isTrulyOpeningTag, + end: XML_TAG.end, + }, + ], + subLanguage: "xml", + contains: [ + { + begin: XML_TAG.begin, + end: XML_TAG.end, + skip: true, + contains: ["self"], + }, + ], + }, + ], + }, + FUNCTION_DEFINITION, + { + // prevent this from getting swallowed up by function + // since they appear "function like" + beginKeywords: "while if switch catch for", + }, + { + // we have to count the parens to make sure we actually have the correct + // bounding ( ). There could be any number of sub-expressions inside + // also surrounded by parens. + begin: "\\b(?!function)" + hljs.UNDERSCORE_IDENT_RE + + "\\(" + // first parens + "[^()]*(\\(" + + "[^()]*(\\(" + + "[^()]*" + + "\\)[^()]*)*" + + "\\)[^()]*)*" + + "\\)\\s*\\{", // end parens + returnBegin: true, + label: "func.def", + contains: [ + PARAMS, + hljs.inherit(hljs.TITLE_MODE, { + begin: IDENT_RE$1, + className: "title.function", + }), + ], + }, + // catch ... so it won't trigger the property rule below + { + match: /\.\.\./, + relevance: 0, + }, + PROPERTY_ACCESS, + // hack: prevents detection of keywords in some circumstances + // .keyword() + // $keyword = x + { + match: "\\$" + IDENT_RE$1, + relevance: 0, + }, + { + match: [/\bconstructor(?=\s*\()/], + className: { 1: "title.function" }, + contains: [PARAMS], + }, + FUNCTION_CALL, + UPPER_CASE_CONSTANT, + CLASS_OR_EXTENDS, + GETTER_OR_SETTER, + { + match: /\$[(.]/, // relevance booster for a pattern common to JS libs: `$(something)` and `$.something` + }, + ], + }; + } + + /* + Language: TypeScript + Author: Panu Horsmalahti + Contributors: Ike Ku + Description: TypeScript is a strict superset of JavaScript + Website: https://www.typescriptlang.org + Category: common, scripting + */ + + /** @type LanguageFn */ + function typescript(hljs) { + const tsLanguage = javascript(hljs); + + const IDENT_RE$1 = IDENT_RE; + const TYPES = [ + "any", + "void", + "number", + "boolean", + "string", + "object", + "never", + "symbol", + "bigint", + "unknown", + ]; + const NAMESPACE = { + beginKeywords: "namespace", + end: /\{/, + excludeEnd: true, + contains: [tsLanguage.exports.CLASS_REFERENCE], + }; + const INTERFACE = { + beginKeywords: "interface", + end: /\{/, + excludeEnd: true, + keywords: { + keyword: "interface extends", + built_in: TYPES, + }, + contains: [tsLanguage.exports.CLASS_REFERENCE], + }; + const USE_STRICT = { + className: "meta", + relevance: 10, + begin: /^\s*['"]use strict['"]/, + }; + const TS_SPECIFIC_KEYWORDS = [ + "type", + "namespace", + "interface", + "public", + "private", + "protected", + "implements", + "declare", + "abstract", + "readonly", + "enum", + "override", + ]; + const KEYWORDS$1 = { + $pattern: IDENT_RE, + keyword: KEYWORDS.concat(TS_SPECIFIC_KEYWORDS), + literal: LITERALS, + built_in: BUILT_INS.concat(TYPES), + "variable.language": BUILT_IN_VARIABLES, + }; + const DECORATOR = { + className: "meta", + begin: "@" + IDENT_RE$1, + }; + + const swapMode = (mode, label, replacement) => { + const indx = mode.contains.findIndex((m) => m.label === label); + if (indx === -1) throw new Error("can not find mode to replace"); + + mode.contains.splice(indx, 1, replacement); + }; + + // this should update anywhere keywords is used since + // it will be the same actual JS object + Object.assign(tsLanguage.keywords, KEYWORDS$1); + + tsLanguage.exports.PARAMS_CONTAINS.push(DECORATOR); + tsLanguage.contains = tsLanguage.contains.concat([ + DECORATOR, + NAMESPACE, + INTERFACE, + ]); + + // TS gets a simpler shebang rule than JS + swapMode(tsLanguage, "shebang", hljs.SHEBANG()); + // JS use strict rule purposely excludes `asm` which makes no sense + swapMode(tsLanguage, "use_strict", USE_STRICT); + + const functionDeclaration = tsLanguage.contains.find((m) => + m.label === "func.def" + ); + functionDeclaration.relevance = 0; // () => {} is more typical in TypeScript + + Object.assign(tsLanguage, { + name: "TypeScript", + aliases: [ + "ts", + "tsx", + "mts", + "cts", + ], + }); + + return tsLanguage; + } + + return typescript; + })(); + + hljs.registerLanguage("typescript", hljsGrammar); +})(); /*! `vim` grammar compiled for Highlight.js 11.9.0 */ +(function () { + var hljsGrammar = (function () { + "use strict"; + + /* + Language: Vim Script + Author: Jun Yang + Description: full keyword and built-in from http://vimdoc.sourceforge.net/htmldoc/ + Website: https://www.vim.org + Category: scripting + */ + + function vim(hljs) { + return { + name: "Vim Script", + keywords: { + $pattern: /[!#@\w]+/, + keyword: + // express version except: ! & * < = > !! # @ @@ + "N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope " + + "cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc " + + "ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 " + + "profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor " + + "so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew " + + "tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ " + + // full version + "Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload " + + "bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap " + + "cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor " + + "endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap " + + "imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview " + + "lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap " + + "nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext " + + "ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding " + + "scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace " + + "startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious " + + "trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew " + + "vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank", + built_in: // built in func + "synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv " + + "complete_check add getwinposx getqflist getwinposy screencol " + + "clearmatches empty extend getcmdpos mzeval garbagecollect setreg " + + "ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable " + + "shiftwidth max sinh isdirectory synID system inputrestore winline " + + "atan visualmode inputlist tabpagewinnr round getregtype mapcheck " + + "hasmapto histdel argidx findfile sha256 exists toupper getcmdline " + + "taglist string getmatches bufnr strftime winwidth bufexists " + + "strtrans tabpagebuflist setcmdpos remote_read printf setloclist " + + "getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval " + + "resolve libcallnr foldclosedend reverse filter has_key bufname " + + "str2float strlen setline getcharmod setbufvar index searchpos " + + "shellescape undofile foldclosed setqflist buflisted strchars str2nr " + + "virtcol floor remove undotree remote_expr winheight gettabwinvar " + + "reltime cursor tabpagenr finddir localtime acos getloclist search " + + "tanh matchend rename gettabvar strdisplaywidth type abs py3eval " + + "setwinvar tolower wildmenumode log10 spellsuggest bufloaded " + + "synconcealed nextnonblank server2client complete settabwinvar " + + "executable input wincol setmatches getftype hlID inputsave " + + "searchpair or screenrow line settabvar histadd deepcopy strpart " + + "remote_peek and eval getftime submatch screenchar winsaveview " + + "matchadd mkdir screenattr getfontname libcall reltimestr getfsize " + + "winnr invert pow getbufline byte2line soundfold repeat fnameescape " + + "tagfiles sin strwidth spellbadword trunc maparg log lispindent " + + "hostname setpos globpath remote_foreground getchar synIDattr " + + "fnamemodify cscope_connection stridx winbufnr indent min " + + "complete_add nr2char searchpairpos inputdialog values matchlist " + + "items hlexists strridx browsedir expand fmod pathshorten line2byte " + + "argc count getwinvar glob foldtextresult getreg foreground cosh " + + "matchdelete has char2nr simplify histget searchdecl iconv " + + "winrestcmd pumvisible writefile foldlevel haslocaldir keys cos " + + "matchstr foldtext histnr tan tempname getcwd byteidx getbufvar " + + "islocked escape eventhandler remote_send serverlist winrestview " + + "synstack pyeval prevnonblank readfile cindent filereadable changenr " + + "exp", + }, + illegal: /;/, + contains: [ + hljs.NUMBER_MODE, + { + className: "string", + begin: "'", + end: "'", + illegal: "\\n", + }, + + /* + A double quote can start either a string or a line comment. Strings are + ended before the end of a line by another double quote and can contain + escaped double-quotes and post-escaped line breaks. + + Also, any double quote at the beginning of a line is a comment but we + don't handle that properly at the moment: any double quote inside will + turn them into a string. Handling it properly will require a smarter + parser. + */ + { + className: "string", + begin: /"(\\"|\n\\|[^"\n])*"/, + }, + hljs.COMMENT('"', "$"), + + { + className: "variable", + begin: /[bwtglsav]:[\w\d_]+/, + }, + { + begin: [ + /\b(?:function|function!)/, + /\s+/, + hljs.IDENT_RE, + ], + className: { + 1: "keyword", + 3: "title", + }, + end: "$", + relevance: 0, + contains: [ + { + className: "params", + begin: "\\(", + end: "\\)", + }, + ], + }, + { + className: "symbol", + begin: /<[\w-]+>/, + }, + ], + }; + } + + return vim; + })(); + + hljs.registerLanguage("vim", hljsGrammar); +})(); From 2fa81e740b432dc2a0ecafc13ea01319e4e3f706 Mon Sep 17 00:00:00 2001 From: Alisue Date: Sun, 4 Feb 2024 16:30:26 +0900 Subject: [PATCH 2/4] :coffee: Add `deno.jsonc` for `deno fmt` --- deno.jsonc | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 deno.jsonc diff --git a/deno.jsonc b/deno.jsonc new file mode 100644 index 0000000..b6d6a7b --- /dev/null +++ b/deno.jsonc @@ -0,0 +1,3 @@ +{ + "exclude": ["theme/**/*", "book/**/*"] +} From 983bb1d8efd2fec880fc472e18fd239c8922d28f Mon Sep 17 00:00:00 2001 From: Alisue Date: Sun, 4 Feb 2024 16:31:05 +0900 Subject: [PATCH 3/4] :coffee: Remove `Makefile` and rewrite `README.md` --- .gitattributes | 1 - .gitignore | 1 - Makefile | 25 ------------------------- README.md | 29 +++++++++++++++++------------ 4 files changed, 17 insertions(+), 39 deletions(-) delete mode 100644 .gitattributes delete mode 100644 Makefile diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index b2c3352..0000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -docs/**/* linguist-generated=true diff --git a/.gitignore b/.gitignore index c6afb2f..5a0bf03 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -/.tools /book diff --git a/Makefile b/Makefile deleted file mode 100644 index 23cc93a..0000000 --- a/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -TOOLS := ${CURDIR}/.tools - -.DEFAULT_GOAL := help - -help: - @cat $(MAKEFILE_LIST) | \ - perl -ne 'print if /^\w+.*##/;' | \ - perl -pe 's/(.*):.*##\s*/sprintf("%-20s",$$1)/eg;' - -tools: FORCE ## Install development tools - @mkdir -p ${TOOLS} - @cargo install mdbook --root ${TOOLS} - @cargo install mdbook-plantuml --root ${TOOLS} - -fmt: FORCE ## Format code - @deno fmt src README.md - -fmt-check: FORCE ## Format check - @deno fmt --check src README.md - -gen: FORCE ## Generate codes - @${TOOLS}/bin/mdbook build - @make fmt - -FORCE: diff --git a/README.md b/README.md index edd4e87..cacda38 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ [![Test](https://github.com/vim-denops/denops-documentation/actions/workflows/test.yml/badge.svg)](https://github.com/vim-denops/denops-documentation/actions/workflows/test.yml) [![Documentation](https://img.shields.io/badge/denops-Documentation-yellow.svg)](https://vim-denops.github.io/denops-documentation/) -This is an official documentation of [denops.vim][denops.vim], an ecosystem of -Vim/Neovim which allows developers to write plugins in [Deno][Deno]. +This is an official documentation of [denops.vim], an ecosystem of Vim/Neovim +which allows developers to write plugins in [Deno]. [denops.vim]: https://github.com/vim-denops/denops.vim [deno]: https://deno.land @@ -20,26 +20,31 @@ To contribute, install the latest versions of the followings in your environment - [Rust](https://www.rust-lang.org/tools/install) - [Deno](https://deno.land/) -Then, install [mdBook](https://github.com/rust-lang/mdBook) and its plugins in -`.tools` directory by +Then, install [mdBook](https://github.com/rust-lang/mdBook) and its plugins ``` -make tools +cargo install mdbook +cargo install mdbook-alerts ``` -Once required tools are installed, execute the following command to generate -static files in [`./docs`](./docs) from markdown files in [`./src`](./src). +Once required tools are installed, execute the following command to serve the +book on http://localhost:3000 ``` -make gen +mdbook serve ``` -Note that all markdown files are formatted with -[Deno's code formatter](https://deno.land/manual/tools/formatter) and checked by -CI thus make sure to format codes by the following command +Or build book into `book` directory ``` -make fmt +mdbook build +``` + +Don't forget to format Markdown files with `deno fmt` before sending a pull +request. + +``` +deno fmt ``` ## See also From 117c25a7a88ff1d88b8bc0c3be4d7af47040f593 Mon Sep 17 00:00:00 2001 From: Alisue Date: Sun, 4 Feb 2024 16:41:25 +0900 Subject: [PATCH 4/4] :coffee: Refine GitHub Actions --- .github/workflows/mdbook.yml | 4 ++-- .github/workflows/reviewdog.yml | 18 ----------------- .github/workflows/test.yml | 34 ++++++++++++++++----------------- README.md | 3 ++- 4 files changed, 20 insertions(+), 39 deletions(-) delete mode 100644 .github/workflows/reviewdog.yml diff --git a/.github/workflows/mdbook.yml b/.github/workflows/mdbook.yml index ef8def8..b7953ff 100644 --- a/.github/workflows/mdbook.yml +++ b/.github/workflows/mdbook.yml @@ -2,7 +2,7 @@ # # To get started with mdBook see: https://rust-lang.github.io/mdBook/index.html # -name: Deploy mdBook site to Pages +name: Deploy on: # Runs on pushes targeting the default branch @@ -37,7 +37,7 @@ jobs: curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -y | sh rustup update cargo install --version ${MDBOOK_VERSION} mdbook - cargo install mdbook-plantuml + cargo install mdbook-alerts - name: Setup Pages id: pages uses: actions/configure-pages@v4 diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml deleted file mode 100644 index b28394e..0000000 --- a/.github/workflows/reviewdog.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: reviewdog - -on: - push: - branches: - - main - pull_request: - -jobs: - misspell: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - name: misspell - uses: reviewdog/action-misspell@v1 - with: - github_token: ${{ secrets.github_token }} - locale: "US" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ec33f1b..e9c1f91 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,21 +2,18 @@ name: Test env: DENO_VERSION: 1.x + MDBOOK_VERSION: 0.4.36 on: push: - branches: - - main pull_request: - branches: - - main jobs: test: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/cache@v2 + - uses: actions/checkout@v4 + - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ @@ -26,17 +23,18 @@ jobs: target/ .tools/ key: ${{ runner.os }}-cargo - - uses: denoland/setup-deno@main + - uses: denoland/setup-deno@v1.1.4 with: deno-version: ${{ env.DENO_VERSION }} - - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - - name: Format - run: make fmt-check - - name: Install tools - run: make tools - - name: Generate + - name: Install mdBook run: | - make gen - git diff --check + curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -y | sh + rustup update + cargo install --version ${MDBOOK_VERSION} mdbook + cargo install mdbook-alerts + - name: Build with mdBook + run: mdbook build + - name: Format + run: deno fmt --check + - name: Misspell + uses: reviewdog/action-misspell@v1.15.0 diff --git a/README.md b/README.md index cacda38..8a638ad 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ -# Denops Documentation +# denops-documentation [![Test](https://github.com/vim-denops/denops-documentation/actions/workflows/test.yml/badge.svg)](https://github.com/vim-denops/denops-documentation/actions/workflows/test.yml) +[![Deploy](https://github.com/vim-denops/denops-documentation/actions/workflows/mdbook.yml/badge.svg)](https://github.com/vim-denops/denops-documentation/actions/workflows/mdbook.yml) [![Documentation](https://img.shields.io/badge/denops-Documentation-yellow.svg)](https://vim-denops.github.io/denops-documentation/) This is an official documentation of [denops.vim], an ecosystem of Vim/Neovim