{"record":{"id":"e2463f5bb6213293","repo":"junegunn/fzf","slug":"unknown-action-spec","errorCode":null,"errorMessage":"unknown action: ${spec}","messagePattern":"unknown action: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/options.go","lineNumber":1979,"sourceCode":"\t\tcase \"wait\":\n\t\t\tappendAction(actWait)\n\t\tcase \"bell\":\n\t\t\tappendAction(actBell)\n\t\tcase \"exclude\":\n\t\t\tappendAction(actExclude)\n\t\tcase \"exclude-multi\":\n\t\t\tappendAction(actExcludeMulti)\n\t\tcase \"bg-cancel\":\n\t\t\tappendAction(actBgCancel)\n\t\tdefault:\n\t\t\tt := isExecuteAction(specLower)\n\t\t\tif t == actIgnore {\n\t\t\t\tif specIndex == 0 && specLower == \"\" {\n\t\t\t\t\tactions = append(prevActions, actions...)\n\t\t\t\t} else if specLower == \"change-multi\" {\n\t\t\t\t\tappendAction(actChangeMulti)\n\t\t\t\t} else {\n\t\t\t\t\treturn nil, errors.New(\"unknown action: \" + spec)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toffset := len(actionNameRegexp.FindString(spec))\n\t\t\t\tvar actionArg string\n\t\t\t\tif spec[offset] == ':' {\n\t\t\t\t\tif specIndex == len(originalStrings)-1 {\n\t\t\t\t\t\tactionArg = spec[offset+1:]\n\t\t\t\t\t\tactions = append(actions, &action{t: t, a: actionArg})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprevSpec = spec + \"+\"\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tactionArg = spec[offset+1 : len(spec)-1]\n\t\t\t\t\tactions = append(actions, &action{t: t, a: actionArg})\n\t\t\t\t}\n\t\t\t\tswitch t {\n\t\t\t\tcase actUnbind, actRebind, actToggleBind:","sourceCodeStart":1961,"sourceCodeEnd":1997,"githubUrl":"https://github.com/junegunn/fzf/blob/bd4efa277b49ef34ca4025bff9b1a288e1980eff/src/options.go#L1961-L1997","documentation":"Thrown while parsing a --bind action list. After all known action names are exhausted, the token is matched against execute-style actions (execute(...), execute-silent(...), reload(...), etc. via isExecuteAction); if that also fails and the token is not the empty first token (multi-key continuation) or 'change-multi', it is an unknown action and parsing aborts.","triggerScenarios":"`--bind 'ctrl-f:foobar'`, a misspelled action like `--bind 'ctrl-f:refrsh'`, or an action name from a newer/older fzf version than the one in use (e.g. 'change-multi' on an old build).","commonSituations":"Typos in bind specs; copy-pasting bind lines from blog posts or fzf wiki pages targeting a different fzf version; trailing whitespace/case issues since the spec is matched case-insensitively but must still be a real action name.","solutions":["Check the action name against `fzf --man` (MANPAGE section ACTIONS) and fix the typo","Confirm the action exists in your fzf version: `fzf --version`; upgrade fzf if the action is newer","For execute actions, verify the full execute(...) syntax is used, since a bare prefix is not an action name"],"exampleFix":"# before\nfzf --bind 'ctrl-f:refrsh-preview'\n# after\nfzf --bind 'ctrl-f:refresh-preview'","handlingStrategy":"validation","validationCode":"# bash: check action name against the binary's own list before use\naction_ok() {\n  fzf --man 2>/dev/null | grep -qE \"(^|[[:space:]])${1}(:|$)\"\n}\naction_ok refresh-preview || { echo \"bad action\" >&2; exit 1; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pin fzf version in dotfile repos and test binds after upgrades","Prefer a shared variable/constant for action names instead of retyping them in many bind lines"],"tags":["fzf","go","cli","keybinding","bind","validation"],"backgroundTag":null,"analyzedSha":"bd4efa277b49ef34ca4025bff9b1a288e1980eff","analyzedAt":"2026-08-15T06:11:46.983Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}