Skip to content

lukoshkin/highlight-whitespace

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Highlight Whitespace

Highlight unwanted whitespace across you project files. The fun part is that you can come up with your own palette of colors used for a specific pattern per a filetype!


Читать на русском 🇷🇺

demo

Go to the Current Colorscheme section to see what each color stands for.
(Unfortunately placing it here breaks syntax highlighting for all multi-line code blocks below it)

Installation

With lazy.nvim

{
  "lukoshkin/highlight-whitespace",
  config=true,
}

With packer.nvim

use "lukoshkin/highlight-whitespace"

Implementation Details

The plugin implements an efficient and flexible approach to "undesired" patterns highlighting:

  • Smart Window Rendering - Scans only the visible part of the buffer to minimize performance impact
  • Regex-Based Pattern Matching - Uses Neovim's regex engine as a compromise between Lua regex and pure regex
  • Extmarks for Highlighting - Leverages Neovim's extmark API for efficient, non-intrusive highlighting
  • Context-Aware Highlighting - Disables highlighting in insert mode at cursor position for better UX
  • Namespace-Based Management - Uses separate highlight namespace to avoid conflicts with other plugins
  • Filetype-Specific Customization - Allows different highlighting patterns and colors per filetype

Highlighting priorities are organized hierarchically:

  • Trailing whitespace - 10
  • Trailing whitespace override (till cursor position) - 11
  • Other pattern highlighting - 12

The core implementation uses Neovim's API for all operations, making it performant even in large files.

Customization

tws keyword - "main" pattern for trailing whitespace highlighting
clear_on_bufleave - boolean opt to clear highlighting in the current buffer before switching to another

lazy.nvim
{
  "lukoshkin/highlight-whitespace",
  opts = {
    tws = "\\s\\+$",
    clear_on_bufleave = false,
    palette = {
      markdown = {
        tws = 'RosyBrown',
        ['\\S\\@<=\\s\\(\\.\\|,\\)\\@='] = 'CadetBlue3',
        ['\\S\\@<= \\{2,\\}\\S\\@='] = 'SkyBlue1',
        ['\\t\\+'] = 'plum4',
      },
      other = {
        tws = 'PaleVioletRed',
        ['\\S\\@<=\\s,\\@='] = 'coral1',
        ['\\S\\@<=\\(#\\|--\\)\\@<! \\{2,3\\}\\S\\@=\\(#\\|--\\)\\@!'] = 'LightGoldenrod3',
        ['\\(#\\|--\\)\\@<= \\{2,\\}\\S\\@='] = '#3B3B3B',
        ['\\S\\@<= \\{3,\\}\\(#\\|--\\)\\@='] = '#3B3B3B',
        ['\\t\\+'] = 'plum4',
      }
    }
  }
}
packer.nvim
use {
  'lukoshkin/highlight-whitespace',
  config = function ()
    require'highlight-whitespace'.setup {
      tws = '\\s\\+$',
      clear_on_bufleave = false,
      palette = {
        markdown = {
          tws = 'RosyBrown',
          ['\\S\\@<=\\s\\(\\.\\|,\\)\\@='] = 'CadetBlue3',
          ['\\S\\@<= \\{2,\\}\\S\\@='] = 'SkyBlue1',
          ['\\t\\+'] = 'plum4',
        },
        other = {
          tws = 'PaleVioletRed',
          ['\\S\\@<=\\s,\\@='] = 'coral1',
          ['\\S\\@<=\\(#\\|--\\)\\@<! \\{2,3\\}\\S\\@=\\(#\\|--\\)\\@!'] = 'LightGoldenrod3',
          ['\\(#\\|--\\)\\@<= \\{2,\\}\\S\\@='] = '#3B3B3B',
          ['\\S\\@<= \\{3,\\}\\(#\\|--\\)\\@='] = '#3B3B3B',
          ['\\t\\+'] = 'plum4',
        }
      }
    }
  end
}

Ignoring filetypes

Ignoring specific filetypes is possible by setting an empty table next to a filetype in the palette.

To highlight only python and markdown filetypes

      palette = {
        python = {
          -- some patterns
        },
        markdown = {
          -- some patterns
        },
        other = {},
      }

To ignore highlighting only in javascript

      palette = {
        javascript = {},
        other = {
          -- some patterns
        },
      }

Current Colorscheme

This section refers to the GIF at the README beginning


$$ {\color{PaleVioletRed}red}\text{ color ─ trailing whitespace in Python (other than md)} $$

$$ {\color{#3B3B3B}dark\ gray}\text{ ─ leading and trailing whitespace in comment sections} $$

$${\color{RosyBrown}brown}\text{ ─ in markdown}$$


$$ {\color{#CDBE70}yellow}\text{ color ─ redundant (multiple) spaces in Python} $$

$${\color{#87CEFF}blue}\text{ ─ in markdown}$$


$${\color{#FF7256}orange}\text{ color ─ a space before a comma in Python}$$

$${\color{#7AC5CD}"green"}\text{ ─ in markdown}$$


$${\color{#8B668B}purple}\text{ color ─ tab indents instead of spaces}$$

About

Highlight unwanted whitespace and more in Vim/Neovim

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages