Skipper.nvim

July 7, 2026 ยท View on GitHub

Skipper.nvim

A lightweight Neovim plugin for fast function navigation using Tree-sitter.

Lua Neovim

Skipper

Demo

https://github.com/user-attachments/assets/b539c3cb-654c-435e-98ed-11bc93823e1a

Features

  • Fast function navigation - Open a popup window listing all functions in the current file
  • Tree-sitter powered - Accurate parsing across multiple languages
  • Jump to definition - Select a function and instantly jump to its location
  • Fuzzy filter - Press / to fuzzy-search functions (telescope-style prompt with live preview)
  • Favorites - Pin frequently used functions to the top of the list
  • Filter favorites - Optionally hide favorited functions from the main list
  • Live preview - See function code in a floating preview as you navigate
  • Fractional sizing - Use percentages (e.g. 0.6 = 60%) for window dimensions that adapt to terminal size
  • Minimal UI - Clean floating window that doesn't interrupt your workflow
  • Customizable - Configure window size, border style, position, and more
  • Generic language support - Works with any language that has a Tree-sitter parser

Supported Languages

LanguageFile TypesExtractor
JavaScript.jsDedicated (handles exports, arrow functions, object methods)
TypeScript.tsDedicated (shared with JS)
React (JSX/TSX).jsx, .tsxDedicated (shared with JS)
Vue.vueDedicated (SFC support via language injections, includes composables and lifecycle hooks)
All othersAnyGeneric (matches any node with "function" or "method" in its type)

The generic extractor covers Lua, Go, Python, Ruby, Rust, C, Java, and any other language with a Tree-sitter parser installed.

Requirements

  • Neovim >= 0.5.0
  • nvim-treesitter with parsers installed for your languages

Installation

lazy.nvim

{
    "beargruug/skipper.nvim",
    config = function()
        require("skipper").setup()
    end,
}

vim-plug

Plug 'beargruug/skipper.nvim'

Then add to your config:

require("skipper").setup()

packer.nvim

use {
    "beargruug/skipper.nvim",
    config = function()
        require("skipper").setup()
    end,
}

Configuration

Skipper.nvim comes with sensible defaults, but you can customize it:

require("skipper").setup({
    win_width = 0.3,            -- Width (fraction 0-1 for %, or integer for columns)
    win_height = 0.2,           -- Height (fraction 0-1 for %, or integer for rows)
    border = "single",          -- Border style ("single", "double", "rounded", "none", or table)
    title = "Skipper",          -- Window title
    filter_favorites = true,    -- Hide favorited functions from the main list
    preview = true,             -- Show live preview of selected function
    preview_height = 0.2,       -- Preview window height
    preview_width = 0.3,        -- Preview window width
    preview_position = "right", -- Preview position ("top", "bottom", "left", "right")
})

Sizing

Window dimensions support both absolute and fractional values:

  • Fractional (0 < value < 1): Interpreted as a percentage of terminal size. E.g. win_width = 0.6 means 60% of columns.
  • Absolute (value >= 1): Used as exact columns/rows. E.g. win_width = 80 means 80 columns.

All sizes are clamped to a minimum of 10 and maximum of terminal_size - 4 at window-open time.

Usage

Commands

CommandDescription
:ShowFunctionsWindowOpen the function navigation window

Keymaps

Add a keymap to quickly open the function window:

vim.keymap.set("n", "<leader>cf", "<cmd>ShowFunctionsWindow<CR>", { desc = "Show functions" })

Or call the Lua API directly:

vim.keymap.set("n", "<leader>cf", function()
    require("skipper").show_functions_window()
end, { desc = "Show functions" })

Window Controls

Once the function window is open:

KeyAction
j / kNavigate up/down the function list
<CR>Jump to the selected function
/Open fuzzy filter
aToggle favorite
xRemove favorite (in favorites section)
qClose the window
<Esc>Close the window
<C-c>Close the window
?Toggle help menu

Fuzzy Filter

Press / to open a telescope-style filter prompt below the function list. As you type, results are filtered using fuzzy matching and the preview updates live.

KeyAction
Type textFilter functions by name
<Up> / <C-k>Move selection up
<Down> / <C-j>Move selection down
<CR>Jump to selected match
<Esc>Cancel filter, restore full list
<C-c>Cancel filter, restore full list

Favorites

Functions can be pinned as favorites. Favorites appear at the top of the list, separated from the main function list. When filter_favorites = true (default), favorited functions are hidden from the main list to avoid duplication.

Health Check

Run :checkhealth skipper to verify your setup. It checks for Tree-sitter availability and installed parsers.

Contributing

Contributions are welcome! Please feel free to submit issues and pull requests.

Status

Skipper.nvim is under active development. Feedback, issue reports, and pull requests are always welcome.

License

MIT