{"id":33185491,"url":"https://github.com/Squirreljetpack/fzs","last_synced_at":"2025-11-17T10:01:33.150Z","repository":{"id":255580002,"uuid":"852333142","full_name":"Squirreljetpack/fzs","owner":"Squirreljetpack","description":"A command-line fuzzy finder for your programs","archived":false,"fork":false,"pushed_at":"2025-04-26T00:44:06.000Z","size":659,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-17T12:34:05.839Z","etag":null,"topics":["fzf","shell"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Squirreljetpack.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-04T16:16:42.000Z","updated_at":"2025-10-05T22:47:41.000Z","dependencies_parsed_at":"2024-10-29T02:17:16.148Z","dependency_job_id":"8e18ef43-a07d-4238-97ff-ed0a0cc70ede","html_url":"https://github.com/Squirreljetpack/fzs","commit_stats":null,"previous_names":["squirreljetpack/fzs"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/Squirreljetpack/fzs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Squirreljetpack%2Ffzs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Squirreljetpack%2Ffzs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Squirreljetpack%2Ffzs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Squirreljetpack%2Ffzs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Squirreljetpack","download_url":"https://codeload.github.com/Squirreljetpack/fzs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Squirreljetpack%2Ffzs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":284861038,"owners_count":27075155,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-17T02:00:06.431Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fzf","shell"],"created_at":"2025-11-16T05:00:20.092Z","updated_at":"2025-11-17T10:01:33.143Z","avatar_url":"https://github.com/Squirreljetpack.png","language":"Rust","funding_links":[],"categories":["\u003ca name=\"launcher\"\u003e\u003c/a\u003eCommand launchers"],"sub_categories":[],"readme":"# FZS\n\nFZS is a fuzzy selector for your binaries.\n\nIt generalizes the function of launchers like rofi and alfred/raycast.\nUsing the concept of a [plugin](#plugin) to group related [actions](#action), it allows you to access any of your binaries/scripts/shell functions/aliases **within 2-3 keystrokes** in the vast majority of cases.\n\n\u003e [!NOTE]\n\u003e\n\u003e It does this by auto-accepting based on the starting substring.\n\u003e\n\u003e If there is no starting substring match, the selector falls back to fuzzy selection.\n\u003e\n\u003e - Enter/Space can be used to manually accept.\n\n\u003cimg src=\".README.assets/plugins.png\" alt=\"image-20240922030848010\" width=36.4% /\u003e \u003cimg src=\".README.assets/functions.png\" alt=\"image-20240922030759901\" width=41% /\u003e\n\n\u003ccaption\u003e\u003ci\u003eactions can do anything from launching apps, to managing docker containers, to selecting windows, to running tasks in the background, to selecting files to checkout from git...\u003c/i\u003e\u003c/caption\u003e\n\u003c/br\u003e\n\n\u003c/br\u003e\n\nFZS was defined to be simple, hackable, modular and portable. It uses a few rules to parse your plugin folders and convert the contents into functions. Using the parsed structure, it creates:\n\n- a folder of executables which get added to your PATH\n  - ...allowing you to autocomplete your (now namespaced) actions\n- a short initialization script providing some base functionality.\n- and fully customizable individual selectors for each plugin.\n  - ...built from by supplying the parsed content to a template, which is itself customizable, as are most other things.\n\n\u003e [!NOTE]\n\u003e\n\u003e Once the creation is done, fzs gets out of your way. \n\u003e\n\u003e - It leaves your files untouched, and **doesn't necessitate any specific changes or extra work in your setup to accomodate it, beyond sorting your commands and scripts into plugin folders**.\n\u003e   - However, it does make use of an optional special naming format which allows you to specify finer details about your commands.\n\u003e - The finished initialization scripts are pure compiled zsh, and and take less than \u003c1ms on an M1.\n\n**Other features** include:\n\n- Turning functions into zle [widgets](#flags), (allowing you to modify your command line on the fly or access them through keybinds)\n- Auto-compile your source code (In progress)\n- Declutter your PATH while keeping everything organized\n  - This is can really impove your computer's performance\n- Complete and helpful error checking, together with an optimized mode that can be run on shell startup to auto-update (In progress)\n- ...[More features](#Flags)\n\n# Concepts\n\nFZS is mainly an organizational framework. Related actions are grouped into *Plugins*, which live as folders within a `FZS_ROOT_DIR` (default: `~/.fzs`) on your machine.\n\n\u003cimg src=\".README.assets/dir_structure.png\" alt=\"Directory structure\" width=55%/\u003e\n\nA folder is treated as a Plugin if its name matches a `plugin_regex`. The root directory scans for plugins non-recursively, and for each, the following happens:\n\n\u003e [!NOTE]\n\u003e\n\u003e By default, this is `^([a-zA-Z0-9]+)(?:_([a-zA-Z0-9-]+))?(?:_([a-zA-Z0-9-]+))?_select$` ([See](#Structs)). That means it any folder that looks like `name_alias?_description?_select` will become a Plugin with the fields of `name, alias, description`. \n\u003e\n\u003e - The name of the plugin should be a unique (descriptive) identifier\n\u003e - The alias of a plugin is the actual namespace the plugin's actions get put under.\n\u003e   - For example, an executable `dlv` living inside a folder `video_v_video-plugins_select`, is accessible using [`v.dlv`](#Finally,-downloading-plugins), or `v.\u003cTAB\u003e` if you have autocomplete.\n\u003e   - Defaults to name if not provided.\n\u003e   - Aliases need not be unique, so that you may combine multiple related plugins.\n\u003e - The description is shown sometimes when using certain selectors/autocomplete functions.\n\nThe plugin is populated with executables from its folder matching the `fn_regex`.\nThe functions get symlinked to fn_template (Default: `{{ pg_alias }}.{{ name }}`).\n\n\u003e [!NOTE]\n\u003e\n\u003e By default, this is, `^(_*[a-zA-Z0-9-]+)(?:_([a-zA-Z0-9-]*))?(?:_([a-zA-Z0-9-\\(\\)_ ]+))?(?:\\.[a-zA-Z0-9,\\. ]+)?` meaning that any executable that looks like `name_alias_description.modifiers(.ext)?` gets parsed into the expected function, which is included in a plugin selector, and shown below.\n\u003e\n\u003e - Modifiers make it easy for you configure extra behavior your functions without resorting to a config file, at the expense of weird file names.\n\n\u003cimg src=\".README.assets/main_plugins.png\" alt=\"main_plugins\" width=\"50%\"/\u003e \u003cimg src=\".README.assets/docker_plugin.png\" alt=\"docker_plugin\" width=\"50%\"/\u003e\n\nPlugins can also be configured in *sources*: non-executable files with a specific extension within the associated directory (Default: `.zshrc`), allowing you to effortlessly include your aliases and shell functions (more on that below).\n\n\u003e [!NOTE]\n\u003e\n\u003e There is also neutered version of a plugin, called a linkedbin. It parses a pattern of `_name_description?`, and namespaces your functions in that folder, but the executables under it do not get added to the selector. Note that if you use a `name` which collides with an existing plugin, the linkedbin is merged with that plugin, and its functions are accessible under the `alias` of that plugin.\n\u003e \tEssentially, it just auto-adds the `NA` [flag](#NA) to every parsed executable.\n\u003e\n\u003e This is helpful for helper scripts, you may choose to use a folder name like `_docker_libs` or `_provision_terraform-libs`.\n\nNext, the sources are scanned for lines beginning with `# :`. Include this above your function, named like `$name_alias?_description?` (The same `fn_regex`, but prefixed with a `$`), and your function will be included in the plugin, just like an actual binary.\n\n\u003e [!NOTE]\n\u003e\n\u003e ZSH variable declaration rules means you are a limited to valid characters which don't include `-`, but you can get around it by overriding the name on the hash line, using the CMD flag, or using a different namingScheme.\n\nFinally, fzs handles the rest, and creates:\n\n- A plugin selector\n- A selector for all parsed functions (even linkedbins)\n- Selectors for all your plugins\n- Various widgets, keybinds, aliases associated to your actions\n\nThe rest is up to the plugins you choose.\n\n##### Modifiers\n\nThe hash line allows further options, in general, you may use the form `# : FLAG1,...FLAGN name=nothing-nice alias=tosay cmd=echo binds=^E desc=nothing at all`\nThese field=value tokens are called *modifiers*, and are space seperated, except for `desc`, which must be the last if present.\n\nThe are allowed on executable filenames too, after the first period. i.e. `rg.wjr binds=^[[1;2B` will allow you to call your rg script using `shift-down`. (This format for parsing is non-configurable, but these options can also be set through a config file).\n\n# Guide\n\n## Installation\n\n1. Install [fzf](https://github.com/junegunn/fzf?tab=readme-ov-file#installation)\n   - You may want to configure `FZF_DEFAULT_OPTS` as well ([See](#usage-tips)).\n2. \n\n```shell\ncargo install fzs\n```\n\nBinaries are also available from the release page.\n\n3. Optionally, install:\n   - [bat](https://github.com/sharkdp/bat)/[eza](https://github.com/eza-community/eza) to improve fzf preview experience.\n     - Add the following to your config:\n       - `preview_dir_cmd = \"eza -T -L 2 --icons --color=always ${@}\"`\n       - `preview_pager_cmd = \"bat -p --color=always --terminal-width \\\\$FZF_PREVIEW_COLUMNS\"`\n   - [pueue](https://github.com/Nukesor/pueue) to allow running commands in background.\n     - Use the `PBG` flag to enable this on a compatible action.\n\n## Configuration\n\nPut your binaries and shell functions in `FZS_ROOT_DIR` (default: `~/.fzs`)\n\nThe config file lives in `~/.config/fzs` or can be supplied with `fzs --config \u003cfilepath\u003e` (todo). Check [Structs](#structs) for all available options.\n\n- Note that any useful plugin setting can also be configured using modifiers and decorators, so that only the `[settings]` block is needed.\n- The config file can however, override any values set in the scanning stage.\n- For example:\n\n```toml\n[[plugins]]\nname = \"pijul\"\nalias = \"pj\"\nfns = [\n    { name=\"diff\", alias=\"pjd\", cmd=\"pj diff | bat -l diff\" }, # available as pj.diff or pjd\n    { name=\"log-hashes\", alias=\"pjlh\", cmd='pijul log --hash-only' },\n    { name=\"changes\", FLAGS=\"WJSUB\" }, # Adds the output of the pj.changes to your command line buffer\n    { name = \"pull\", binds = [ \"^x^p\" ] }, # (turns the binary pj.pull, which must be defined elsewhere, into a widget, and) adds the ^x^p keybind to call it. Use cat -v to find your keybind keycode. \n    { name = \"push\", flags = [ \"PBG\" ] } # Runs pj.push in the background when selected, requires pueue\n]\n\n[[plugins]]\nname = \"eza\"\nfns = [\n    { name=\"list-all\", cmd=\"eza -la\", bind='^[OQ' },\n    { name = \"find\", flags = [ \"PG\" ] }, # adds the find plugin to the eza_selector\n]\n\n# MAIN\n# Having each option start with a different letter makes selection quicker.\n[[plugins]]\nname = \"main\"\nalias = \"m\"\nfns = [\n    { name = \"command.wg\", alias=\"ffex\", flags = [ \"WG\" ], binds = [\"^[^X\"] }, # defined as a widget in, say, $HOME/.zsh/paths/main_select/main.zshrc\n    { name = \"background\", flags = [ \"PG\" ] }, # references a folder named background_select somewhere inside `root_dir`\n    { name = \"explain\", flags = [ \"PG\" ] },\n    { name = \"find\", flags = [ \"PG\" ] },\n    { name = \"git\", flags = [ \"PG\" ] },\n    { name = \"integrations\", flags = [ \"PG\" ] },\n    { name = \"kube\", flags = [ \"PG\" ] },\n    { name = \"l\", flags = [ \"PG\" ] },\n    { name = \"ranger\", flags = [ \"PG\" ] },\n    { name = \"monitor\", flags = [ \"PG\" ] },\n    { name = \"network\", flags = [ \"PG\" ] },\n    { name = \"peek\", flags = [ \"PG\" ] },\n    { name = \"system\", flags = [ \"PG\" ] },\n    { name = \"vid\", flags = [ \"PG\" ] },\n]\nbinds = [ \"^[w\" ]\n\n[settings]\nroot_dir = \"$HOME/.zsh/paths\"\nplugin_selector_binds = [ \"^[p\" ]\npreview_dir_cmd = \"eza -T -L 2\"\npreview_pager_cmd = \"bat -p --color=always\"\n```\n\n## Finally, downloading plugins\n\nA window, app, file, directory, quick peek launcher can be found [here](https://github.com/Squirreljetpack/fzs-basic-plugins).\n\n1. Clone it into  `FZS_ROOT_DIR`\n2. (Migrate/download other plugins)\n3. Run fzs\n4. Paste the output into your `.zshrc`\n5. Run `exec zsh`\n6. Activate the default selectors with `^]f`, `^]p` ! (Make sure they aren't overridden).\n\n# Usage tips\n\nBind a key to switch to terminal and activate your \"main\" selector.\nOn mac, this requires Karabiner or shkd (and yabai if you need instant desktop switching). Here is my karabiner json:\n\n```json\n{\n    \"conditions\": [\n        {\n            \"bundle_identifiers\": [\n                \"^com\\\\.apple\\\\.Terminal$\",\n                \"^com\\\\.googlecode\\\\.iterm2$\",\n                \"^co\\\\.zeit\\\\.hyperterm$\",\n                \"^co\\\\.zeit\\\\.hyper$\",\n                \"^io\\\\.alacritty$\",\n                \"^org\\\\.alacritty$\",\n                \"^net\\\\.kovidgoyal\\\\.kitty$\",\n            ],\n            \"type\": \"frontmost_application_unless\"\n        }\n    ],\n    \"from\": {\n        \"key_code\": \"w\",\n        \"modifiers\": { \"mandatory\": [\"control\", \"left_option\"] }\n    },\n    \"parameters\": { \"basic.to_delayed_action_delay_milliseconds\": 200 },\n    \"to\": [\n        { \"shell_command\": \"/opt/homebrew/bin/yabai  -m space --focus 7\" }\n    ],\n    \"to_delayed_action\": {\n        \"to_if_canceled\": [\n            {\n                \"key_code\": \"w\",\n                \"modifiers\": [\"right_option\"]\n            }\n        ],\n        \"to_if_invoked\": [\n            {\n                \"key_code\": \"w\",\n                \"modifiers\": [\"right_option\"]\n            }\n        ]\n    },\n    \"type\": \"basic\"\n},\n\n```\n\nOn Linux, it's a lot easier and smoother:\n\n```\n (todo)\n```\n\n\n\n\u003e [!NOTE]\n\u003e\n\u003e You may also need to include `yabai -m signal --add event=space_changed action='yabai -m window --focus $(yabai -m query --windows --space | jq -r '\\''[.[]|select(.\"is-visible\")][0].id'\\'')'` if you are selecting by space.\n\n- Having each option start with a different letter makes selection quicker.\n- To set define a \"default action\" for your plugin, you may want to use a name for the action sharing the same first letter with the plugin, so that you can double-tap to activate.\n\nfzs also treats a plugin whose name is `base` as a special case:\n\n- The executables inside are not namespaced (The `fn_template` is not applied to them)\n- All executables within are detected, not just \n\nSo i.e., you could just drop/symlink all your existing extra `$PATH` directories in here, and use fzs as just a selector for them, *if you wish*.\n\nYou may want to implement some shared keybinds on fzf:\n\n```zsh\nexport FZF_DEFAULT_OPTS=\"\n--info=inline\n--preview-window=:hidden:cycle\n--cycle\n--ansi\n--preview 'lessfilter {}'\n--prompt='∼ ' --pointer='▶' --marker='✓'\n--bind '?:toggle-preview'\n--bind 'ctrl-a:select-all'\n--bind 'ctrl-y:execute-silent(echo {+} | pbcopy)' # your clipboard command of choice\n--bind 'ctrl-o:execute(o {1})' # open -a if you're on mac, xdg-open if on linux\n--bind 'alt-o:execute($EDITOR {1})'\"\n```\n\n# Alternatives\n\n- Rofi\n- Alfred\n- Raycast\n- fzf-tab\n\n## Comparison\n\nTODO\n\n# Structs\n\n\n\n## Plugin\n\n```rust\nstruct Plugin {\n    name: String,\n    alias: Option\u003cString\u003e,\n    desc: Option\u003cString\u003e,\n    fns: HashMap\u003cString, Action\u003e,\n    sources: Vec\u003cPathBuf\u003e,\n    binds: Vec\u003cKeybind\u003e,\n    // not recommended to set\n\tpath: PathBuf\n    fn_template: Option\u003cString\u003e,\n    fn_table_template: Option\u003cString\u003e,\n}\n```\n\n## Fun\n\n```rust\nstruct Fun {\n    name: String,\n    alias: Option\u003cString\u003e,\n    desc: Option\u003cString\u003e,\n    cmd: Option\u003cString\u003e,\n    flags: FnFlags,\n    binds: Vec\u003cKeybind\u003e,\n}\n```\n\n## GlobalConfig\n\n```rust\nstruct GlobalConfig {\n    root_dir: PathBuf,  // the directory to scan\n    path_dir: PathBuf,  // where your binaries are symlinked to\n    config_dir: PathBuf, // not available in .config\n    data_dir: PathBuf,  // where the resultant initialization scripts live\n    plugin_regex: Regex, // The regex used to detect plugins. Supports name alias? desc? as the capturing groups in order\n    linkedbin_regex: Regex, // The regex used to detect linkedbins. Supports alias? desc? as the capturing groups in order\n    fn_regex: Regex, // The regex used to detect actions. Supports name alias? desc? as the capturing groups in order\n    parse_cmd_regex: Regex, // The inverse regex for command -\u003e action. An autogenerated implementation is provided and should suffice in most cases.\n    name_from_alias_template: String, // When decorated with # AL, the following alias declaration is parsed into an action using this name. See # Templates.\n    name_from_widget_template: String, // It's useful for autocomplete, to be able to tell which commands should only be run as widgets. A widget with the toggle-scope flag will apply this transformation to the name field of its command.\n    selector_widget_template: String, // The command template for a selector widget\n    fn_template: String, // What a binary gets symlinked to\n    fn_table_template: String, // The format used to pass a function into the fzf selector, see # Templates\n    all_fn_table_template: String, // The format used to pass a function into the fzf selector for all functions, see # Templates\n    template_file: PathBuf, // The template file used to build a selector widget. Allows for full customization of the selector behavior. One is created by default in config_dir if not specified.\n    init_file: PathBuf, // The path to use for the generated file which initializes fzs and sources your source scripts, relative to `data_dir`.\n    fzs_name: String,  // The namespace for fzs related helper shell functions\n    generated_file: PathBuf,  // The path to use for the generated file which initializes plugins, relative to `data_dir`.\n    plugin_selector_binds: Keybinds,  // The keybinds to activate the selector for all plugins (default: ^[p)\n    all_fn_selector_binds: Keybinds, // The keybinds to activate the selector for all functions (default: ^[f)\n    fzs_preview_dir_cmd: String,  // Templated into the init_file to configure which command is used to preview a directory (default: ls -la)\n    fzs_preview_pager_cmd: String, // Templated into the init_file to configure which command is used as a pager (default: less -RX)\n    fzs_fzf_cmd_preview: String, // Templated into the init_file to configure which command is used as a pager (default: source $fzs_init_file \u003e /dev/null 2\u003e\u00261; source $fzs_plugins_file \u003e /dev/null 2\u003e\u00261; which -a {3})\n    // This sources your functions so that all definitions are available. The effect should not be noticable\n}\n```\n\n## Flags\n\n```rust\nenum FnFlag {\n    WG, // Widget: Just makes the selector invoke this function with zle. Will also register the action with zle if cmd was not set directly.\n\n    // Auto-provisioning\n    WJR,  // Creates a widget from the target. Adds the current command-line to the stack and replaces it with the target's command, but does not execute (allowing the user to supply arguments).\n    WJSUB,  // Same as above, but the output is added to the command line buffer.\n\t  WR,   // Creates a widget from the target.\n    WSUB, // Creates a widget from the target. The output is added to the command line buffer. \n    PBG, // Replaces the function such that calling it will run it in the background. (Requires pueue).\n\n    // Running modes\n    SS, // Subshell: When selected, runs the command in a subshell\n    NR, // NR: When selected, fzs will not run the command, only add it to your command line buffer.\n\n    // Plugins\n    PG, // Plugin. Creates an action targeting the selector interface of another plugin.\n    PGI, // flatmap's the target plugin's actions into the containing plugin.\n\n\n    // Parsing and generating\n    NA, // NoAdd: The default flag for an executable in a linkedbin folder. The function is not included in the selector [of its parent].\n    NN, // The generated name of the function is not namespaced by its parent plugin, you can call it directly by it's name.\n    AL, // Only inside sources: Use it above a line of the form: alias name='echo hi'. It will add it to your plugin with a name built from name_from_alias_template. Contiguous alias declarations beneath it are also parsed.\n    TN, // Transform name. Applies a flag-dependent change to the name before generating using that name to generate its command (see the name_in_cmd_when_... options). On by default via auto_tn, recommended not to change.\n\n    // FZL\n    TV, // Invert Visibility. When zle is active, widgets are hidden. This flag enables the widget even when zle is not active. On a non-widget, this hides the action when zle is inactive.\n    TK, // Keeps the command alive when $FZL_MODE is true.\n    \n}\n```\n\n\n\n# Templates\n\nfzs builds the resulting functions from the parsed structure using templates. Here are the defaults:\n\n- *fn_template*: `{{ pg_alias }}.{{ name }}`\n\n- *selector_widget_template*: `{{ alias }}._select.wg`\n\nThe last two have to do with the how the lines describing each action which are fed into the `$fzs_name._base-select.wg/$fzs_name.all-fn-select.wg` are built (See `fzs_init.zsh` in the source code):\n\n- *name_from_alias_template*: `{{ alias }}.al`\n- `{{ name }}  {{ flags }} {{ cmds }}  {{ desc }}`\n- all_fn_table_template: `{{ pg_alias }}\t\t{{ cmds }}\t{{ name }}\t{{ alias }}\t{{ desc }}`\n\n## source files\n\nfzs also provides the variables `this=plugin_alias, this_name=plugin_name` for your sources, which may aid you in defining your functions. For example, the following snippet runs the current command line using pueue:\n\n```zsh\n# : NN,WG\n$this.add.wg() {\n    pueue add -- $BUFFER\n    zle reset-prompt\n    zle kill-buffer\n}\n\nzle -N $this.add.wg\nbindkey '^[z' $this.add.wg\n```\n\n- The use of `NN` (no namespace) is because `$add.wg` is not a valid variable name and fzf won't be able to supply the actual name correctly. NN prevents fzf from renaming your command.\n\n\u003e [!NOTE]\n\u003e FZS does not template your sources!\n\u003e Advantages:\n\u003e \n\u003e - Your scripts remain valid zsh, allowing editors to work as normal\n\u003e - FZS only has to do very few write operations, and can be run at every shell startup if desired, ensuring your setup is always up to date.\n\u003e \n\u003e Disadvantages:\n\u003e \n\u003e - Doesn't provide true modularity for your scripts, so that renaming your plugin may break functions that rely on it. In particular, [`$this`](#source-files) cannot be used within a function.[^1]\n\n[^1]: If the default fn_template is kept, FZS provides `this(){echo ${${funcstack[2]}%%.*};}` which can used to refer to the current plugin's alias inside a function one level deep as an ugly workaround. \n\n# FAQ\n\n- Do not make sourced files executable (You can use `fd -g \"*.zshrc\" -t x -x chmod -x`)\n- When parsing fns from files, the available function characters are limited to `A-Za-z0-9_` due to shell syntax. You can use the `config.toml` to override if necessary. It is also recommended to use camelCase if your name or alias consists of multiple words.\n- Use the [base plugin](#usage-tips) to gather binaries without namespacing\n- If your binds don't register, make sure to load your fzs_plugins file(s) after other zsh plugins\n- How to always properly fold fzf preview?\n  - I don't know ... `fold -w \\${FZF_PREVIEW_COLUMNS}` works okay sometimes.\n- fzs works well in conjunction with fzs-tab: type your plugin prefix, and you can search through all registered bins under it.\n- Some flags are incompatible\n  - (Todo) Working on covering every case with an explanatory error message.\n- Why use `.`  and `_` as delimiter rather than say, `::` which is recommended by google?\n  - `:` shouldn't be used in filenames, as it's not supported on mac.\n  - `.` is easy to type, and is used in many languages to `namespace` things.\n  - The choice of delimiter is not fixed, you are free to configure it.\n\n\n\n\n\n# Examples\n\n- wjr\n- Overloading a file with WG\n\n# fzl\n\n\n# Todo\n\u003e[!NOTE]\n\u003e The main functionality of fzs has all been **fully implemented, and tested**.\n\u003e The remaining minor improvements which are mentioned above and below are planned but haven't a concrete timeline.\n\n- [X] Release\n  - [ ] Github actions (Upload release)\n  - [ ] Refactor\n  - [ ] Tests on all platforms\n  - [ ] Wiki\n- [ ] Extra features\n  - [ ] Refactor!\n    - [ ] Rename fun to action\n    - [ ] a `--quick` mode that skips checks and uses caching\n    - [ ]  `--quick` should be able to run on shell startup (\u003c0.05 seconds)\n    - [ ] By default fzs_init should be refactored, and copy source file contents \n  - [ ] More options to autoconfigure widgets from file\n  - [ ] Explain eval \\$cmd in README\n  - [ ] Frequency sort\n  - [ ] Make one-accept an option over default\n  - [ ] More widget modes\n  - [ ] template out fzf_help_cmd\n  - [ ] .zshrc and other formats: .c, rust, etc?\n  - [ ] Would be nice to also bring functions defined elsewhere under a snippet, we could have a macro # : target=have which can do this + add conditionally check existence to decide whether to add to fn_table during runtime\n  - [ ] git hook example\n  - [ ] Properly format columns\n  - [ ] Extend structures\n    - [x] Flatmap plugins\n      - [ ] Customizable name template\n    - [ ] Composition\n  - [ ] Cow for functions\n  - [ ] Better previews for plugins\n    - [ ] Should accept a function which takes as input the code of the action. Should output to command.alnum_only\n  - [ ] Conditional plugin\n    - [ ] Seperate flags for visibility\n  - [ ] Bugs\n    - [ ] Incorrect previews can be generated if name conflicts (i.e. name of command is name of plugin)\n  - better all-plugin selection interface rules","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSquirreljetpack%2Ffzs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FSquirreljetpack%2Ffzs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSquirreljetpack%2Ffzs/lists"}