Merge pull request 'Replace Vim like binds with normal dmenu like binds by default.' (#22) from normie-binds into master

Reviewed-on: #22
This commit is contained in:
Jacob 2023-07-29 02:26:38 +00:00
commit 1213017dc7
13 changed files with 194 additions and 183 deletions

View file

@ -17,7 +17,7 @@ can be themed to look identical to dmenu.
- Image and icon support - Image and icon support
- Run launcher, supporting both .desktop entries and $PATH - Run launcher, supporting both .desktop entries and $PATH
- fzf-like Fuzzy matching - fzf-like Fuzzy matching
- Vi-like modes - Vi-like modes (see docs/binds-vim.conf)
- History buffer - History buffer
- Configuration file, allowing customizable keybinds - Configuration file, allowing customizable keybinds
- Mouse binds - Mouse binds
@ -121,24 +121,19 @@ To generate a tarball, run `scripts/spmenu_make dist` **in the current
directory**. If you want to generate a pacman package, run directory**. If you want to generate a pacman package, run
`scripts/spmenu_make pkg_arch` instead. `scripts/spmenu_make pkg_arch` instead.
## Vim like keybinds
For those who are familiar with Vim and like Vi-style keybinds,
you can copy `docs/binds-vim.conf` to `~/.config/spmenu/binds.conf`.
This will re-enable normal mode. In other words, it will restore the
keybinds spmenu 3.1.1 had.
## Scripts ## Scripts
There's a page dedicated to user scripts There's a page dedicated to user scripts
[over on the wiki](https://spmenu.speedie.site/User+scripts). Feel [over on the wiki](https://spmenu.speedie.site/User+scripts). Feel
free to contribute and try scripts on there. free to contribute and try scripts on there.
## Simple mode
Some users may find the Vim modes confusing. If this is you, you
can copy [this file](https://git.speedie.site/speedie/spmenu-config/raw/branch/master/binds/simple-keybinds.conf)
to ~/.config/spmenu/binds.conf. This will restore some of
the more traditional dmenu keybinds. Do note that many
keybinds will be missing if you go for this, and keybinds
in spmenu.conf will be unused. One of the changes it makes
is removing normal mode, so insert mode will always be
used instead. Arrow keys are used for navigation
rather than Vim keys.
## Screenshots ## Screenshots
![typing](screenshots/typing.gif) ![typing](screenshots/typing.gif)

96
docs/binds-vim.conf Normal file
View file

@ -0,0 +1,96 @@
/* spmenu default configuration file
*
* Copy to ~/.config/spmenu/spmenu.conf to use.
* Note that you can @include other config files if you want
*
* Arguments will always override options in this configuration file.
*
* Example: @include "config.conf"
*/
bind = {
/* Mouse bindings
*
* See https://spmenu.speedie.site/Configurable+keybindings for a list of valid options.
*/
mouse = (
/* Click Button Function Argument */
{ click = "ClickInput"; button = "Left Click"; function = "clear"; argument = "0"; }, // Left click on input: Clear the input
{ click = "ClickPrompt"; button = "Left Click"; function = "clear"; argument = "0"; }, // Left click on prompt: Clear the input
{ click = "ClickMode"; button = "Left Click"; function = "switchmode"; argument = "0"; }, // Left click on the mode indicator: Toggle mode
{ click = "ClickNumber"; button = "Left Click"; function = "viewhist"; argument = "0"; }, // Click on the match count: Toggle viewing history buffer
{ click = "ClickItem"; button = "Left Click"; function = "selecthover"; argument = "0"; }, // Left click on an item: Select it
{ click = "ClickItem"; button = "Right Click"; function = "markhover"; argument = "0"; }, // Right click on an item: Mark it
{ click = "None"; button = "Scroll Up"; function = "moveprev"; argument = "0"; }, // Scroll Up: Move to the previous page
{ click = "None"; button = "Scroll Down"; function = "movenext"; argument = "0"; }, // Scroll Down: Move to the next page
{
scrolldistance = 512; // Distance to scroll for a scroll action to count. Wayland only (num)
ignoreglobalmouse = 1; // Ignore hardcoded mouse binds (0/1)
} );
/* Keys
*
* It is strongly recommended that you do NOT unbind any switchmode or quit
* function keybinds unless you know exactly what you're doing.
* If you ignore this warning and find that you can't exit spmenu,
* press Ctrl+Alt+Delete. Doing so will exit spmenu, even if no key is bound.
*
* Please note that at least on the US standard keyboard layout,
* `key` will differ if Shift is held down and the key is a number or symbol.
*
* See https://spmenu.speedie.site/Configurable+keybindings for a list of valid options.
*/
keys = (
/* Mode Modifier Key Function Argument */
{ mode = -1; modifier = "None"; key = "Enter"; function = "selectitem"; argument = "+1"; }, // Enter: Select item
{ mode = -1; modifier = "Shift"; key = "Enter"; function = "selectitem"; argument = "0"; }, // Shift+Enter: Select input
{ mode = -1; modifier = "Ctrl"; key = "Enter"; function = "markitem"; argument = "0"; }, // Ctrl+Enter: Mark input
{ mode = -1; modifier = "None"; key = "Tab"; function = "complete"; argument = "0"; }, // Tab: Tab complete
{ mode = -1; modifier = "Ctrl"; key = "v"; function = "paste"; argument = "2"; }, // Ctrl+v: Paste from clipboard
{ mode = -1; modifier = "Ctrl+Shift"; key = "v"; function = "paste"; argument = "1"; }, // Ctrl+Shift+v: Paste from selection
{ mode = -1; modifier = "None"; key = "Backspace"; function = "backspace"; argument = "0"; }, // Backspace: Backspace
{ mode = -1; modifier = "Ctrl"; key = "Backspace"; function = "deleteword"; argument = "0"; }, // Ctrl+Backspace: Delete word
{ mode = -1; modifier = "Ctrl"; key = "Left"; function = "moveword"; argument = "-1"; }, // Ctrl+Left: Move caret (cursor) one word to the left
{ mode = -1; modifier = "Ctrl"; key = "Right"; function = "moveword"; argument = "+1"; }, // Ctrl+Right: Move caret (cursor) one word to the right
{ mode = -1; modifier = "None"; key = "Left"; function = "movecursor"; argument = "-1"; }, // Left: Move caret (cursor) one character to the left
{ mode = -1; modifier = "None"; key = "Right"; function = "movecursor"; argument = "+1"; }, // Right: Move caret (cursor) one character to the right
{ mode = -1; modifier = "Ctrl"; key = "k"; function = "setlines"; argument = "+1"; }, // Ctrl+k: Increase lines by 1
{ mode = -1; modifier = "Ctrl"; key = "j"; function = "setlines"; argument = "-1"; }, // Ctrl+j: Decrease lines by 1
{ mode = -1; modifier = "Ctrl"; key = "l"; function = "setcolumns"; argument = "+1"; }, // Ctrl+l: Increase columns by 1
{ mode = -1; modifier = "Ctrl"; key = "h"; function = "setcolumns"; argument = "-1"; }, // Ctrl+h: Decrease columns by 1
{ mode = -1; modifier = "Ctrl+Shift"; key = "p"; function = "setprofile"; argument = "0"; }, // Ctrl+Shift+p: Open profile menu
{ mode = -1; modifier = "None"; key = "PrintScr"; function = "screenshot"; argument = "0"; }, // Print Screen: Screenshot spmenu
{ mode = 1; modifier = "None"; key = "Esc"; function = "switchmode"; argument = "0"; }, // Escape: Switch mode
{ mode = 1; modifier = "Ctrl"; key = "r"; function = "toggleregex"; argument = "0"; }, // Ctrl+r: Toggle regex matching
{ mode = 0; modifier = "None"; key = "i"; function = "switchmode"; argument = "0"; }, // i: Switch mode
{ mode = 0; modifier = "Ctrl"; key = "="; function = "setimgsize"; argument = "+10"; }, // Ctrl+=: Increase image size by 10
{ mode = 0; modifier = "Ctrl"; key = "-"; function = "setimgsize"; argument = "-10"; }, // Ctrl+-: Decrease image size by 10
{ mode = 0; modifier = "Shift"; key = ")"; function = "defaultimg"; argument = "0"; }, // Shift+0: Set image size to the default
{ mode = 0; modifier = "None"; key = "o"; function = "setimgpos"; argument = "+1"; }, // o: Toggle image position
{ mode = 0; modifier = "None"; key = "p"; function = "paste"; argument = "2"; }, // p: Paste from clipboard
{ mode = 0; modifier = "Ctrl"; key = "1"; function = "setimggaps"; argument = "-10"; }, // Ctrl+1: Decrease image gaps by 10
{ mode = 0; modifier = "Ctrl"; key = "2"; function = "setimggaps"; argument = "+10"; }, // Ctrl+2: Increase image gaps by 10
{ mode = 0; modifier = "None"; key = "t"; function = "toggleimg"; argument = "0"; }, // t: Toggle image
{ mode = 0; modifier = "None"; key = "q"; function = "flipimg"; argument = "1"; }, // q: Flip image horizontally
{ mode = 0; modifier = "None"; key = "w"; function = "flipimg"; argument = "0"; }, // w: Flip image vertically
{ mode = 0; modifier = "None"; key = "k"; function = "moveup"; argument = "0"; }, // k: Move up 1 item
{ mode = 0; modifier = "None"; key = "j"; function = "movedown"; argument = "0"; }, // j: Move down 1 item
{ mode = 0; modifier = "None"; key = "h"; function = "moveleft"; argument = "0"; }, // h: Move left 1 item
{ mode = 0; modifier = "None"; key = "l"; function = "moveright"; argument = "0"; }, // l: Move right 1 item
{ mode = 0; modifier = "Ctrl"; key = "u"; function = "moveup"; argument = "5"; }, // Ctrl+u: Move up 5 items
{ mode = 0; modifier = "Ctrl"; key = "d"; function = "movedown"; argument = "5"; }, // Ctrl+d: Move down 5 items
{ mode = 0; modifier = "None"; key = "u"; function = "togglehighlight"; argument = "0"; }, // u: Toggle highlighting
{ mode = 0; modifier = "Shift"; key = "h"; function = "viewhist"; argument = "0"; }, // Shift+h: Toggle viewing history buffer
{ mode = 0; modifier = "None"; key = "d"; function = "clear"; argument = "0"; }, // d: Clear the input
{ mode = 0; modifier = "Shift"; key = "d"; function = "clearins"; argument = "0"; }, // Shift+d: Clear the input and enter insert mode
{ mode = 0; modifier = "None"; key = "Esc"; function = "quit"; argument = "0"; }, // Esc: Exit
{ mode = 0; modifier = "None"; key = "g"; function = "movestart"; argument = "0"; }, // g: Move to the start
{ mode = 0; modifier = "Shift"; key = "g"; function = "moveend"; argument = "0"; }, // Shift+g: Move to the end
{ mode = 0; modifier = "Ctrl"; key = "p"; function = "navhistory"; argument = "-1"; }, // Ctrl+p: Navigate to the previous entry in the history buffer
{ mode = 0; modifier = "Ctrl"; key = "n"; function = "navhistory"; argument = "+1"; }, // Ctrl+n: Navigate to the next entry in the history buffer
{ ignoreglobalkeys = 1; // Ignore hardcoded keybinds (0/1)
forceinsertmode = 0; // Force insert mode, disabling normal mode (0/1)
} ),
};

View file

@ -610,15 +610,21 @@ to move all keybinds to Insert mode, restoring the original dmenu
behavior. behavior.
Normal mode is the mode spmenu starts in unless a mode argument is specified Normal mode is the mode spmenu starts in unless a mode argument is specified
or another mode is set in the configuration file. In normal mode, all keys or another mode is set in the configuration file. Note that if `forceinsertmode`
perform some action, but you cannot type any actual text to filter items. is enabled, Normal mode cannot be used and spmenu will start in Insert mode
This mode is commonly used for navigation, general keybinds, as well as instead.
quickly selecting an item.
Insert mode is entered through (by default) pressing `i` in normal mode. In In normal mode, all keys perform some action, but you cannot type any actual
this mode, most keybinds do nothing. When you are in insert mode, you text to filter items. This mode is commonly used for navigation, general
filter items by typing text into the field. Once you're done keybinds, as well as quickly selecting an item. By default though,
with insert mode, you can press Escape to enter normal mode again. this mode is not used.
Insert mode is entered through (by default) pressing `i` in normal mode.
In this mode, most keybinds do nothing. When you are in insert mode,
you filter items by typing text into the field.
Once you're done with insert mode and normal mode is enabled, you can press
(by default) Escape to enter normal mode again.
All of these keybinds can be overriden in the configuration file. Should you All of these keybinds can be overriden in the configuration file. Should you
unbind your switchmode key, you can always press `Ctrl+Alt+Delete` to unbind your switchmode key, you can always press `Ctrl+Alt+Delete` to

View file

@ -268,15 +268,15 @@ spmenu = {
* See https://spmenu.speedie.site/Configurable+keybindings for a list of valid options. * See https://spmenu.speedie.site/Configurable+keybindings for a list of valid options.
*/ */
mouse = ( mouse = (
/* Click Button Function Argument */ /* Click Button Function Argument */
{ click = "ClickInput"; button = "Left Click"; function = "clear"; argument = "0"; }, // Left click on input: Clear the input { click = "ClickInput"; button = "Left Click"; function = "clear"; argument = "0"; }, // Left click on input: Clear the input
{ click = "ClickPrompt"; button = "Left Click"; function = "clear"; argument = "0"; }, // Left click on prompt: Clear the input { click = "ClickPrompt"; button = "Left Click"; function = "clear"; argument = "0"; }, // Left click on prompt: Clear the input
{ click = "ClickMode"; button = "Left Click"; function = "switchmode"; argument = "0"; }, // Left click on the mode indicator: Toggle mode { click = "ClickMode"; button = "Left Click"; function = "switchmode"; argument = "0"; }, // Left click on the mode indicator: Toggle mode
{ click = "ClickNumber"; button = "Left Click"; function = "viewhist"; argument = "0"; }, // Click on the match count: Toggle viewing history buffer { click = "ClickNumber"; button = "Left Click"; function = "viewhist"; argument = "0"; }, // Click on the match count: Toggle viewing history buffer
{ click = "ClickItem"; button = "Left Click"; function = "selecthover"; argument = "0"; }, // Left click on an item: Select it { click = "ClickItem"; button = "Left Click"; function = "selecthover"; argument = "0"; }, // Left click on an item: Select it
{ click = "ClickItem"; button = "Right Click"; function = "markhover"; argument = "0"; }, // Right click on an item: Mark it { click = "ClickItem"; button = "Right Click"; function = "markhover"; argument = "0"; }, // Right click on an item: Mark it
{ click = "None"; button = "Scroll Up"; function = "moveprev"; argument = "0"; }, // Scroll Up: Move to the previous page { click = "None"; button = "Scroll Up"; function = "moveprev"; argument = "0"; }, // Scroll Up: Move to the previous page
{ click = "None"; button = "Scroll Down"; function = "movenext"; argument = "0"; }, // Scroll Down: Move to the next page { click = "None"; button = "Scroll Down"; function = "movenext"; argument = "0"; }, // Scroll Down: Move to the next page
{ {
scrolldistance = 512; // Distance to scroll for a scroll action to count. Wayland only (num) scrolldistance = 512; // Distance to scroll for a scroll action to count. Wayland only (num)
@ -296,53 +296,30 @@ spmenu = {
* See https://spmenu.speedie.site/Configurable+keybindings for a list of valid options. * See https://spmenu.speedie.site/Configurable+keybindings for a list of valid options.
*/ */
keys = ( keys = (
/* Mode Modifier Key Function Argument */ /* Mode Modifier Key Function Argument */
{ mode = -1; modifier = "None"; key = "Enter"; function = "selectitem"; argument = "+1"; }, // Enter: Select item { mode = -1; modifier = "None"; key = "Enter"; function = "selectitem"; argument = "+1"; }, // Enter: Select item
{ mode = -1; modifier = "Shift"; key = "Enter"; function = "selectitem"; argument = "0"; }, // Shift+Enter: Select input { mode = -1; modifier = "Shift"; key = "Enter"; function = "selectitem"; argument = "0"; }, // Shift+Enter: Select input
{ mode = -1; modifier = "Ctrl"; key = "Enter"; function = "markitem"; argument = "0"; }, // Ctrl+Enter: Mark input { mode = -1; modifier = "Ctrl"; key = "Enter"; function = "markitem"; argument = "0"; }, // Ctrl+Enter: Mark input
{ mode = -1; modifier = "None"; key = "Tab"; function = "complete"; argument = "0"; }, // Tab: Tab complete { mode = -1; modifier = "None"; key = "Tab"; function = "complete"; argument = "0"; }, // Tab: Tab complete
{ mode = -1; modifier = "Ctrl"; key = "v"; function = "paste"; argument = "2"; }, // Ctrl+v: Paste from clipboard { mode = -1; modifier = "Ctrl"; key = "v"; function = "paste"; argument = "2"; }, // Ctrl+v: Paste from clipboard
{ mode = -1; modifier = "Ctrl+Shift"; key = "v"; function = "paste"; argument = "1"; }, // Ctrl+Shift+v: Paste from selection { mode = -1; modifier = "None"; key = "Backspace"; function = "backspace"; argument = "0"; }, // Backspace: Backspace
{ mode = -1; modifier = "None"; key = "Backspace"; function = "backspace"; argument = "0"; }, // Backspace: Backspace { mode = -1; modifier = "Ctrl"; key = "Backspace"; function = "deleteword"; argument = "0"; }, // Ctrl+Backspace: Delete word
{ mode = -1; modifier = "Ctrl"; key = "Backspace"; function = "deleteword"; argument = "0"; }, // Ctrl+Backspace: Delete word { mode = -1; modifier = "Ctrl+Shift"; key = "p"; function = "setprofile"; argument = "0"; }, // Ctrl+Shift+p: Open profile menu
{ mode = -1; modifier = "Ctrl"; key = "Left"; function = "moveword"; argument = "-1"; }, // Ctrl+Left: Move caret (cursor) one word to the left { mode = -1; modifier = "Ctrl"; key = "="; function = "setimgsize"; argument = "+10"; }, // Ctrl+=: Increase image size by 10
{ mode = -1; modifier = "Ctrl"; key = "Right"; function = "moveword"; argument = "+1"; }, // Ctrl+Right: Move caret (cursor) one word to the right { mode = -1; modifier = "Ctrl"; key = "-"; function = "setimgsize"; argument = "-10"; }, // Ctrl+-: Decrease image size by 10
{ mode = -1; modifier = "None"; key = "Left"; function = "movecursor"; argument = "-1"; }, // Left: Move caret (cursor) one character to the left { mode = -1; modifier = "None"; key = "Up"; function = "moveup"; argument = "0"; }, // k: Move up 1 item
{ mode = -1; modifier = "None"; key = "Right"; function = "movecursor"; argument = "+1"; }, // Right: Move caret (cursor) one character to the right { mode = -1; modifier = "None"; key = "Down"; function = "movedown"; argument = "0"; }, // j: Move down 1 item
{ mode = -1; modifier = "Ctrl"; key = "k"; function = "setlines"; argument = "+1"; }, // Ctrl+k: Increase lines by 1 { mode = -1; modifier = "None"; key = "Left"; function = "moveleft"; argument = "0"; }, // h: Move left 1 item
{ mode = -1; modifier = "Ctrl"; key = "j"; function = "setlines"; argument = "-1"; }, // Ctrl+j: Decrease lines by 1 { mode = -1; modifier = "None"; key = "Right"; function = "moveright"; argument = "0"; }, // l: Move right 1 item
{ mode = -1; modifier = "Ctrl"; key = "l"; function = "setcolumns"; argument = "+1"; }, // Ctrl+l: Increase columns by 1 { mode = -1; modifier = "Ctrl"; key = "u"; function = "moveup"; argument = "5"; }, // Ctrl+u: Move up 5 items
{ mode = -1; modifier = "Ctrl"; key = "h"; function = "setcolumns"; argument = "-1"; }, // Ctrl+h: Decrease columns by 1 { mode = -1; modifier = "Ctrl"; key = "d"; function = "movedown"; argument = "5"; }, // Ctrl+d: Move down 5 items
{ mode = -1; modifier = "Ctrl+Shift"; key = "p"; function = "setprofile"; argument = "0"; }, // Ctrl+Shift+p: Open profile menu { mode = -1; modifier = "Ctrl"; key = "h"; function = "viewhist"; argument = "0"; }, // Ctrl+h: Toggle viewing history buffer
{ mode = -1; modifier = "None"; key = "PrintScr"; function = "screenshot"; argument = "0"; }, // Print Screen: Screenshot spmenu { mode = -1; modifier = "None"; key = "Esc"; function = "quit"; argument = "0"; }, // Esc: Exit
{ mode = 1; modifier = "None"; key = "Esc"; function = "switchmode"; argument = "0"; }, // Escape: Switch mode { mode = -1; modifier = "Ctrl"; key = "p"; function = "navhistory"; argument = "-1"; }, // Ctrl+p: Navigate to the previous entry in the history buffer
{ mode = 1; modifier = "Ctrl"; key = "r"; function = "toggleregex"; argument = "0"; }, // Ctrl+r: Toggle regex matching { mode = -1; modifier = "Ctrl"; key = "n"; function = "navhistory"; argument = "+1"; }, // Ctrl+n: Navigate to the next entry in the history buffer
{ mode = 0; modifier = "None"; key = "i"; function = "switchmode"; argument = "0"; }, // i: Switch mode { mode = -1; modifier = "None"; key = "PrintScr"; function = "screenshot"; argument = "0"; }, // Print Screen: Screenshot spmenu
{ mode = 0; modifier = "Ctrl"; key = "="; function = "setimgsize"; argument = "+10"; }, // Ctrl+=: Increase image size by 10
{ mode = 0; modifier = "Ctrl"; key = "-"; function = "setimgsize"; argument = "-10"; }, // Ctrl+-: Decrease image size by 10
{ mode = 0; modifier = "Shift"; key = ")"; function = "defaultimg"; argument = "0"; }, // Shift+0: Set image size to the default
{ mode = 0; modifier = "None"; key = "o"; function = "setimgpos"; argument = "+1"; }, // o: Toggle image position
{ mode = 0; modifier = "None"; key = "p"; function = "paste"; argument = "2"; }, // p: Paste from clipboard
{ mode = 0; modifier = "Ctrl"; key = "1"; function = "setimggaps"; argument = "-10"; }, // Ctrl+1: Decrease image gaps by 10
{ mode = 0; modifier = "Ctrl"; key = "2"; function = "setimggaps"; argument = "+10"; }, // Ctrl+2: Increase image gaps by 10
{ mode = 0; modifier = "None"; key = "t"; function = "toggleimg"; argument = "0"; }, // t: Toggle image
{ mode = 0; modifier = "None"; key = "q"; function = "flipimg"; argument = "1"; }, // q: Flip image horizontally
{ mode = 0; modifier = "None"; key = "w"; function = "flipimg"; argument = "0"; }, // w: Flip image vertically
{ mode = 0; modifier = "None"; key = "k"; function = "moveup"; argument = "0"; }, // k: Move up 1 item
{ mode = 0; modifier = "None"; key = "j"; function = "movedown"; argument = "0"; }, // j: Move down 1 item
{ mode = 0; modifier = "None"; key = "h"; function = "moveleft"; argument = "0"; }, // h: Move left 1 item
{ mode = 0; modifier = "None"; key = "l"; function = "moveright"; argument = "0"; }, // l: Move right 1 item
{ mode = 0; modifier = "Ctrl"; key = "u"; function = "moveup"; argument = "5"; }, // Ctrl+u: Move up 5 items
{ mode = 0; modifier = "Ctrl"; key = "d"; function = "movedown"; argument = "5"; }, // Ctrl+d: Move down 5 items
{ mode = 0; modifier = "None"; key = "u"; function = "togglehighlight"; argument = "0"; }, // Ctrl+u: Toggle highlighting
{ mode = 0; modifier = "Shift"; key = "h"; function = "viewhist"; argument = "0"; }, // Shift+h: Toggle viewing history buffer
{ mode = 0; modifier = "None"; key = "d"; function = "clear"; argument = "0"; }, // d: Clear the input
{ mode = 0; modifier = "Shift"; key = "d"; function = "clearins"; argument = "0"; }, // Shift+d: Clear the input and enter insert mode
{ mode = 0; modifier = "None"; key = "Esc"; function = "quit"; argument = "0"; }, // Esc: Exit
{ mode = 0; modifier = "None"; key = "g"; function = "movestart"; argument = "0"; }, // g: Move to the start
{ mode = 0; modifier = "Shift"; key = "g"; function = "moveend"; argument = "0"; }, // Shift+g: Move to the end
{ mode = 0; modifier = "Ctrl"; key = "p"; function = "navhistory"; argument = "-1"; }, // Ctrl+p: Navigate to the previous entry in the history buffer
{ mode = 0; modifier = "Ctrl"; key = "n"; function = "navhistory"; argument = "+1"; }, // Ctrl+n: Navigate to the next entry in the history buffer
{ ignoreglobalkeys = 1; } ), // Ignore hardcoded keybinds (0/1) { ignoreglobalkeys = 1; // Ignore hardcoded keybinds (0/1)
forceinsertmode = 1; // Force insert mode to be used, disabling normal mode (0/1)
} ),
}; };

View file

@ -605,7 +605,7 @@ void setprofile(Arg *arg) {
} }
void switchmode(Arg *arg) { void switchmode(Arg *arg) {
if (sp.forceinsertmode) { if (forceinsertmode) {
return; return;
} }

View file

@ -49,7 +49,7 @@ int bind_init(void) {
fprintf(stderr, "spmenu: Invalid keys file.\n"); fprintf(stderr, "spmenu: Invalid keys file.\n");
} }
// load options binds.keys // load options bind.keys
config_setting_t *key_bind = config_lookup(&bind, "bind.keys"); config_setting_t *key_bind = config_lookup(&bind, "bind.keys");
if (key_bind != NULL && loadbinds) { if (key_bind != NULL && loadbinds) {
int nmode = 0; int nmode = 0;
@ -131,12 +131,12 @@ int bind_init(void) {
} }
} }
config_setting_lookup_int(conf, "forceinsertmode", &forceinsertmode);
config_setting_lookup_int(conf, "ignoreglobalkeys", &sp.ignoreglobalkeys); config_setting_lookup_int(conf, "ignoreglobalkeys", &sp.ignoreglobalkeys);
config_setting_lookup_int(conf, "forceinsertmode", &sp.forceinsertmode);
} }
} }
// load options binds.mouse // load options bind.mouse
config_setting_t *mouse_bind = config_lookup(&bind, "bind.mouse"); config_setting_t *mouse_bind = config_lookup(&bind, "bind.mouse");
if (mouse_bind != NULL && loadbinds) { if (mouse_bind != NULL && loadbinds) {
#if USEX #if USEX
@ -925,7 +925,7 @@ void conf_init(void) {
} }
} }
config_setting_lookup_int(conf, "forceinsertmode", &sp.forceinsertmode); config_setting_lookup_int(conf, "forceinsertmode", &forceinsertmode);
config_setting_lookup_int(conf, "ignoreglobalkeys", &sp.ignoreglobalkeys); config_setting_lookup_int(conf, "ignoreglobalkeys", &sp.ignoreglobalkeys);
} }
} }

View file

@ -5,121 +5,54 @@
/* X11 hardcoded keybinds */ /* X11 hardcoded keybinds */
#if USEX #if USEX
static Key keys[] = { static Key keys[] = {
/* mode modifier key function argument
*
* any mode
*/
{ -1, 0, XK_Return, selectitem, {.i = +1 } }, { -1, 0, XK_Return, selectitem, {.i = +1 } },
{ -1, Shift, XK_Return, selectitem, {0} }, { -1, Shift, XK_Return, selectitem, {0} },
{ -1, Ctrl, XK_Return, markitem, {0} }, { -1, Ctrl, XK_Return, markitem, {0} },
{ -1, 0, XK_Tab, complete, {0} }, { -1, 0, XK_Tab, complete, {0} },
{ -1, Ctrl, XK_v, paste, {.i = 2 } }, { -1, Ctrl, XK_v, paste, {.i = 2 } },
{ -1, Ctrl|Shift, XK_v, paste, {.i = 1 } },
{ -1, 0, XK_BackSpace, backspace, {0} }, { -1, 0, XK_BackSpace, backspace, {0} },
{ -1, Ctrl, XK_BackSpace, deleteword, {0} }, { -1, Ctrl, XK_BackSpace, deleteword, {0} },
{ -1, Ctrl, XK_Left, moveword, {.i = -1 } },
{ -1, Ctrl, XK_Right, moveword, {.i = +1 } },
{ -1, 0, XK_Left, movecursor, {.i = -1 } },
{ -1, 0, XK_Right, movecursor, {.i = +1 } },
{ -1, Ctrl, XK_k, setlines, {.i = +1 } },
{ -1, Ctrl, XK_j, setlines, {.i = -1 } },
{ -1, Ctrl, XK_h, setcolumns, {.i = +1 } },
{ -1, Ctrl, XK_l, setcolumns, {.i = -1 } },
{ -1, Ctrl|Shift, XK_p, setprofile, {0} }, { -1, Ctrl|Shift, XK_p, setprofile, {0} },
{ -1, 0, XK_Print, screenshot, {0} }, { -1, 0, XK_Print, screenshot, {0} },
{ -1, Ctrl, XK_equal, setimgsize, {.i = +10 } },
/* normal mode */ { -1, Ctrl, XK_minus, setimgsize, {.i = -10 } },
{ 0, 0, XK_i, switchmode, {0} }, { -1, 0, XK_k, moveup, {0} },
{ 0, Ctrl, XK_equal, setimgsize, {.i = +10 } }, { -1, 0, XK_j, movedown, {0} },
{ 0, Ctrl, XK_minus, setimgsize, {.i = -10 } }, { -1, 0, XK_h, moveleft, {0} },
{ 0, Shift, XK_0, defaultimg, {0} }, { -1, 0, XK_l, moveright, {0} },
{ 0, 0, XK_o, setimgpos, {.i = +1 } }, { -1, Ctrl, XK_u, moveup, {.i = 5 } },
{ 0, Ctrl, XK_1, setimggaps, {.i = -10 } }, { -1, Ctrl, XK_d, movedown, {.i = 5 } },
{ 0, Ctrl, XK_2, setimggaps, {.i = +10 } }, { -1, Shift, XK_h, viewhist, {0} },
{ 0, 0, XK_t, toggleimg, {0} }, { -1, 0, XK_Escape, quit, {0} },
{ 0, 0, XK_p, paste, {.i = 2 } }, { -1, Ctrl, XK_p, navhistory, {.i = -1 } },
{ 0, 0, XK_q, flipimg, {.i = 1 } }, { -1, Ctrl, XK_n, navhistory, {.i = +1 } },
{ 0, 0, XK_w, flipimg, {.i = 0 } },
{ 0, 0, XK_k, moveup, {0} },
{ 0, 0, XK_j, movedown, {0} },
{ 0, 0, XK_h, moveleft, {0} },
{ 0, 0, XK_l, moveright, {0} },
{ 0, Ctrl, XK_u, moveup, {.i = 5 } },
{ 0, Ctrl, XK_d, movedown, {.i = 5 } },
{ 0, 0, XK_u, togglehighlight, {0} },
{ 0, Shift, XK_h, viewhist, {0} },
{ 0, 0, XK_d, clear, {0} },
{ 0, Shift, XK_d, clearins, {0} },
{ 0, 0, XK_Escape, quit, {0} },
{ 0, 0, XK_g, movestart, {0} },
{ 0, Shift, XK_g, moveend, {0} },
{ 0, Ctrl, XK_p, navhistory, {.i = -1 } },
{ 0, Ctrl, XK_n, navhistory, {.i = +1 } },
/* insert mode */
{ 1, 0, XK_Escape, switchmode, {0} },
{ 1, Ctrl, XK_r, toggleregex, {0} },
}; };
#endif #endif
/* Wayland hardcoded keybinds */ /* Wayland hardcoded keybinds */
#if USEWAYLAND #if USEWAYLAND
static WlKey wl_keys[] = { static WlKey wl_keys[] = {
/* mode modifier key function argument
*
* any mode
*/
{ -1, WL_None, XKB_KEY_Return, selectitem, {.i = +1 } }, { -1, WL_None, XKB_KEY_Return, selectitem, {.i = +1 } },
{ -1, WL_Shift, XKB_KEY_Return, selectitem, {0} }, { -1, WL_Shift, XKB_KEY_Return, selectitem, {0} },
{ -1, WL_Ctrl, XKB_KEY_Return, markitem, {0} }, { -1, WL_Ctrl, XKB_KEY_Return, markitem, {0} },
{ -1, WL_None, XKB_KEY_Tab, complete, {0} }, { -1, WL_None, XKB_KEY_Tab, complete, {0} },
{ -1, WL_Ctrl, XKB_KEY_v, paste, {.i = 2 } }, { -1, WL_Ctrl, XKB_KEY_v, paste, {.i = 2 } },
{ -1, WL_CtrlShift, XKB_KEY_v, paste, {.i = 1 } },
{ -1, WL_None, XKB_KEY_BackSpace, backspace, {0} }, { -1, WL_None, XKB_KEY_BackSpace, backspace, {0} },
{ -1, WL_Ctrl, XKB_KEY_BackSpace, deleteword, {0} }, { -1, WL_Ctrl, XKB_KEY_BackSpace, deleteword, {0} },
{ -1, WL_Ctrl, XKB_KEY_Left, moveword, {.i = -1 } },
{ -1, WL_Ctrl, XKB_KEY_Right, moveword, {.i = +1 } },
{ -1, WL_None, XKB_KEY_Left, movecursor, {.i = -1 } },
{ -1, WL_None, XKB_KEY_Right, movecursor, {.i = +1 } },
{ -1, WL_Ctrl, XKB_KEY_k, setlines, {.i = +1 } },
{ -1, WL_Ctrl, XKB_KEY_j, setlines, {.i = -1 } },
{ -1, WL_Ctrl, XKB_KEY_h, setcolumns, {.i = +1 } },
{ -1, WL_Ctrl, XKB_KEY_l, setcolumns, {.i = -1 } },
{ -1, WL_CtrlShift, XKB_KEY_p, setprofile, {0} }, { -1, WL_CtrlShift, XKB_KEY_p, setprofile, {0} },
{ -1, WL_None, XKB_KEY_Print, screenshot, {0} }, { -1, WL_None, XKB_KEY_Print, screenshot, {0} },
{ -1, WL_Ctrl, XKB_KEY_equal, setimgsize, {.i = +10 } },
{ -1, WL_Ctrl, XKB_KEY_minus, setimgsize, {.i = -10 } },
{ -1, WL_None, XKB_KEY_k, moveup, {0} },
{ -1, WL_None, XKB_KEY_j, movedown, {0} },
{ -1, WL_None, XKB_KEY_h, moveleft, {0} },
{ -1, WL_None, XKB_KEY_l, moveright, {0} },
{ -1, WL_Ctrl, XKB_KEY_u, moveup, {.i = 5 } },
{ -1, WL_Ctrl, XKB_KEY_d, movedown, {.i = 5 } },
{ -1, WL_Shift, XKB_KEY_h, viewhist, {0} },
{ -1, WL_None, XKB_KEY_Escape, quit, {0} },
{ -1, WL_Ctrl, XKB_KEY_p, navhistory, {.i = -1 } },
{ -1, WL_Ctrl, XKB_KEY_n, navhistory, {.i = +1 } },
/* normal mode */
{ 0, WL_None, XKB_KEY_i, switchmode, {0} },
{ 0, WL_Ctrl, XKB_KEY_equal, setimgsize, {.i = +10 } },
{ 0, WL_Ctrl, XKB_KEY_minus, setimgsize, {.i = -10 } },
{ 0, WL_Shift, XKB_KEY_0, defaultimg, {0} },
{ 0, WL_None, XKB_KEY_o, setimgpos, {.i = +1 } },
{ 0, WL_Ctrl, XKB_KEY_1, setimggaps, {.i = -10 } },
{ 0, WL_Ctrl, XKB_KEY_2, setimggaps, {.i = +10 } },
{ 0, WL_None, XKB_KEY_t, toggleimg, {0} },
{ 0, WL_None, XKB_KEY_p, paste, {.i = 2 } },
{ 0, WL_None, XKB_KEY_q, flipimg, {.i = 1 } },
{ 0, WL_None, XKB_KEY_w, flipimg, {.i = 0 } },
{ 0, WL_None, XKB_KEY_k, moveup, {0} },
{ 0, WL_None, XKB_KEY_j, movedown, {0} },
{ 0, WL_None, XKB_KEY_h, moveleft, {0} },
{ 0, WL_None, XKB_KEY_l, moveright, {0} },
{ 0, WL_Ctrl, XKB_KEY_u, moveup, {.i = 5 } },
{ 0, WL_Ctrl, XKB_KEY_d, movedown, {.i = 5 } },
{ 0, WL_None, XKB_KEY_u, togglehighlight, {0} },
{ 0, WL_Shift, XKB_KEY_h, viewhist, {0} },
{ 0, WL_None, XKB_KEY_d, clear, {0} },
{ 0, WL_Shift, XKB_KEY_d, clearins, {0} },
{ 0, WL_None, XKB_KEY_Escape, quit, {0} },
{ 0, WL_None, XKB_KEY_Home, movestart, {0} },
{ 0, WL_None, XKB_KEY_End, moveend, {0} },
{ 0, WL_None, XKB_KEY_g, movestart, {0} },
{ 0, WL_Shift, XKB_KEY_g, moveend, {0} },
{ 0, WL_Ctrl, XKB_KEY_p, navhistory, {.i = -1 } },
{ 0, WL_Ctrl, XKB_KEY_n, navhistory, {.i = +1 } },
/* insert mode */
{ 1, WL_None, XKB_KEY_Escape, switchmode, {0} },
{ 1, WL_Ctrl, XKB_KEY_r, toggleregex, {0} },
}; };
#endif #endif

