SmiteshP
nvim-gps
Scheme

Simple statusline component that shows what scope you are working inside

Last updated Apr 2, 2026
476
Stars
42
Forks
6
Issues
0
Stars/day
Attention Score
46
Language breakdown
Scheme 54.5%
Lua 45.3%
Vim Script 0.1%
Files click to expand
README

⚠️ Deprecated! Use nvim-navic instead of this plugin

nvim-navic is an improved version of nvim-gps (a version 2.0!). It accompishes the same task as this plugin, but uses LSP instead of Treesitter. It also adds ability to have coloured icons!

🛰️ nvim-gps

Take this handy dandy gps with you on your coding adventures and always know where you are!

🤔 What is nvim-gps?

nvim-gps is a simple status line component that shows context of the current cursor position in file. It is similar to the statusline function provided by nvim-treesitter, but smarter. Using custom treesitter queries for each language, nvim-gps is able to show exact name of containing class, struct, function, method, etc. along with some fancy symbols!

example

Here is a barebones example how it looks in a statusline

nvim-gps-barebone-demo

Here is a example of how it can look in a fully configured statusline

nvim-gps-demo

✅ Supported Languages

  • Bash (and Zsh)
  • C
  • C++
  • C#
  • Fennel
  • Go
  • Haskell
  • Html
  • Java
  • Javascript (and jsx)
  • JSON
  • LaTeX
  • Lua
  • Norg
  • Nix
  • Ocaml
  • Php
  • Python
  • Ruby
  • Rust
  • TOML
  • Typescript (and tsx)
  • Verilog
  • YAML
  • YANG
  • Zig

⚡️ Requirements

📦 Installation

Install the plugin with your preferred package manager:

packer

-- Lua
use {
	"SmiteshP/nvim-gps",
	requires = "nvim-treesitter/nvim-treesitter"
}

vim-plug

" Vimscript
Plug "nvim-treesitter/nvim-treesitter"
Plug "SmiteshP/nvim-gps"

⚙️ Configuration

nvim-gps provides a setup function that takes in a table with configuration options. The default configuration assumes that you are using a nerd font.

Note: setup function needs to be called once for nvim-gps to work.
-- Lua

-- Default config require("nvim-gps").setup()

-- Lua

-- Customized config require("nvim-gps").setup({

disable_icons = false, -- Setting it to true will disable all icons

icons = { ["class-name"] = ' ', -- Classes and class-like objects ["function-name"] = ' ', -- Functions ["method-name"] = ' ', -- Methods (functions inside class-like objects) ["container-name"] = '⛶ ', -- Containers (example: lua tables) ["tag-name"] = '炙' -- Tags (example: html tags) },

-- Add custom configuration per language or -- Disable the plugin for a language -- Any language not disabled here is enabled by default languages = { -- Some languages have custom icons ["json"] = { icons = { ["array-name"] = ' ', ["object-name"] = ' ', ["null-name"] = '[] ', ["boolean-name"] = 'ﰰﰴ ', ["number-name"] = '# ', ["string-name"] = ' ' } }, ["latex"] = { icons = { ["title-name"] = "# ", ["label-name"] = " ", }, }, ["norg"] = { icons = { ["title-name"] = " ", }, }, ["toml"] = { icons = { ["table-name"] = ' ', ["array-name"] = ' ', ["boolean-name"] = 'ﰰﰴ ', ["date-name"] = ' ', ["date-time-name"] = ' ', ["float-name"] = ' ', ["inline-table-name"] = ' ', ["integer-name"] = '# ', ["string-name"] = ' ', ["time-name"] = ' ' } }, ["verilog"] = { icons = { ["module-name"] = ' ' } }, ["yaml"] = { icons = { ["mapping-name"] = ' ', ["sequence-name"] = ' ', ["null-name"] = '[] ', ["boolean-name"] = 'ﰰﰴ ', ["integer-name"] = '# ', ["float-name"] = ' ', ["string-name"] = ' ' } }, ["yang"] = { icons = { ["module-name"] = " ", ["augment-path"] = " ", ["container-name"] = " ", ["grouping-name"] = " ", ["typedef-name"] = " ", ["identity-name"] = " ", ["list-name"] = "﬘ ", ["leaf-list-name"] = " ", ["leaf-name"] = " ", ["action-name"] = " ", } },

-- Disable for particular languages -- ["bash"] = false, -- disables nvim-gps for bash -- ["go"] = false, -- disables nvim-gps for golang

-- Override default setting for particular languages -- ["ruby"] = { -- separator = '|', -- Overrides default separator with '|' -- icons = { -- -- Default icons not specified in the lang config -- -- will fallback to the default value -- -- "container-name" will fallback to default because it's not set -- ["function-name"] = '', -- to ensure empty values, set an empty string -- ["tag-name"] = '' -- ["class-name"] = '::', -- ["method-name"] = '#', -- } --} },

separator = ' > ',

-- limit for amount of context shown -- 0 means no limit depth = 0,

-- indicator used when context hits depth limit depthlimitindicator = ".." })

🚀 Usage

nvim-gps doesn't modify your statusline by itself, instead you are provided with two functions and it is left up to you to incorporate them into your statusline.

-- Lua
local gps = require("nvim-gps")

gps.is_available() -- Returns boolean value indicating whether a output can be provided gps.get_location() -- Returns a string with context information (or nil if not available)

-- example output: "mystruct > sum"

You can also pass optional arguments to get_location function to override options given in setup function:

opts = {
	disable_icons = false,
	separator = ' > ',
	depth = 0,
	depthlimitindicator = ".."
}

gps.get_location(opts)

These two functions should satisfy the needs of most users, however if you want the raw intermediate data for custom usage you can use the following function:

gps.getdata()      -- Returns a table of intermediate representation of data (which is used by getlocation)
                    -- Table of tables that contain 'text', 'type' and 'icon' for each context

An example output of get_data function:

{
 	{
		text = "mystruct",
		type = "class-name",
		icon = " "
	},
	{
		text = "sum",
		type = "method-name",
		icon = " "
	}
 }

Examples of Integrating with Other Plugins

feline

An example feline setup

-- Lua
local gps = require("nvim-gps")

table.insert(components.active[1], { provider = function() return gps.get_location() end, enabled = function() return gps.is_available() end })

galaxyline

An example galaxyline setup

-- Lua
local gps = require("nvim-gps")

require('galaxyline').section.left[1]= { nvimGPS = { provider = function() return gps.get_location() end, condition = function() return gps.is_available() end } }

lualine

An example lualine setup

-- Lua
local gps = require("nvim-gps")

require("lualine").setup({ sections = { lualine_c = { { gps.getlocation, cond = gps.isavailable }, } } })

vimscript

example setup using native vim way

" vimscript
func! NvimGps() abort
	return luaeval("require'nvim-gps'.is_available()") ?
		\ luaeval("require'nvim-gps'.get_location()") : ''
endf

set statusline+=%{NvimGps()}

windline

example windline setup

-- Lua
local gps = require("nvim-gps")

comps.gps = { function() if gps.is_available() then return gps.get_location() end return '' end, {"white", "black"} }

🔥 Contributions

Is your favorite language not supported? Or did you find something not being captured by the nvim-gps? Please consider opening a issue, or even better make a PR and solve the issue!! 😄

Please read the CONTRIBUTING.md to understand how the treesitter queries work and how you can add/enhance the queries for your favorite programming languages!

🔗 More in this category

© 2026 GitRepoTrend · SmiteshP/nvim-gps · Updated daily from GitHub