toppair
reach.nvim
Lua

Buffer, mark, tabpage, colorscheme switcher for Neovim

Last updated Jul 6, 2026
245
Stars
8
Forks
5
Issues
+1
Stars/day
Attention Score
30
Language breakdown
Lua 99.6%
Vim Script 0.4%
โ–ธ Files click to expand
README

reach.nvim

buffer / mark / tabpage / colorscheme switcher for Neovim.

buffers

Requirements

Installation

Using packer.nvim

use 'toppair/reach.nvim'

Using vim-plug

Plug 'toppair/reach.nvim'

Setup

-- default config
require('reach').setup({
  notifications = true
})

Usage

buffers

-- default
local options = {
  handle = 'auto',              -- 'bufnr' or 'dynamic' or 'auto'
  show_icons = true,
  show_current = false,         -- Include current buffer in the list
  show_modified = true,         -- Show buffer modified indicator
  modified_icon = 'โฌค',          -- Character to use as modified indicator
  grayout_current = true,       -- Wheter to gray out current buffer entry
  force_delete = {},            -- List of filetypes / buftypes to use
                                -- 'bdelete!' on, e.g. { 'terminal' }
  filter = nil,                 -- Function taking bufnr as parameter,
                                -- returning true or false
  sort = nil,                   -- Comparator function (bufnr, bufnr) -> bool
  terminal_char = '\\',         -- Character to use for terminal buffer handles
                                -- when options.handle is 'dynamic'
  grayout = true,               -- Gray out non matching entries

-- A list of characters to use as handles when options.handle == 'auto' autohandles = require('reach.buffers.constant').autohandles, autoexcludehandles = {}, -- A list of characters not to use as handles when -- options.handle == 'auto', e.g. { '8', '9', 'j', 'k' } previous = { enable = true, -- Mark last used buffers with specified chars and colors depth = 2, -- Maximum number of buffers to mark chars = { 'โ€ข' }, -- Characters to use as markers, -- last one is used when depth > #chars groups = { -- Highlight groups for markers, 'String', -- last one is used when depth > #groups 'Comment', }, }, -- A map of action to key that should be used to invoke it actions = { split = '-', vertsplit = '|', tabsplit = ']', delete = '<Space>', priority = '=', }, }

require('reach').buffers(options)

-- Example keymapping vim.keymap.set('n', '<leader>rb', function() require('reach').buffers(buffer_options) end, {})

or command with default options applied:

ReachOpen buffers

When window is open:

  • type in the buffer handle to switch to that buffer, <CR> required if options.handle == 'bufnr' and there are further matches
  • press <Space> to start deleting buffers, if options.handle == 'bufnr' a prompt accepting space separated list of bufnrs is displayed
  • press | to split buffer vertically
  • press - to split buffer horizontally
  • press ] to open buffer in a new tab
If options.handle == 'auto':
  • press = to start assigning priorities to buffers. Buffers with higher priority (1 is higher priority than 2) will have their handles assigned first. This is persistent for each cwd. Set priority to <Space> to remove it.

marks

-- default
local options = {
  filter = function(mark)
    return mark:match('[a-zA-Z]') -- return true to disable
  end,
  -- A map of action to key that should be used to invoke it
  actions = {
    split = '-',
    vertsplit = '|',
    tabsplit = ']',
    delete = '<Space>',
  },
}

require('reach').marks(options)

or command with default options applied:

ReachOpen marks

When window is open:

  • type in the mark handle to jump to that mark
  • press <Space> to start deleting marks
  • press | to split mark vertically
  • press - to split mark horizontally
  • press ] to open mark in a new tab

tabpages

-- default
local options = {
  show_icons = true,
  show_current = false,
  -- A map of action to key that should be used to invoke it
  actions = {
    delete = '<Space>',
  },
}

require('reach').tabpages(options)

or command with default options applied:

ReachOpen tabpages

When window is open:

  • type in the tabpage number to switch to that tabpage
  • press <Space> to start deleting tabpages

colorschemes

-- default
local options = {
  filter = (function()
    local default = {
      'blue', 'darkblue', 'default', 'delek', 'desert', 'elflord', 'evening', 'industry', 'koehler',
      'morning', 'murphy', 'pablo', 'peachpuff', 'ron', 'shine', 'slate', 'torte', 'zellner',
    }

return function(name) return not vim.tbl_contains(default, name) -- return true to disable end end)(), }

require('reach').colorschemes(options)

or command with default options applied:

ReachOpen colorschemes

When window is open:

  • type in the colorscheme handle to set it

Instant switching to nth buffer

-- options as in require('reach').buffers(options)
require('reach').switchtobuffer(n, options)

Highlights

ReachBorder             -> 'Comment'
ReachDirectory          -> 'Directory'
ReachModifiedIndicator  -> 'String'
ReachHandleBuffer       -> 'String'
ReachHandleDelete       -> 'Error'
ReachHandleSplit        -> 'Directory'
ReachTail               -> 'Normal'
ReachHandleMarkLocal    -> 'Type'
ReachHandleMarkGlobal   -> 'Number'
ReachMark               -> 'Normal'
ReachMarkLocation       -> 'Comment'
ReachHandleTabpage      -> 'TabLineSel'
ReachGrayOut            -> 'Comment'
ReachMatchExact         -> 'String'
ReachPriority           -> 'Special'
ReachCurrent            -> 'Title'
๐Ÿ”— More in this category

ยฉ 2026 GitRepoTrend ยท toppair/reach.nvim ยท Updated daily from GitHub