View file

@ -67,6 +67,7 @@ static char *screenshotdir = NULL; /* Screenshot file directory. If
/* Mode options */ /* Mode options */
static int mode = 0; /* Mode to start speedwm in (0: Normal mode, 1: Insert mode) */ static int mode = 0; /* Mode to start speedwm in (0: Normal mode, 1: Insert mode) */
static int forceinsertmode = 1; /* Force insert mode, meaning normal mode will be disabled (0/1) */
static char *normtext = "Normal"; /* Text to display for normal mode */ static char *normtext = "Normal"; /* Text to display for normal mode */
static char *instext = "Insert"; /* Text to display for insert mode */ static char *instext = "Insert"; /* Text to display for insert mode */
static char *regextext = "Regex"; /* Text to display for insert mode when regex is enabled */ static char *regextext = "Regex"; /* Text to display for insert mode when regex is enabled */

View file

@ -105,6 +105,7 @@ endif
if get_option('docs') if get_option('docs')
install_data(sources : 'docs/spmenu.conf', install_dir : 'share/spmenu') install_data(sources : 'docs/spmenu.conf', install_dir : 'share/spmenu')
install_data(sources : 'docs/binds-vim.conf', install_dir : 'share/spmenu')
install_data(sources : 'docs/spmenu_run.desktop', install_dir : 'share/applications') install_data(sources : 'docs/spmenu_run.desktop', install_dir : 'share/applications')
install_data(sources : 'docs/spmenu_desktop.desktop', install_dir : 'share/applications') install_data(sources : 'docs/spmenu_desktop.desktop', install_dir : 'share/applications')
install_data(sources : 'docs/spmenu_filemanager.desktop', install_dir : 'share/applications') install_data(sources : 'docs/spmenu_filemanager.desktop', install_dir : 'share/applications')

