Which key via dmenu.
Project description
wkd
Which-key via dmenu, wkd.
Why?
- I like keychords
- I like which-key
- I like dmenu
If you like these things too then you may like wkd.
Demo
Disclaimer
The version of dmenu that I am using is heavily patched to provide the functionality shown.
Worry not, I provide copies to the individual patches that I am using. There are is also a README with some more info about each patch.
Install
The usual way:
pip install wkd
Requires python3.
Getting started
wkd is what you make it. So lets see how you can configure it.
wkdrc
Here are the following configuration settings, a description of what they do, and their default values:
# "prompt_cmd" is the program to use to display the availible binds. This
# setting supports fzf, or rofi instead of dmenu but you'll have to experiment
# with those. If you do please let me know how it goes and how I can better
# support usage of wkd with those programs.
prompt_cmd = dmenu
# Default args to use when running your prompt_cmd. This supports any arg
# that your version of dmenu supports.
bind_args = None
# Separator between your keybind and the description. A space will get added on
# each side between the key and description.
separator = ->
# If shell is True then your keybind will execute in a shell. Becareful if you
# set this to True.
shell = False
# You can create pretty intricate binds for wkd, but if you perfer multiple
# smaller binds/keys files you can set which dir wkd should look for input/output
# files here. The full path for these defaults would be $XDG_CONFIG_HOME/wkd/binds
# for the binds_dir.
binds_dir = binds
keys_dir = keys
# If you have the grid patch applied to dmenu you can specify the number of columns
# to show. If a value is set then wkd will calculate the needed lines to show all the
# binds at a given level. This is mostly aesthetic but it makes a big difference imo
# as dmenu fills in a column with options before moving to the next column instead of
# filling in all columns in a line and moving to the next line.
columns = 0
bindsrc
The bindsrc file is the default source when updating your keybinds.
The syntax for this file is fairly simple but it is not (to my
knowledge) common so let's go over it!
Top level keybinds
The following is a top level keybind:
# This is a comment, nothing new.
k This is a description == echo "Everything past == is a command."
When you run wkd and press k the command will run.
Some things to note:
- White space only matters between the keybind and the description.
- The keybind can only be a single key.
wkdwill fail to parse bindsrc if the keybind is not a single key.- Everything past the first
==is treated a command.
Prefixes
Top level keybinds are nice but they really aren't much different than a normal keybind. A prefix is a keybind that contains more keybinds/prefixes. Prefixes are a great thing, let's cover them:
# The next line is a prefix
p No command allowed
:s Sub keybind == echo "Notice the colon."
# The next line is another prefix
:i Inner prefix
::t A keybind! == echo "We reached the end."
Things to note:
- A prefix has no command, just a keybind and a description.
- The
:is not just for looks. - If a keybind/prefix is
nnumber of prefixes deep, thenncolons are required for that keybind/prefix.
And that's pretty much it. Let's look at how this translates to a
keys.json file.
The result
You can run wkd -u to update your keys.json file from your bindsrc
file. Side note, the default bindsrc file is located at
$XDG_CONFIG_HOME/wkd along with the resulting keys.json file.
Let's say this is your bindsrc file:
# Browsers prefix
b Browsers
:f Firefox == firefox
# Profiles prefix
:F Firefox profiles
::f Focus == firefox -P Focus
::l Learning == firefox -P Learning
::e Entertainment == firefox -P Entertainment
# Sites prefix
:s Sites
::m My site == firefox "https://www.my-site.org"
::o Other site == firefox "https://www.my-other-site.org"
# emacs prefix
e Emacs
:e Open emacs == emacs
# Projects prefix
:p Projects
::m My project == emacs "~/Projects/My Project"
::o Other project == emacs "~/Projects/My Other Project"
# mpv prefix
m mpv
:m My music == mpv "~/Music/my_playlist.m3u"
:e Empty mpv == mpv --idle=yes
After running wkd -u your keys.json file will look like this:
{
"b -> Browsers": {
"f -> Firefox": "firefox",
"F -> Firefox profiles": {
"f -> Focus": "firefox -P Focus",
"l -> Learning": "firefox -P Learning",
"e -> Entertainment": "firefox -P Entertainment"
},
"s -> Sites": {
"m -> My site": "firefox \"https://www.my-site.org\"",
"o -> Other site": "firefox \"https://www.my-other-site.org\""
}
},
"e -> Emacs": {
"e -> Open emacs": "emacs",
"p -> Projects": {
"m -> My project": "emacs \"~/Projects/My Project\"",
"o -> Other project": "emacs \"~/Projects/My Other Project\""
}
},
"m -> mpv": {
"m -> My music": "mpv \"~/Music/my_playlist.m3u\"",
"e -> Empty mpv": "mpv --idle=yes"
}
}
The keys.json file is what is used when running wkd so you can pick
your poison.
I prefer to set my keybinds through the bindsrc file as I can add
comments and I find it easier to work with.
Usage
Here is the help page for wkd:
usage: wkd [-h] [-d] [-i FILE] [-o FILE] [-p KEYs] [-r FILE | -u]
Which-key via dmenu.
options:
-h, --help show this help message and exit
-d, --debug Instead of (re)writing your keys.json when updating prints to screen.
-i FILE, --input FILE
Can be used with --update to read a different bindsrc file.
-o FILE, --output FILE
Can be used with --update to output to a different keys.json file.
-p KEY(s), --press KEY(s)
Effectively presses KEY(s) after launching.
-r FILE, --read FILE Read an alternate keys.json file. If FILE is a relative path wkd assumes
it is in the $XDG_CONFIG_HOME/wkd/keys directory.
-u, --update Update keybinds using bindsrc. See --input and --output for additional
options.
dmenu
So far wkd has really only been tested with dmenu. However, it works
very, very well with dmenu. Please read the
README in the dmenu/patches directory in
this repo for recommended configuration of dmenu.
Thanks for reading
Hope you like wkd, I sure do.
There are some pretty cool things you can do with it, let me know what you come up with or what you think could be improved!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wkd-0.0.2.tar.gz.
File metadata
- Download URL: wkd-0.0.2.tar.gz
- Upload date:
- Size: 22.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98113cc5634112558782e528256e6a7591e29ad7a5dd7f85f54ab30051ce9387
|
|
| MD5 |
debb08b9bf4b2cd007038cdf0d4888b6
|
|
| BLAKE2b-256 |
8cfd295e2b54b2829477bcb624935c5e16bcebe53799404e2999e5a7e9a49d3c
|
File details
Details for the file wkd-0.0.2-py3-none-any.whl.
File metadata
- Download URL: wkd-0.0.2-py3-none-any.whl
- Upload date:
- Size: 21.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
308b700668bef20279130ebaa4db82532734a68afc8d1ae1f58d3c0b2dae38a8
|
|
| MD5 |
373d0517028bc1c195467295cc655930
|
|
| BLAKE2b-256 |
d141df153ea1f0345ad8381f5831c1c7d4893c9fb14b8ac4312aa84caceb8527
|