A modern Neovim plugin for creating presentations from markdown files. Inspired by the original vimdeck, rewritten from scratch using Treesitter and native Neovim features.
- Treesitter-based markdown parsing (no external dependencies)
- ASCII art headers using figlet (h1 and h2)
- Syntax highlighted code blocks
- Support for all heading levels (h1-h6)
- Lists, blockquotes, and paragraphs
- Clean, distraction-free presentation mode
- Simple navigation with keyboard shortcuts
- Neovim 0.9+ (for Treesitter support)
- figlet (optional, for ASCII art headers)
- markdown Treesitter parser installed
{
'ducks/vimdeck.nvim',
cmd = { 'Vimdeck', 'VimdeckFile' },
opts = {
use_figlet = true,
center_vertical = true,
center_horizontal = true,
}
}use {
'ducks/vimdeck.nvim',
config = function()
require('vimdeck').setup({
use_figlet = true,
center_vertical = true,
center_horizontal = true,
})
end
}For ASCII art headers:
# macOS
brew install figlet
# Debian/Ubuntu
sudo apt install figlet
# Arch Linux
sudo pacman -S figlet
# NixOS (add to your shell.nix or configuration.nix)
pkgs.figlet:TSInstall markdown markdown_inlineWrite your presentation in markdown. Separate slides with horizontal rules:
# First Slide
This is the content
---
# Second Slide
More content here
---
## Last Slide
- Bullet points
- Work greatFrom within Neovim:
# Open a markdown file and start presenting
:e presentation.md
:Vimdeck
# Or present a file directly
:VimdeckFile presentation.mdFrom Lua:
# Present current buffer
require('vimdeck').present()
# Present specific file
require('vimdeck').present_file('presentation.md')While in presentation mode:
- Space / PageDown: Next slide
- Backspace / PageUp: Previous slide
- q / Q: Quit presentation
- gg: Jump to first slide
- G: Jump to last slide
All heading levels (h1-h6) are supported. h1 and h2 are rendered as ASCII art using figlet if available.
# Big Title (ASCII art)
## Subtitle (ASCII art)
### Regular headingFenced code blocks with syntax highlighting:
```lua
function hello()
print("Hello!")
end
```- Item one
- Item two
- Item three> This is a quote
> It spans multiple linesSet global defaults in your Neovim config:
require('vimdeck').setup({
use_figlet = true, # Use figlet for ASCII art headers (default: true)
center_vertical = true, # Center slides vertically (default: true)
center_horizontal = true, # Center slides horizontally (default: true)
margin = 2, # Horizontal margin in columns (default: 2)
wrap = nil, # Text wrapping width, nil = no wrapping (default: nil)
})Override settings for individual presentations using YAML frontmatter:
---
wrap: 80
center_horizontal: true
center_vertical: false
margin: 3
use_figlet: false
---
# First Slide
This presentation will wrap text at 80 characters, center horizontally,
start at the top, use 3-column margins, and skip ASCII art headers.Frontmatter must be at the very beginning of the file, enclosed by --- delimiters.
use_figlet(boolean): Use figlet for ASCII art headers (h1 and h2)header_style(string): Header decoration style when figlet is disabled"underline"- Single/double line underlines (h1 uses ═, h2 uses ─)"box"- Simple box with ┌─┐ characters"double"- Double-line box with ╔═╗ characters"dashed"- Dashed underlines (h1 uses ┄, h2 uses ┈)nil- Plain text (default)
center_vertical(boolean): Center slides vertically in the windowcenter_horizontal(boolean): Center content horizontally in the windowmargin(number): Horizontal margin in columns, applies even when not centeringwrap(number): Wrap long lines at specified character width (useful for prose)
The original vimdeck was a Ruby script that generated temporary files. This plugin:
- Is a native Neovim plugin (no external script needed)
- Uses Treesitter for accurate markdown parsing
- Renders slides dynamically (no temp files)
- Leverages Neovim's built-in syntax highlighting
- Supports all markdown heading levels
- Faster and more integrated with Neovim
See example.md for a sample presentation.
MIT
Inspired by the original vimdeck by Tyler Benziger.