View file

@ -1,5 +1,5 @@
'\" t '\" t
.\" Automatically generated by Pandoc 3.1.2 .\" Automatically generated by Pandoc 3.1.3
.\" .\"
.\" Define V font for inline verbatim, using C font in formats .\" Define V font for inline verbatim, using C font in formats
.\" that render this, and otherwise B font. .\" that render this, and otherwise B font.
@ -647,18 +647,23 @@ Insert mode, restoring the original dmenu behavior.
.PP .PP
Normal mode is the mode spmenu starts in unless a mode argument is Normal mode is the mode spmenu starts in unless a mode argument is
specified or another mode is set in the configuration file. specified or another mode is set in the configuration file.
Note that if \f[V]forceinsertmode\f[R] is enabled, Normal mode cannot be
used and spmenu will start in Insert mode instead.
.PP
In normal mode, all keys perform some action, but you cannot type any In normal mode, all keys perform some action, but you cannot type any
actual text to filter items. actual text to filter items.
This mode is commonly used for navigation, general keybinds, as well as This mode is commonly used for navigation, general keybinds, as well as
quickly selecting an item. quickly selecting an item.
By default though, this mode is not used.
.PP .PP
Insert mode is entered through (by default) pressing \f[V]i\f[R] in Insert mode is entered through (by default) pressing \f[V]i\f[R] in
normal mode. normal mode.
In this mode, most keybinds do nothing. In this mode, most keybinds do nothing.
When you are in insert mode, you filter items by typing text into the When you are in insert mode, you filter items by typing text into the
field. field.
Once you\[cq]re done with insert mode, you can press Escape to enter .PP
normal mode again. Once you\[cq]re done with insert mode and normal mode is enabled, you
can press (by default) Escape to enter normal mode again.
.PP .PP
All of these keybinds can be overriden in the configuration file. All of these keybinds can be overriden in the configuration file.
Should you unbind your switchmode key, you can always press Should you unbind your switchmode key, you can always press

