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.

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:

import type { Entrypoint } from "jsr:@denops/std@^7.0.0";

export const main: Entrypoint = (denops) => {
  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.