Skip to content
vic

dhamidi/leader

VIM's leader key for your terminal

dhamidi/leader.json
{
"createdAt": "2018-08-06T09:11:23Z",
"defaultBranch": "master",
"description": "VIM's leader key for your terminal",
"fullName": "dhamidi/leader",
"homepage": null,
"language": "Go",
"name": "leader",
"pushedAt": "2020-03-20T09:53:36Z",
"stargazersCount": 43,
"topics": [
"shortcuts",
"terminal",
"vim"
],
"updatedAt": "2025-08-23T16:26:52Z",
"url": "https://github.com/dhamidi/leader"
}

Build Status

![]!(./assets/logo.png)

VIM’s leader key for your terminal! Using leader you can launch predefined commands using a short sequence of key presses instead of having to type out the whole command.

For example, using Leader you could map pressing g followed by c to running git commit.

asciicast

Download the leader binary from here and put it somewhere on your $PATH.

Add the following to your ~/.bashrc or ~/.zshrc:

eval "$(leader init)"

This installs leader and binds it to \.

Add the following to your ~/.config/fish/config.fish:

leader init | source

This installs leader into fish and binds it to \. Additionally it binds Ctrl+V to switch to a new mode in which every key is bound to self-insert. This means you can press Ctrl+V\ to insert a literal \.

Leader is configured through JSON files in various directories.

To get started, put the JSON listed below into ~/.leaderrc. This example configuration file contains shortcuts useful when developing with Golang:

{
"keys": {
"g": {
"name": "go",
"keys": {
"b": "go build .",
"t": {
"name": "test",
"loopingKeys": ["."],
"keys": {
".": "go test .",
"a": "go test ./..."
}
}
}
}
}
}

This produces the following key bindings:

  • g b is bound to running go build .
  • g t . is bound to running go test .
  • g t a is bound to running go test ./...

As this example shows, key maps can be nested to arbitrary depth.

A keymap’s name is used to as a label to indicate which keymap the user is currently in when running leader.

New bindings can be added and removed through the bind subcommand as well:

$ leader bind --global d date
$ grep '"d"' ~/.leaderrc
"d": "date",
$ leader @d
Sat Aug 25 21:06:04 EEST 2018
$ leader bind --unbind --global d
$ leader @d
$

If a key occurs in the list given under a keymap’s loopingKeys entry, this key can be pressed repeatedly to run the same command again.

Leader tries to load a file called .leaderrc from your current working directory. After trying to load that file it checks the parent directory for a .leaderrc, then that directory’s parent directory etc until it has tried loading $HOME/.leaderrc.

The closer a file is to your working directory, the more important keybindings in that file are. For example, binding g b to go build . in ~/.leaderrc and to gulp build in $HOME/projects/project-using-gulp will make leader prefer running gulp build when in your frontend project’s directory and go build elsewhere.

leader # run commands in a new shell through an interactive menu
leader bind KEYS COMMAND # bind KEYS to run COMMAND in the current directory
leader print # show interactive menu, but print commands instead of running them
leader list-keys # list all key bindings
leader init # print shell initialization code for $SHELL
leader help # display leader's man page
leader version # display the current version of leader

The following key bindings are processed by leader itself and cannot be remapped:

KeyFunction
Ctrl+CExit leader
Ctrl+BGo back to the previous menu
UpGo back to the previous menu
LeftGo back to the previous menu
BackspaceGo back to the previous menu

All commands triggered by leader are run in the context of the current shell. This means that cd, pushd and other commands that modify the state of the current shell work without problems in your .leaderrc.

How can I bind keys only in a specific project?
Just create a .leaderrc in your project's root directory. Leader will load that file after loading ~/.leaderrc and merge any project specific settings into your configuration from ~/.leaderrc.