View file

@ -149,7 +149,6 @@ struct sp {
int ignoreglobalkeys; // should be set in the config file, if 1, the Keys keys array is ignored int ignoreglobalkeys; // should be set in the config file, if 1, the Keys keys array is ignored
int ignoreconfmouse; // same for mouse int ignoreconfmouse; // same for mouse
int ignoreglobalmouse; // same for mouse int ignoreglobalmouse; // same for mouse
int forceinsertmode;
}; };
struct mo { struct mo {
@ -583,10 +582,9 @@ void set_mode(void) {
} }
// normal mode disabled // normal mode disabled
if (sp.forceinsertmode) { if (forceinsertmode) {
sp.mode = 1; sp.mode = 1;
sp.allowkeys = 1; sp.allowkeys = 1;
hidemode = 1;
} }
} }
@ -603,7 +601,6 @@ void handle(void) {
#if USEIMAGE #if USEIMAGE
store_image_vars(); store_image_vars();
#endif #endif
// fast (-f) means we grab keyboard before reading standard input // fast (-f) means we grab keyboard before reading standard input
if (fast && !isatty(0)) { if (fast && !isatty(0)) {
grabkeyboard_x11(); grabkeyboard_x11();

View file

@ -1,4 +1,4 @@
.\" Automatically generated by Pandoc 3.1.2 .\" Automatically generated by Pandoc 3.1.3
.\" .\"
.\" Define V font for inline verbatim, using C font in formats .\" Define V font for inline verbatim, using C font in formats
.\" that render this, and otherwise B font. .\" that render this, and otherwise B font.

View file

@ -1,4 +1,4 @@
.\" Automatically generated by Pandoc 3.1.2 .\" Automatically generated by Pandoc 3.1.3
.\" .\"
.\" Define V font for inline verbatim, using C font in formats .\" Define V font for inline verbatim, using C font in formats
.\" that render this, and otherwise B font. .\" that render this, and otherwise B font.