aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/binds.go141
-rw-r--r--config/binds_test.go13
-rw-r--r--doc/aerc-binds.5.scd182
3 files changed, 64 insertions, 272 deletions
diff --git a/config/binds.go b/config/binds.go
index 95fa8c7d..3ddc2578 100644
--- a/config/binds.go
+++ b/config/binds.go
@@ -10,6 +10,7 @@ import (
"regexp"
"strings"
"unicode"
+ "unicode/utf8"
"git.sr.ht/~rjarry/aerc/lib/log"
"git.sr.ht/~rockorager/vaxis"
@@ -474,10 +475,8 @@ func FormatKeyStrokes(keystrokes []KeyStroke) string {
for name, ks := range keyNames {
if ks.Modifiers == stroke.Modifiers && ks.Key == stroke.Key {
switch name {
- case "cr", "c-m":
+ case "cr":
s = "<enter>"
- case "c-i":
- s = "<tab>"
case "space":
s = " "
case "semicolon":
@@ -485,9 +484,21 @@ func FormatKeyStrokes(keystrokes []KeyStroke) string {
default:
s = fmt.Sprintf("<%s>", name)
}
+ // remove any modifiers this named key comes
+ // with so we format properly
+ stroke.Modifiers &^= ks.Modifiers
break
}
}
+ if stroke.Modifiers&vaxis.ModCtrl > 0 {
+ sb.WriteString("c-")
+ }
+ if stroke.Modifiers&vaxis.ModAlt > 0 {
+ sb.WriteString("a-")
+ }
+ if stroke.Modifiers&vaxis.ModShift > 0 {
+ sb.WriteString("s-")
+ }
if s == "" && stroke.Key < unicode.MaxRune {
s = string(stroke.Key)
}
@@ -512,37 +523,21 @@ var keyNames = map[string]KeyStroke{
"space": {vaxis.ModifierMask(0), ' '},
"semicolon": {vaxis.ModifierMask(0), ';'},
"enter": {vaxis.ModifierMask(0), vaxis.KeyEnter},
- "c-enter": {vaxis.ModCtrl, vaxis.KeyEnter},
- "a-enter": {vaxis.ModAlt, vaxis.KeyEnter},
"up": {vaxis.ModifierMask(0), vaxis.KeyUp},
- "c-up": {vaxis.ModCtrl, vaxis.KeyUp},
- "a-up": {vaxis.ModAlt, vaxis.KeyUp},
"down": {vaxis.ModifierMask(0), vaxis.KeyDown},
- "c-down": {vaxis.ModCtrl, vaxis.KeyDown},
- "a-down": {vaxis.ModAlt, vaxis.KeyDown},
"right": {vaxis.ModifierMask(0), vaxis.KeyRight},
- "c-right": {vaxis.ModCtrl, vaxis.KeyRight},
- "a-right": {vaxis.ModAlt, vaxis.KeyRight},
"left": {vaxis.ModifierMask(0), vaxis.KeyLeft},
- "c-left": {vaxis.ModCtrl, vaxis.KeyLeft},
- "a-left": {vaxis.ModAlt, vaxis.KeyLeft},
"upleft": {vaxis.ModifierMask(0), vaxis.KeyUpLeft},
"upright": {vaxis.ModifierMask(0), vaxis.KeyUpRight},
"downleft": {vaxis.ModifierMask(0), vaxis.KeyDownLeft},
"downright": {vaxis.ModifierMask(0), vaxis.KeyDownRight},
"center": {vaxis.ModifierMask(0), vaxis.KeyCenter},
"pgup": {vaxis.ModifierMask(0), vaxis.KeyPgUp},
- "c-pgup": {vaxis.ModCtrl, vaxis.KeyPgUp},
- "a-pgup": {vaxis.ModAlt, vaxis.KeyPgUp},
"pgdn": {vaxis.ModifierMask(0), vaxis.KeyPgDown},
- "c-pgdn": {vaxis.ModCtrl, vaxis.KeyPgDown},
- "a-pgdn": {vaxis.ModAlt, vaxis.KeyPgDown},
"home": {vaxis.ModifierMask(0), vaxis.KeyHome},
"end": {vaxis.ModifierMask(0), vaxis.KeyEnd},
"insert": {vaxis.ModifierMask(0), vaxis.KeyInsert},
"delete": {vaxis.ModifierMask(0), vaxis.KeyDelete},
- "c-delete": {vaxis.ModCtrl, vaxis.KeyDelete},
- "a-delete": {vaxis.ModAlt, vaxis.KeyDelete},
"backspace": {vaxis.ModifierMask(0), vaxis.KeyBackspace},
// "help": {vaxis.ModifierMask(0), vaxis.KeyHelp},
"exit": {vaxis.ModifierMask(0), vaxis.KeyExit},
@@ -614,80 +609,6 @@ var keyNames = map[string]KeyStroke{
"f61": {vaxis.ModifierMask(0), vaxis.KeyF61},
"f62": {vaxis.ModifierMask(0), vaxis.KeyF62},
"f63": {vaxis.ModifierMask(0), vaxis.KeyF63},
- "c-space": {vaxis.ModCtrl, ' '},
- "c-a": {vaxis.ModCtrl, 'a'},
- "c-b": {vaxis.ModCtrl, 'b'},
- "c-c": {vaxis.ModCtrl, 'c'},
- "c-d": {vaxis.ModCtrl, 'd'},
- "c-e": {vaxis.ModCtrl, 'e'},
- "c-f": {vaxis.ModCtrl, 'f'},
- "c-g": {vaxis.ModCtrl, 'g'},
- "c-h": {vaxis.ModCtrl, 'h'},
- "c-i": {vaxis.ModCtrl, 'i'},
- "c-j": {vaxis.ModCtrl, 'j'},
- "c-k": {vaxis.ModCtrl, 'k'},
- "c-l": {vaxis.ModCtrl, 'l'},
- "c-m": {vaxis.ModCtrl, 'm'},
- "c-n": {vaxis.ModCtrl, 'n'},
- "c-o": {vaxis.ModCtrl, 'o'},
- "c-p": {vaxis.ModCtrl, 'p'},
- "c-q": {vaxis.ModCtrl, 'q'},
- "c-r": {vaxis.ModCtrl, 'r'},
- "c-s": {vaxis.ModCtrl, 's'},
- "c-t": {vaxis.ModCtrl, 't'},
- "c-u": {vaxis.ModCtrl, 'u'},
- "c-v": {vaxis.ModCtrl, 'v'},
- "c-w": {vaxis.ModCtrl, 'w'},
- "c-x": {vaxis.ModCtrl, 'x'},
- "c-y": {vaxis.ModCtrl, 'y'},
- "c-z": {vaxis.ModCtrl, 'z'},
- "c-]": {vaxis.ModCtrl, ']'},
- "c-\\": {vaxis.ModCtrl, '\\'},
- "c-[": {vaxis.ModCtrl, '['},
- "c-^": {vaxis.ModCtrl, '^'},
- "c-_": {vaxis.ModCtrl, '_'},
- "a-space": {vaxis.ModAlt, ' '},
- "a-0": {vaxis.ModAlt, '0'},
- "a-1": {vaxis.ModAlt, '1'},
- "a-2": {vaxis.ModAlt, '2'},
- "a-3": {vaxis.ModAlt, '3'},
- "a-4": {vaxis.ModAlt, '4'},
- "a-5": {vaxis.ModAlt, '5'},
- "a-6": {vaxis.ModAlt, '6'},
- "a-7": {vaxis.ModAlt, '7'},
- "a-8": {vaxis.ModAlt, '8'},
- "a-9": {vaxis.ModAlt, '9'},
- "a-a": {vaxis.ModAlt, 'a'},
- "a-b": {vaxis.ModAlt, 'b'},
- "a-c": {vaxis.ModAlt, 'c'},
- "a-d": {vaxis.ModAlt, 'd'},
- "a-e": {vaxis.ModAlt, 'e'},
- "a-f": {vaxis.ModAlt, 'f'},
- "a-g": {vaxis.ModAlt, 'g'},
- "a-h": {vaxis.ModAlt, 'h'},
- "a-i": {vaxis.ModAlt, 'i'},
- "a-j": {vaxis.ModAlt, 'j'},
- "a-k": {vaxis.ModAlt, 'k'},
- "a-l": {vaxis.ModAlt, 'l'},
- "a-m": {vaxis.ModAlt, 'm'},
- "a-n": {vaxis.ModAlt, 'n'},
- "a-o": {vaxis.ModAlt, 'o'},
- "a-p": {vaxis.ModAlt, 'p'},
- "a-q": {vaxis.ModAlt, 'q'},
- "a-r": {vaxis.ModAlt, 'r'},
- "a-s": {vaxis.ModAlt, 's'},
- "a-t": {vaxis.ModAlt, 't'},
- "a-u": {vaxis.ModAlt, 'u'},
- "a-v": {vaxis.ModAlt, 'v'},
- "a-w": {vaxis.ModAlt, 'w'},
- "a-x": {vaxis.ModAlt, 'x'},
- "a-y": {vaxis.ModAlt, 'y'},
- "a-z": {vaxis.ModAlt, 'z'},
- "a-]": {vaxis.ModAlt, ']'},
- "a-\\": {vaxis.ModAlt, '\\'},
- "a-[": {vaxis.ModAlt, '['},
- "a-^": {vaxis.ModAlt, '^'},
- "a-_": {vaxis.ModAlt, '_'},
"nul": {vaxis.ModCtrl, ' '},
"soh": {vaxis.ModCtrl, 'a'},
"stx": {vaxis.ModCtrl, 'b'},
@@ -747,10 +668,36 @@ func ParseKeyStrokes(keystrokes string) ([]KeyStroke, error) {
return nil, errors.New("Expected a key name")
}
name = name[:len(name)-1]
- if key, ok := keyNames[strings.ToLower(name)]; ok {
- strokes = append(strokes, key)
- } else {
- return nil, fmt.Errorf("Unknown key '%s'", name)
+ args := strings.Split(name, "-")
+ // check if the last char was a '-' and we'll add it
+ // back. We check for "--" in case it was an invalid
+ // keystroke (ie <C->)
+ if strings.HasSuffix(name, "--") {
+ args = append(args, "-")
+ }
+ ks := KeyStroke{}
+ for i, arg := range args {
+ if i == len(args)-1 {
+ key, ok := keyNames[strings.ToLower(arg)]
+ if !ok {
+ r, n := utf8.DecodeRuneInString(arg)
+ if n != len(arg) {
+ return nil, fmt.Errorf("Unknown key '%s'", name)
+ }
+ key = KeyStroke{Key: r}
+ }
+ ks.Key = key.Key
+ ks.Modifiers |= key.Modifiers
+ strokes = append(strokes, ks)
+ }
+ switch strings.ToLower(arg) {
+ case "s", "S":
+ ks.Modifiers |= vaxis.ModShift
+ case "a", "A":
+ ks.Modifiers |= vaxis.ModAlt
+ case "c", "C":
+ ks.Modifiers |= vaxis.ModCtrl
+ }
}
case '>':
return nil, errors.New("Found '>' without '<'")
diff --git a/config/binds_test.go b/config/binds_test.go
index a92cf22f..7d4cd779 100644
--- a/config/binds_test.go
+++ b/config/binds_test.go
@@ -13,7 +13,10 @@ func TestGetBinding(t *testing.T) {
bindings := NewKeyBindings()
add := func(binding, cmd string) {
- b, _ := ParseBinding(binding, cmd, "")
+ b, err := ParseBinding(binding, cmd, "")
+ if err != nil {
+ t.Fatal(err)
+ }
bindings.Add(b)
}
@@ -58,6 +61,8 @@ func TestGetBinding(t *testing.T) {
add("<C-Down>", ":next")
add("<C-PgUp>", ":prev")
add("<C-Enter>", ":open")
+ add("<C-->", ":open")
+ add("<S-up>", ":open")
test([]KeyStroke{
{vaxis.ModCtrl, 'a'},
}, BINDING_FOUND, "c-a")
@@ -73,4 +78,10 @@ func TestGetBinding(t *testing.T) {
test([]KeyStroke{
{vaxis.ModCtrl, vaxis.KeyEnter},
}, BINDING_FOUND, ":open")
+ test([]KeyStroke{
+ {vaxis.ModCtrl, '-'},
+ }, BINDING_FOUND, ":open")
+ test([]KeyStroke{
+ {vaxis.ModShift, vaxis.KeyUp},
+ }, BINDING_FOUND, ":open")
}
diff --git a/doc/aerc-binds.5.scd b/doc/aerc-binds.5.scd
index a46b6427..de8f436c 100644
--- a/doc/aerc-binds.5.scd
+++ b/doc/aerc-binds.5.scd
@@ -147,8 +147,14 @@ available in each binding context:
# SUPPORTED KEYS
In addition to letters and some characters (e.g. *a*, *RR*, *gu*, *?*, *!*,
-etc.), special keys may be specified in *<angle brackets>*. The following
-special keys are supported:
+etc.), special keys may be specified in *<angle brackets>*. The syntax for
+modified or special keys is:
+
+ <C-A-S-key>
+
+Where C is control, A is alt, S is shift, and key is the named key or character.
+
+Valid key names are:
[[ *Name*
:- *Description*
@@ -162,40 +168,16 @@ special keys are supported:
: Enter
| *<up>*
: Up arrow
-| *<c-up>*
-: Ctrl+Up
-| *<a-up>*
-: Alt+Up
| *<down>*
: Down arrow
-| *<c-down>*
-: Ctrl+Down
-| *<a-down>*
-: Alt+Down
| *<right>*
: Right arrow
-| *<c-right>*
-: Ctrl+Right
-| *<a-right>*
-: Alt+Right
| *<left>*
: Left arrow
-| *<c-left>*
-: Ctrl+Left
-| *<a-left>*
-: Alt+Left
| *<pgup>*
: Page Up
-| *<c-pgup>*
-: Ctrl+PageUp
-| *<a-pgup>*
-: Alt+PageUp
| *<pgdn>*
: Page Down
-| *<c-pgdn>*
-: Ctrl+PageDn
-| *<a-pgdn>*
-: Alt+PageDn
| *<home>*
: Home
| *<end>*
@@ -204,10 +186,6 @@ special keys are supported:
: Insert
| *<delete>*
: Delete
-| *<c-delete>*
-: Ctrl+Delete
-| *<a-delete>*
-: Alt+Delete
| *<backspace>*
: Backspace
| *<exit>*
@@ -222,150 +200,6 @@ special keys are supported:
: Shift+Tab
| *<esc>*
: Escape
-| *<c-space>*
-: Ctrl+Space
-| *<a-space>*
-: Alt+Space
-| *<a-0>*
-: Alt+0
-| *<a-1>*
-: Alt+1
-| *<a-2>*
-: Alt+2
-| *<a-3>*
-: Alt+3
-| *<a-4>*
-: Alt+4
-| *<a-5>*
-: Alt+5
-| *<a-6>*
-: Alt+6
-| *<a-7>*
-: Alt+7
-| *<a-8>*
-: Alt+8
-| *<a-9>*
-: Alt+9
-| *<c-a>*
-: Ctrl+a
-| *<a-a>*
-: Alt+a
-| *<c-b>*
-: Ctrl+b
-| *<a-b>*
-: Alt+b
-| *<c-c>*
-: Ctrl+c
-| *<a-c>*
-: Alt+c
-| *<c-d>*
-: Ctrl+d
-| *<a-d>*
-: Alt+d
-| *<c-e>*
-: Ctrl+e
-| *<a-e>*
-: Alt+e
-| *<c-f>*
-: Ctrl+f
-| *<a-f>*
-: Alt+f
-| *<c-g>*
-: Ctrl+g
-| *<a-g>*
-: Alt+g
-| *<c-h>*
-: Ctrl+h
-| *<a-h>*
-: Alt+h
-| *<c-i>*
-: Ctrl+i
-| *<a-i>*
-: Alt+i
-| *<c-j>*
-: Ctrl+j
-| *<a-j>*
-: Alt+j
-| *<c-k>*
-: Ctrl+k
-| *<a-k>*
-: Alt+k
-| *<c-l>*
-: Ctrl+l
-| *<a-l>*
-: Alt+l
-| *<c-m>*
-: Ctrl+m
-| *<a-m>*
-: Alt+m
-| *<c-n>*
-: Ctrl+n
-| *<a-n>*
-: Alt+n
-| *<c-o>*
-: Ctrl+o
-| *<a-o>*
-: Alt+o
-| *<c-p>*
-: Ctrl+p
-| *<a-p>*
-: Alt+p
-| *<c-q>*
-: Ctrl+q
-| *<a-q>*
-: Alt+q
-| *<c-r>*
-: Ctrl+r
-| *<a-r>*
-: Alt+r
-| *<c-s>*
-: Ctrl+s
-| *<a-s>*
-: Alt+s
-| *<c-t>*
-: Ctrl+t
-| *<a-t>*
-: Alt+t
-| *<c-u>*
-: Ctrl+u
-| *<a-u>*
-: Alt+u
-| *<c-v>*
-: Ctrl+v
-| *<a-v>*
-: Alt+v
-| *<c-w>*
-: Ctrl+w
-| *<a-w>*
-: Alt+w
-| *<c-x>*
-: Ctrl+x
-| *<a-x>*
-: Alt+x
-| *<c-y>*
-: Ctrl+y
-| *<a-y>*
-: Alt+y
-| *<c-z>*
-: Ctrl+z
-| *<a-z>*
-: Alt+z
-| *<c-]>*
-: Ctrl+]
-| *<a-]>*
-: Alt+]
-| *<c-[>*
-: Ctrl+[
-| *<a-[>*
-: Alt+[
-| *<c-^>*
-: Ctrl+^
-| *<a-^>*
-: Alt+^
-| *<c-\_>*
-: Ctrl+\_
-| *<a-\_>*
-: Alt+\_
# SEE ALSO