Full Code of gazorby/fifc for AI

main a01650cd432b cached
50 files
46.0 KB
15.0k tokens
1 requests
Download .txt
Repository: gazorby/fifc
Branch: main
Commit: a01650cd432b
Files: 50
Total size: 46.0 KB

Directory structure:
gitextract__9qpmax8/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       └── ci.yml
├── .pre-commit-config.yaml
├── CHANGELOG.md
├── LICENSE
├── README.md
├── completions/
│   └── fifc.fish
├── conf.d/
│   └── fifc.fish
├── cz.yaml
├── functions/
│   ├── _fifc.fish
│   ├── _fifc_action.fish
│   ├── _fifc_completion_group.fish
│   ├── _fifc_expand_tilde.fish
│   ├── _fifc_file_type.fish
│   ├── _fifc_help.fish
│   ├── _fifc_open_cmd.fish
│   ├── _fifc_open_dir.fish
│   ├── _fifc_open_file.fish
│   ├── _fifc_open_fn.fish
│   ├── _fifc_open_opt.fish
│   ├── _fifc_open_process.fish
│   ├── _fifc_parse_complist.fish
│   ├── _fifc_parse_pid.fish
│   ├── _fifc_path_to_complete.fish
│   ├── _fifc_preview_cmd.fish
│   ├── _fifc_preview_dir.fish
│   ├── _fifc_preview_file.fish
│   ├── _fifc_preview_file_default.fish
│   ├── _fifc_preview_fn.fish
│   ├── _fifc_preview_opt.fish
│   ├── _fifc_preview_process.fish
│   ├── _fifc_source_directories.fish
│   ├── _fifc_source_files.fish
│   ├── _fifc_test_version.fish
│   └── fifc.fish
└── tests/
    ├── _resources/
    │   ├── dir with spaces/
    │   │   ├── file 1.txt
    │   │   ├── file 2.txt
    │   │   └── file.json
    │   └── target.txt
    ├── test_exposed_vars.fish
    ├── test_fifc.fish
    ├── test_file_type.fish
    ├── test_group.fish
    ├── test_match_order.fish
    ├── test_open_cmd.fish
    ├── test_open_file.fish
    ├── test_preview_file.fish
    ├── test_source.fish
    └── version_test.fish

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ""
labels: bug
assignees: Gazorby
---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**System (please complete the following information):**

- fish version
- Distribution `cat /etc/os-release`

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ""
labels: enhancement
assignees: ""
---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  push:
    branches: [main]
  pull_request:

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:
  tests:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [macos-latest, ubuntu-latest]

    steps:
      - uses: actions/checkout@v3
      - uses: fish-actions/install-fish@v1.1.0

      - name: Install abbreviation-tips with Fisher
        uses: fish-shop/install-plugin@v1
        with:
          plugin-manager: fisher
          plugins: gazorby/fifc

      - name: Set up Homebrew
        uses: Homebrew/actions/setup-homebrew@master
        # Homebrew is only missing from ubuntu images per https://github.com/actions/runner-images/issues/6283
        if: matrix.os == 'ubuntu-latest'

      - name: Install fzf and fd
        run: brew install fzf fd

      - name: Run Fishtape tests
        uses: fish-shop/run-fishtape-tests@v1
        with:
          pattern: tests/**.fish
        # timeout in case tests get stuck on fzf
        timeout-minutes: 3

  syntax-check:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - uses: fish-actions/install-fish@v1

      - uses: fish-actions/syntax-check@v1

  # check Fish format
  format-check:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - uses: fish-actions/install-fish@v1

      - uses: fish-actions/format-check@v1

  # check Markdown and Yaml format
  prettier:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actionsx/prettier@v2
        with:
          args: --check .


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v5.0.0
    hooks:
      - id: check-toml
      - id: mixed-line-ending
      - id: check-case-conflict
      - id: check-merge-conflict
      - id: check-docstring-first
      - id: check-added-large-files
      - id: check-executables-have-shebangs
      - id: debug-statements
      - id: end-of-file-fixer
      - id: fix-byte-order-marker
      - id: trailing-whitespace

  - repo: https://github.com/hugoh/pre-commit-fish.git
    rev: v1.2
    hooks:
      - id: fish_syntax
      - id: fish_indent


================================================
FILE: CHANGELOG.md
================================================
## v0.1.1 (2023-03-05)

### Fix

- **directories**: escape name with spaces instead of quoting them

### Perf

- improve completion group determination

## v0.1.0 (2023-01-23)

### Feat

- use `$EDITOR` as default editor


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2022 Matthieu MN

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
<div align="center">

# fifc 🐠

_fish fzf completions_

[![CI](https://github.com/gazorby/fifc/actions/workflows/ci.yml/badge.svg)](https://github.com/gazorby/fifc/actions/workflows/ci.yml)

fifc brings fzf powers on top of fish completion engine and allows customizable completion rules

</div>

![gif usage](../assets/demo.gif)

## ✅ Requirements

- [fish](https://github.com/fish-shell/fish-shell) 3.4.0+

## ✨ Features

- Preview/open any file: text, image, gif, pdf, archive, binary (using external tools)
- Preview/open command's man page
- Preview/open function definitions
- Preview/open full option description when completing commands
- Recursively search for files and folders when completing paths (using [fd](https://github.com/sharkdp/fd))
- Preview directory content
- Preview process trees (using [procs](https://github.com/dalance/procs))
- Modular: easily add your own completion rules
- Properly handle paths with spaces (needs fish 3.4+)

## 🚀 Install

```fish
fisher install gazorby/fifc
```

## 🔧 Usage

You only need to set one setting after install:

```fish
set -Ux fifc_editor <your-favorite-editor>
```

And enjoy built-in completions!

By default fifc override `tab`, but you can assign another keybinding:

```fish
# Bind fzf completions to ctrl-x
set -U fifc_keybinding \cx
```

fifc can use modern tools if available:

| Prefer                                           | Fallback to | Used for                                  | Custom options     |
| ------------------------------------------------ | ----------- | ----------------------------------------- | ------------------ |
| [bat](https://github.com/sharkdp/bat)            | cat         | Preview files                             | `$fifc_bat_opts`   |
| [chafa](https://github.com/hpjansson/chafa)      | file        | Preview images, gif, pdf etc              | `$fifc_chafa_opts` |
| [hexyl](https://github.com/sharkdp/hexyl)        | file        | Preview binaries                          | `$fifc_hexyl_opts` |
| [fd](https://github.com/sharkdp/fd)              | find        | Complete paths                            | `$fifc_fd_opts`    |
| [exa](https://github.com/ogham/exa)              | ls          | Preview directories                       | `$fifc_exa_opts`   |
| [ripgrep](https://github.com/BurntSushi/ripgrep) | pcregrep    | Search options in man pages               | -                  |
| [procs](https://github.com/dalance/procs)        | ps          | Complete processes and preview their tree | `$fifc_procs_opts` |
| [broot](https://github.com/Canop/broot)          | -           | Explore directory trees                   | `$fifc_broot_opts` |

Custom options can be added for any of the commands used by fifc using the variable mentioned in the above table.

Example:

Show line number when previewing files:

- `set -U fifc_bat_opts --style=numbers`

Show hidden file by default:

- `set -U fifc_fd_opts --hidden`

⚠️ Don't use quotes in variables, set them as a list: `set -U fifc_exa_opts --icons --tree`

## 🛠️ Write your own rules

Custom rules can easily be added using the `fifc` command. Actually, all builtin rules are added this way: see [conf.d/fifc.fish](https://github.com/gazorby/fifc/blob/52ff966511ea97ed7be79db469fe178784e22fd8/conf.d/fifc.fish)

See `fifc -h` for more details.

Basically, a rule allows you to trigger some commands based on specific conditions.

A condition can be either:

- A regex that must match commandline before the cursor position
- An arbitrary command that must exit with a non-zero status

If conditions are met, you can bind custom commands:

- **preview:** Command used for fzf preview
- **source:** Command that feeds fzf input
- **open:** Command binded to `fifc_open_keybinding` (defaults to ctrl-o)

All commands have access to the following variable describing the completion context:

| Variable           | Description                                                                                        | Command availability |
| ------------------ | -------------------------------------------------------------------------------------------------- | -------------------- |
| `fifc_candidate`   | Currently selected item in fzf                                                                     | all except source    |
| `fifc_commandline` | Commandline part before the cursor position                                                        | all                  |
| `fifc_token`       | Last token from the commandline                                                                    | all                  |
| `fifc_group`       | Group to which fish suggestions belong (possible values: directories, files, options or processes) | all                  |
| `fifc_extracted`   | Extracted string from the currently selected item using the `extracted` regex, if any              | all except source    |
| `fifc_query`       | fzf query. On source command, it is the initial fzf query (passed through `--query` option)        | all                  |

### **fifc_group** values

fifc test completion items to set `fifc_group` with the following conditions:

| Group       | Condition                                                    |
| ----------- | ------------------------------------------------------------ |
| directories | All completion items are directories                         |
| files       | Items can be either files _or_ directories                   |
| options     | All items match the following regex: `\h+\-+\h*$`            |
| processes   | All items match the following regex `^[0-9]+$` (list of PID) |

### Matching order

By default, fifc evaluate all rules in the order in which they have been defined and stops at the first where all conditions are met.
It does this each time it has to resolve source, preview and open commands.

Take the following scenario:

```fish
# Rule 1
fifc -n 'test "$fifc_group" = files' -p 'bat $fifc_candidate'
# Rule 2
fifc -n 'string match "*.json" "$fifc_candidate"' -p 'bat -l json $fifc_candidate'
```

When completing path, `$fifc_group` will be set to "files" so the first rule will always be valid in that case, and the second one will never be reached.

Another example:

```fish
# Rule 1
fifc --condition 'test "$fifc_group" = files' --preview 'bat $fifc_candidate'
# Rule 2
fifc --condition 'test "$fifc_group" = files' --source 'fd . --color=always --hidden $HOME'
```

Here, even if both rules have the same conditions, they won't interfere because fifc has to resolve source commands _before_ the preview commands, so order doesn't matter in this case.

### Override builtin rules

If you want to write your own rule based on the same conditions as one of the built-in ones, you can use fifc `--order` option.
It tells fifc to evaluate the rule in a predefined order, so you can set it to 1 to make sure it will be evaluated first.

When omitting the `--order`, the rule will be declared unordered and will be evaluated _after_ all other ordered rules, and all other unordered rules defined before.

All built-in rules are unordered.

### Examples

Here is how the built-in rule for file preview/open is implemented:

```fish
fifc \
    # If selected item is a file
    -n 'test -f "$fifc_candidate"' \
    # bind `_fifc_preview_file` to preview command
    -p _fifc_preview_file \
    # and `_fifc_preview_file` when pressing ctrl-o
    -o _fifc_open_file
```

Interactively search packages in archlinux:

```fish
fifc \
    -r '^(pacman|paru)(\\h*\\-S)?\\h+' \
    -s 'pacman --color=always -Ss "$fifc_token" | string match -r \'^[^\\h+].*\'' \
    -e '.*/(.*?)\\h.*' \
    -f "--query ''" \
    -p 'pacman -Si "$fifc_extracted"'
```

![gif usage](../assets/pacman.gif)

Search patterns in files and preview matches when commandline starts with `**<pattern>` (using [ripgrep](https://github.com/burntsushi/ripgrep) and [batgrep](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md#bat-extras-batgrep)):

```fish
fifc \
    -r '.*\*{2}.*' \
    -s 'rg --hidden -l --no-messages (string match -r -g \'.*\*{2}(.*)\' "$fifc_commandline")' \
    -p 'batgrep --color --paging=never (string match -r -g \'.*\*{2}(.*)\' "$fifc_commandline") "$fifc_candidate"' \
    -f "--query ''" \
    -o 'batgrep --color (string match -r -g \'.*\*{2}(.*)\' "$fifc_commandline") "$fifc_candidate" | less -R' \
    -O 1
```

![gif usage](../assets/batgrep.gif)

## ❤️ Credits

Thanks [PatrickF1](https://github.com/PatrickF1) (and collaborators!), for the great [fzf.fish](https://github.com/PatrickF1/fzf.fish) plugin which inspired me for the command-based configuration, and from which I copied the ci workflow.

## 📝 License

[MIT](https://github.com/gazorby/fifc/blob/87c965fe42a5b2ddb6e0ea84871ca56651db1cb2/LICENSE)


================================================
FILE: completions/fifc.fish
================================================
complete fifc --long condition --short -n --description "Command or fish function to be evaluated"
complete fifc --long regex --short r --description "Regex matching the part of the commandline before cursor"
complete fifc --long extract --short e --description "Regex applied on the sele cted candidate(s) to extract string to bo appended to the commandline (using capture groups)"
complete fifc --long order --short O --description "Order in which this rule must be evaluated"
complete fifc --long preview --short p --description "Preview command to be evaluated on the current candidate"
complete fifc --long open --short o --description "Open command to be evaluated on the current candidate"
complete fifc --long fzf-options --short f --description "Custom fzf options"


================================================
FILE: conf.d/fifc.fish
================================================
# Private
set -gx _fifc_comp_count 0
set -gx _fifc_unordered_comp
set -gx _fifc_ordered_comp

if status is-interactive
    # Keybindings
    set -qU fifc_keybinding
    or set -U fifc_keybinding \t

    set -qU fifc_open_keybinding
    or set -U fifc_open_keybinding ctrl-o

    for mode in default insert
        bind --mode $mode \t _fifc
        bind --mode $mode $fifc_keybinding _fifc
    end

    # Set sources rules
    fifc \
        -n 'test "$fifc_group" = "directories"' \
        -s _fifc_source_directories
    fifc \
        -n 'test "$fifc_group" = "files"' \
        -s _fifc_source_files
    fifc \
        -n 'test "$fifc_group" = processes' \
        -s 'ps -ax -o pid=,command='
end

# Load fifc preview rules only when fish is launched fzf
if set -q _fifc_launched_by_fzf
    # Builtin preview/open commands
    fifc \
        -n 'test "$fifc_group" = "options"' \
        -p _fifc_preview_opt \
        -o _fifc_open_opt
    fifc \
        -n 'test \( -n "$fifc_desc" -o -z "$fifc_commandline" \); and type -q -f -- "$fifc_candidate"' \
        -r '^(?!\\w+\\h+)' \
        -p _fifc_preview_cmd \
        -o _fifc_open_cmd
    fifc \
        -n 'test -n "$fifc_desc" -o -z "$fifc_commandline"' \
        -r '^(functions)?\\h+' \
        -p _fifc_preview_fn \
        -o _fifc_open_fn
    fifc \
        -n 'test -f "$fifc_candidate"' \
        -p _fifc_preview_file \
        -o _fifc_open_file
    fifc \
        -n 'test -d "$fifc_candidate"' \
        -p _fifc_preview_dir \
        -o _fifc_open_dir
    fifc \
        -n 'test "$fifc_group" = processes -a (ps -p (_fifc_parse_pid "$fifc_candidate") &>/dev/null)' \
        -p _fifc_preview_process \
        -o _fifc_open_process \
        -e '^\\h*([0-9]+)'
end


# Fisher
function _fifc_uninstall --on-event fifc_uninstall
end


================================================
FILE: cz.yaml
================================================
---
commitizen:
  annotated_tag: true
  bump_message: v$new_version
  name: cz_conventional_commits
  style:
    - - qmark
      - fg:#ff9d00 bold
    - - question
      - bold
    - - answer
      - fg:#ff9d00 bold
    - - pointer
      - fg:#ff9d00 bold
    - - highlighted
      - fg:#ff9d00 bold
    - - selected
      - fg:#cc5454
    - - separator
      - fg:#cc5454
    - - instruction
      - ""
    - - text
      - ""
    - - disabled
      - fg:#858585 italic
  tag_format: v$version
  version: 0.1.1


================================================
FILE: functions/_fifc.fish
================================================
function _fifc
    set -f --export SHELL (command --search fish)
    set -l result
    set -Ux _fifc_extract_regex
    set -gx _fifc_complist_path (string join '' (mktemp) "_fifc")
    set -gx _fifc_custom_fzf_opts
    set -gx fifc_extracted
    set -gx fifc_commandline
    set -gx fifc_token (commandline --current-token)
    set -gx fifc_query "$fifc_token"

    # Get commandline buffer
    if test "$argv" = ""
        set fifc_commandline (commandline --cut-at-cursor)
    else
        set fifc_commandline $argv
    end

    if _fifc_test_version "$FISH_VERSION" -ge "3.4"
        set complete_opts --escape
    end

    complete -C $complete_opts -- "$fifc_commandline" | string split '\n' >$_fifc_complist_path

    set -gx fifc_group (_fifc_completion_group)
    set source_cmd (_fifc_action source)

    set fifc_fzf_query (string trim --chars '\'' -- "$fifc_fzf_query")

    set -l fzf_cmd "
        _fifc_launched_by_fzf=1 SHELL=fish fzf \
            -d \t \
            --exact \
            --tiebreak=length \
            --select-1 \
            --exit-0 \
            --ansi \
            --tabstop=4 \
            --multi \
            --reverse \
            --header '$header' \
            --preview '_fifc_action preview {} {q}' \
            --bind='$fifc_open_keybinding:execute(_fifc_action open {} {q} &> /dev/tty)' \
            --query '$fifc_query' \
            $_fifc_custom_fzf_opts"

    set -l cmd (string join -- " | " $source_cmd $fzf_cmd)
    # We use eval hack because wrapping source command
    # inside a function cause some delay before fzf to show up
    eval $cmd | while read -l token
        # don't escape '~' for path, `$` for environ
        if string match --quiet '~*' -- $token
            set -a result (string join -- "" "~" (string sub --start 2 -- $token | string escape))
        else if string match --quiet '$*' -- $token
            set -a result (string join -- "" "\$" (string sub --start 2 -- $token | string escape))
        else
            set -a result (string escape --no-quoted -- $token)
        end
        # Perform extraction if needed
        if test -n "$_fifc_extract_regex"
            set result[-1] (string match --regex --groups-only -- "$_fifc_extract_regex" "$token")
        end
    end

    # Add space trailing space only if:
    # - there is no trailing space already present
    # - Result is not a directory
    # We need to unescape $result for directory test as we escaped it before
    if test (count $result) -eq 1; and not test -d (string unescape -- $result[1])
        set -l buffer (string split -- "$fifc_commandline" (commandline -b))
        if not string match -- ' *' "$buffer[2]"
            set -a result ''
        end
    end

    if test -n "$result"
        commandline --replace --current-token -- (string join -- ' ' $result)
    end

    commandline --function repaint

    rm $_fifc_complist_path
    # Clean state
    set -e _fifc_extract_regex
    set -e _fifc_custom_fzf_opts
    set -e _fifc_complist_path
    set -e fifc_token
    set -e fifc_group
    set -e fifc_extracted
    set -e fifc_candidate
    set -e fifc_commandline
    set -e fifc_query
end


================================================
FILE: functions/_fifc_action.fish
================================================
function _fifc_action
    # Can be either "preview", "open" or "source"
    set -l action $argv[1]
    set -l comp $_fifc_ordered_comp $_fifc_unordered_comp
    set -l regex_val (string escape --style=regex -- "$argv[2]")
    # Escape '/' for sed processing
    set regex_val (string replace '/' '\/' --all "$regex_val")

    # Variables exposed to evaluated commands
    set -x fifc_desc (sed -nr (printf 's/^%s[[:blank:]]+(.*)/\\\1/p' "$regex_val") $_fifc_complist_path | string trim)
    set -x fifc_candidate "$argv[2]"
    set -x fifc_extracted (string match --regex --groups-only -- "$_fifc_extract_regex" "$argv[2]")

    if test "$action" = preview
        set default_preview 1
        set fifc_query "$argv[3]"

    else if test "$action" = open
        set fifc_query "$argv[3]"

    else if test "$action" = source
        set default_source 1
    end

    for i in (seq (count $comp))
        set -l condition_cmd
        set -l regex_cmd
        set -l valid 1
        if test -n "$$comp[$i][1]"
            set condition_cmd "$$comp[$i][1]"
        else
            set condition_cmd true
        end
        if test -n "$$comp[$i][2]"
            set -l val (string escape -- "$fifc_commandline")
            set regex_cmd "string match --regex --quiet -- '$$comp[$i][2]' $val"
        else
            set regex_cmd true
        end

        if not eval "$condition_cmd; and $regex_cmd"
            set valid 0
            continue
        end

        set _fifc_extract_regex "$$comp[$i][7]"

        if test "$action" = preview; and test -n "$$comp[$i][3]"
            eval $$comp[$i][3]
            set default_preview 0
            break
        else if test "$action" = open; and test -n "$$comp[$i][4]"
            eval $$comp[$i][4]
            break
        else if test "$action" = source; and test -n "$$comp[$i][5]"
            set _fifc_custom_fzf_opts "$$comp[$i][6]"
            if functions "$$comp[$i][5]" 1>/dev/null
                eval $$comp[$i][5]
            else
                echo $$comp[$i][5]
            end
            set default_source 0
            break
        end
    end

    # We are in preview mode, but nothing matched
    # fallback to fish description
    if test "$default_preview" = 1
        echo "$fifc_desc"
    else if test "$default_source" = 1
        echo _fifc_parse_complist
    end
end


================================================
FILE: functions/_fifc_completion_group.fish
================================================
function _fifc_completion_group -d "Determine completion group"
    set -l path_candidate (_fifc_path_to_complete)
    # Null means that either $path is empty or is not a directory
    set -l is_null (ls -A -- $path_candidate 2> /dev/null | string collect)
    set -l complist (string escape -- (_fifc_expand_tilde (_fifc_parse_complist)))
    # Directories
    set -l dir_test "test -d $complist[1]"
    set dir_test (string join -- " -a -d " $dir_test $complist[2..-1])
    if test -n "$is_null"; and eval "$dir_test"
        echo directories
        # Files
        # When complist is big, avoid calling ls with all arguments if first is neither a file nor a directory
    else if test -n "$is_null"; and echo $complist | xargs ls -d -- &>/dev/null
        echo files
        # Options
    else if string match --regex --quiet -- '\h+\-+\h*$' $fifc_commandline
        set -e fifc_query
        echo options
        # PIDs
    else if string join -- '' $complist | string match --regex --quiet '^[0-9]+$'
        echo processes
    end
end


================================================
FILE: functions/_fifc_expand_tilde.fish
================================================
function _fifc_expand_tilde
    string replace --regex -- '^~' "$HOME" $argv
end


================================================
FILE: functions/_fifc_file_type.fish
================================================
function _fifc_file_type -d "Figure out file type (txt, json, image, pdf, archive, binary)"
    set -l mime (file --mime-type -b "$argv")
    set -l binary 0
    if string match --quiet '*binary*' -- (file --mime -b -L "$argv")
        set binary 1
    end

    switch $mime
        case application/{gzip,java-archive,x-{7z-compressed,bzip2,chrome-extension,rar,tar,xar},zip}
            echo archive
            return
        case "image/*"
            echo image
            return
    end

    if test $binary = 1
        echo binary
    else
        switch $mime
            case application/pdf
                echo pdf
            case application/json
                echo json
            case "*"
                echo txt
        end
    end
end


================================================
FILE: functions/_fifc_help.fish
================================================
function __fifc_help_print
    argparse -s "i/indentation=?" "l/level=?" "c/color=?" e/escape n -- $argv
    set -l spaces "$_flag_i"
    set -l level "$_flag_l"
    set -l color "$_flag_c"
    set -l echo_opt

    if test -z "$spaces"
        set spaces 4
    end
    if test -z "$level"
        set level 1
    end
    if test -n "$_flag_e"
        set -a echo_opt -e
    end
    if test -n "$_flag_n"
        set -a echo_opt -n
    end
    if test -z "$_flag_c"
        set color -o white
    end
    set indent (string repeat --count (math $spaces x $level) " ")

    set_color $color
    echo $echo_opt "$indent$argv[1]"
    for line in $argv[2..-1]
        set_color $color
        echo $echo_opt "\n$indent$line"
    end
    # end
    set_color normal
end

function __fifc_help_section
    __fifc_help_print -e -l0 --color=yellow (string join -- "" (string upper -- "$argv") "\n")
end

function __fifc_help_opt
    set -l opt (string split -- '=' $argv[1])
    __fifc_help_print -n -e --color=green -l1 -- "$opt[1]"
    if test (count $opt) -eq 2
        set_color yellow
        echo "=$opt[2]"
    else
        echo ""
    end
    set -l desc (string split -- '\n' $argv[2..-1] | string trim)
    __fifc_help_print -e -l2 -- $desc
    echo ""
end

function _fifc_help -d "Print fifc help message"
    __fifc_help_section NAME
    __fifc_help_print -e "fifc - Set custom completion rules for use with fifc fish plugin\n"

    __fifc_help_section SYNOPSIS
    __fifc_help_print -e "fifc [OPTIONS]\n"

    __fifc_help_section DESCRIPTION

    __fifc_help_print -e -n \
        "The fifc command allows you to add custom completion rules that can enhance fish completions or override them.\n" \
        "A rule is composed of condition(s) that, if valid, trigger commands that can:" \
        "  - Change fzf preview (-p)" \
        "  - Feed fzf input (-s)" \
        "  - Execute when fifc_open_keybinding is pressed (defaults to ctrl-o) (-o)"

    __fifc_help_print -e "\n\n"

    __fifc_help_print -e -n \
        "A condition can be either:" \
        " - A regex that must match commandline before cursor position (-r)" \
        " - An arbitrary command that must exit with a non-zero status (-n)"

    __fifc_help_print -e "\n"

    __fifc_help_print -e -n \
        "Rule are evaluated in the order in which they are defined," \
        "and fifc will stop at the first rule where all conditions are met"

    __fifc_help_print -e "\n\n"

    __fifc_help_opt \
        "-r, --regex=REGEX" \
        "Regex that must match commandline preceding the cursor for the rule to be valid"

    __fifc_help_opt \
        "-e, --extract=COMMAND" \
        "Regex used to extract string from selected results before appending them to the commandline"

    __fifc_help_opt \
        "-n, --condition=COMMAND" \
        "Command or function that must exit with a non-zero status for the rule to be valid"

    __fifc_help_opt \
        "-p, --preview=COMMAND" \
        "Preview command passed to fzf if the rule is valid"

    __fifc_help_opt \
        "-s, --source=COMMAND" \
        "Command that will feed fzf input if the rule is valid"

    __fifc_help_opt \
        "-o, --open=COMMAND" \
        "Command binded to fifc_open_keybinding (defaults to ctrl-o) when using fzf"

    __fifc_help_opt \
        "-O, --order=INT" \
        "The order in which the rule is evaluated." \
        "If missing, the rule will be evaluated after all ordered ones, and all unordered rules defined before."

    __fifc_help_opt \
        "-f, --fzf-options" \
        "Custom fzf options (can override previous ones)"

    __fifc_help_opt \
        "-h, --help" \
        "Show this help"

    __fifc_help_print -e "Examples:\n"

    __fifc_help_print -e -l2 -- "- Preview files using bat (already builtin):\n"
    __fifc_help_print -e -l2 --color=white -- \
        '  fifc -n \'test -f "$fifc_candidate"\' -p "bat --color=always $fifc_candidate"'

    __fifc_help_print -e "\n"

    __fifc_help_print -e -l2 -- "- Use fd to search files recursively (already builtin):\n"
    __fifc_help_print -e -l2 --color=white -- \
        '  fifc -n \'test "$fifc_group" = files\' -s \'fd . --color=always --strip-cwd-prefix\''

    __fifc_help_print -e "\n"

    __fifc_help_print -e -l2 -- "- Interactively search packages on archlinux:\n"
    __fifc_help_print -e -n -l2 --color=white -- \
        " fifc \\" \
        " -r '^pacman(\h*\-S)?\h+\w+' \\" \
        " -s 'pacman --color=always -Ss "\$fifc_token" | string match -r \"^[^\h+].*\"' \\" \
        " -e '.*/(.*?)\h.*' \\" \
        " -f '--query \"\"' \\" \
        " -p 'pacman -Si "\$fifc_extracted"' \\ \n"
end


================================================
FILE: functions/_fifc_open_cmd.fish
================================================
function _fifc_open_cmd
    _fifc_preview_cmd $fifc_candidate
end


================================================
FILE: functions/_fifc_open_dir.fish
================================================
function _fifc_open_dir
    if type -q broot
        broot --color=yes $fifc_broot_opts $fifc_candidate
    end
end


================================================
FILE: functions/_fifc_open_file.fish
================================================
function _fifc_open_file -d "Open a file with the right tool depending on its type"
    set -l filepath "$fifc_candidate"

    if test -n "$argv"
        set filepath "$argv"
    end

    set -q fifc_editor || set -l fifc_editor "$EDITOR"

    set -l file_type (_fifc_file_type "$filepath")

    switch $file_type
        case txt json archive
            $fifc_editor "$filepath"
        case image
            if type -q chafa
                chafa --watch $fifc_chafa_opts "$filepath"
            else
                $fifc_editor "$filepath"
            end
        case binary
            if type -q hexyl
                hexyl $fifc_hexyl_opts "$filepath" | less --RAW-CONTROL-CHARS
            else
                $fifc_editor "$filepath"
            end
    end
end


================================================
FILE: functions/_fifc_open_fn.fish
================================================
function _fifc_open_fn -d "Open a function definition using open file wrapper"
    set -l pathname (functions --details $fifc_candidate 2>/dev/null)
    if test -f $pathname
        _fifc_open_file $pathname
    end
end


================================================
FILE: functions/_fifc_open_opt.fish
================================================
function _fifc_open_opt -d "Open a man page starting at the selected option"
    set -l cmd (string match --regex --groups-only -- '(^|\h+)(\w+) ?-*$' "$fifc_commandline")
    set -l opt (string trim --chars '\n ' -- "$fifc_candidate")
    set -l regex "^\h*(-+[^\n]*)*$opt"

    if type -q bat
        man $cmd \
            | bat --color=always --language man $fifc_bat_opts \
            # --RAW-CONTROL-CHARS allow color output of bat to be displayed
            | less --RAW-CONTROL-CHARS --pattern "$regex"
    else
        man $cmd | less --pattern "$regex"
    end
end


================================================
FILE: functions/_fifc_open_process.fish
================================================
function _fifc_open_process -d "Open the tree view of the selected process (procs only)"
    set -l pid (_fifc_parse_pid "$fifc_candidate")

    if type -q procs
        procs --color=always --tree --pager=always $fifc_procs_opts "$pid"
    end
end


================================================
FILE: functions/_fifc_parse_complist.fish
================================================
function _fifc_parse_complist -d "Extract the first column of fish completion list"
    cat $_fifc_complist_path \
        | string unescape \
        | uniq \
        | awk -F '\t' '{ print $1 }'
end


================================================
FILE: functions/_fifc_parse_pid.fish
================================================
function _fifc_parse_pid -d "Extract pid at the beginning of ps output lines"
    string match --regex --groups-only -- "^\h*([0-9]+)" "$argv"
end


================================================
FILE: functions/_fifc_path_to_complete.fish
================================================
function _fifc_path_to_complete
    set -l token (string unescape -- $fifc_token)
    if string match --regex --quiet -- '.*(\w|\.|/)+$' "$token"
        _fifc_expand_tilde "$token"
    else
        echo {$PWD}/
    end
end


================================================
FILE: functions/_fifc_preview_cmd.fish
================================================
function _fifc_preview_cmd -d "Open man page of the selected command"
    if type -q bat
        man $fifc_candidate 2>/dev/null | bat --color=always --language man $fifc_bat_opts
    else
        man $fifc_candidate 2>/dev/null
    end
end


================================================
FILE: functions/_fifc_preview_dir.fish
================================================
function _fifc_preview_dir -d "List content of the selected directory"
    if type -q exa
        exa --color=always $fifc_exa_opts $fifc_candidate
    else
        ls --color=always $fifc_ls_opts $fifc_candidate
    end
end


================================================
FILE: functions/_fifc_preview_file.fish
================================================
function _fifc_preview_file -d "Preview the selected file with the right tool depending on its type"
    set -l file_type (_fifc_file_type "$fifc_candidate")

    switch $file_type
        case txt
            if type -q bat
                bat --color=always $fifc_bat_opts "$fifc_candidate"
            else
                cat "$fifc_candidate"
            end
        case json
            if type -q bat
                bat --color=always -l json $fifc_bat_opts "$fifc_candidate"
            else
                cat "$fifc_candidate"
            end
        case image pdf
            if type -q chafa
                chafa $fifc_chafa_opts "$fifc_candidate"
            else
                _fifc_preview_file_default "$fifc_candidate"
            end
        case archive
            if type -q 7z
                7z l ""$fifc_candidate"" | tail -n +17 | awk '{ print $6 }'
            else
                _fifc_preview_file_default "$fifc_candidate"
            end
        case binary
            if type -q hexyl
                hexyl $fifc_hexyl_opts "$fifc_candidate"
            else
                _fifc_preview_file_default "$fifc_candidate"
            end

    end
end


================================================
FILE: functions/_fifc_preview_file_default.fish
================================================
function _fifc_preview_file_default -d "Display informations about the selected file"
    set -l mime (file --mime-type -b "$argv")
    set_color brgreen
    echo -e "$mime[1]\n"
    set_color --bold white
    file -b "$argv"
    set_color normal
end


================================================
FILE: functions/_fifc_preview_fn.fish
================================================
function _fifc_preview_fn -d "Preview the function definition"
    if type -q bat
        type $fifc_candidate | bat --color=always --language fish $fifc_bat_opts
    else
        type $fifc_candidate
    end
end


================================================
FILE: functions/_fifc_preview_opt.fish
================================================
function _fifc_preview_opt -d "Open man page of a command starting at the selected option"
    set -l regex "(?s)^(\-+[^\n]+)*$fifc_candidate([^\-\w\.]([^\.\n]|\.{2,}|\w+\.)*|)\n{1,2}.*?(^(\-+[^\n]+|\w+))"
    set -l regex_replace '^\h+(\-+[^\n]+.*)'
    set -l cmd (string match --regex --groups-only -- '(^|\h+)(\w+) ?-*$' $fifc_commandline)
    echo $group
    set out (man $cmd 2>/dev/null | string replace -r $regex_replace '$1' \
        | begin
            if type -q rg
                rg --multiline $regex
            else if type -q pcre2grep
                pcre2grep --multiline $regex
            else
                pcregrep --multiline $regex
            end
        end \
        # Remove last line as it should describes the next option
        | awk 'n>=1 { print a[n%1] } { a[n%1]=$0; n=n+1 }' \
        | string trim \
    )

    # Fallback to fish description if there is no man page
    if test -z "$out"
        echo "$fifc_desc"
    end

    # Pretty printing
    set_color brgreen
    echo -e "$out[1]"
    set_color --bold white
    echo -e (string join -- "\n" "" $out[2..-1])
    set_color normal
end


================================================
FILE: functions/_fifc_preview_process.fish
================================================
function _fifc_preview_process -d "Preview process informations"
    set -l pid (_fifc_parse_pid "$fifc_candidate")
    set -l err_msg "\nThe process exited"

    if type -q procs
        procs --color=always --tree $fifc_procs_opts "$pid"
    else
        set -l ps_preview_fmt (string join ',' 'pid' 'ppid=PARENT' 'user' '%cpu' 'rss=RSS_IN_KB' 'start=START_TIME' 'command')
        ps -o "$ps_preview_fmt" -p "$pid" 2>/dev/null
    end
    if not ps -p "$pid" &>/dev/null
        set_color yellow
        echo -e "$err_msg"
    end
end


================================================
FILE: functions/_fifc_source_directories.fish
================================================
function _fifc_source_directories -d "Return a command to recursively find directories"
    if type -q fd
        set --local --export fifc_fd_opts -t d
        _fifc_source_files
    else
        set --local --export fifc_find_opts -type d
        _fifc_source_files
    end
end


================================================
FILE: functions/_fifc_source_files.fish
================================================
function _fifc_source_files -d "Return a command to recursively find files"
    set -l path (_fifc_path_to_complete | string escape)
    set -l hidden (string match "*." "$path")

    if string match --quiet -- '~*' "$fifc_query"
        set -e fifc_query
    end

    if type -q fd
        if _fifc_test_version (fd --version) -ge "8.3.0"
            set fd_custom_opts --strip-cwd-prefix
        end

        if test "$path" = {$PWD}/
            echo "fd . $fifc_fd_opts --color=always $fd_custom_opts"
        else if test "$path" = "."
            echo "fd . $fifc_fd_opts --color=always --hidden $fd_custom_opts"
        else if test -n "$hidden"
            echo "fd . $fifc_fd_opts --color=always --hidden -- $path"
        else
            echo "fd . $fifc_fd_opts --color=always -- $path"
        end
    else if test -n "$hidden"
        # Use sed to strip cwd prefix
        echo "find . $path $fifc_find_opts ! -path . -print 2>/dev/null | sed 's|^\./||'"
    else
        # Exclude hidden directories
        echo "find . $path $fifc_find_opts ! -path . ! -path '*/.*' -print 2>/dev/null | sed 's|^\./||'"
    end
end


================================================
FILE: functions/_fifc_test_version.fish
================================================
function _fifc_test_version -d "Compare version numbers"
    set -l arg_1 (string replace --regex --all '[^\d]' '' -- "$argv[1]")
    set -l arg_2 (string replace --regex --all '[^\d]' '' -- "$argv[3]")
    set -l op "$argv[2]"

    set -l v_diff (math (string length -- $arg_1) - (string length -- $arg_2))

    # Ensure both versions are the same length
    if test $v_diff -gt 0
        set arg_2 (string join '' -- "$arg_2" (string repeat -N -n $v_diff '0'))
    else if test $v_diff -lt 0
        set v_diff (math abs $v_diff)
        set arg_1 (string join '' -- "$arg_1" (string repeat -N -n $v_diff '0'))
    end

    set -l cmd (string collect -- "test " "$arg_1" " $op " "$arg_2")
    eval $cmd
end


================================================
FILE: functions/fifc.fish
================================================
function __fifc_check_flag -d "Check flag value for fifc"
    switch $_flag_name
        case O order
            if not test 0 -lt $_flag_value
                echo "$_argparse_cmd: Order must be a positive integer"
                return 1
            end
            # Ensure regex is valid
        case r regex
            set -l out (string match --regex --quiet $_flag_value 2>&1 | string join '\n')
            if test -n "$out"
                echo -e "$_argparse_cmd:\n$out"
            end
    end
end

function fifc -d "Add your own fish fzf completions"
    set -l option_spec 'n/condition=' 'p/preview=' 'o/open=' 's/source=' 'e/extract=' 'f/fzf-options=' h/help
    set -a option_spec 'r/regex=!__fifc_check_flag' 'O/order=!__fifc_check_flag'

    argparse --name fifc $option_spec -- $argv

    if test "$status" != 0
        return 1
    end

    if test -n "$_flag_h"
        _fifc_help
        return
    end

    if test \( -n "$_flag_n" -o -n "$_flag_r" \) \
            -a \( -z "$_flag_p" -a -z "$_flag_o" -a -z "$_flag_s" -a -z "$_flag_e" -a -z "$_flag_f" \)

        echo "fifc: You have not specified any binding (preview, open, source or extract)"
        return 1
    end

    set _fifc_comp_count (math $_fifc_comp_count + 1)
    set -l count $_fifc_comp_count
    # Ensure completion vars are empty before setting them
    set -e "_fifc_comp_$count"
    set -gx "_fifc_comp_$count"
    set -a "_fifc_comp_$count" "$_flag_n"
    set -a "_fifc_comp_$count" "$_flag_r"
    set -a "_fifc_comp_$count" "$_flag_p"
    set -a "_fifc_comp_$count" "$_flag_o"
    set -a "_fifc_comp_$count" "$_flag_s"
    set -a "_fifc_comp_$count" "$_flag_f"
    set -a "_fifc_comp_$count" "$_flag_e"

    if test -z "$_flag_O"
        set -a _fifc_unordered_comp "_fifc_comp_$count"
    else
        set _fifc_ordered_comp[$_flag_O] "_fifc_comp_$count"
    end
end


================================================
FILE: tests/_resources/dir with spaces/file 1.txt
================================================
foo 1


================================================
FILE: tests/_resources/dir with spaces/file 2.txt
================================================
foo 2


================================================
FILE: tests/_resources/dir with spaces/file.json
================================================
{}


================================================
FILE: tests/_resources/target.txt
================================================
foo


================================================
FILE: tests/test_exposed_vars.fish
================================================
set curr_fifc_unordered_comp $_fifc_unordered_comp
set dir "tests/_resources/dir with spaces"
set _fifc_complist_path (mktemp)

function _fifc_test_exposed_vars
    switch $var
        case candidate
            echo -n "$fifc_candidate"
        case extracted
            echo -n "$fifc_extracted"
        case query
            echo -n "$fifc_query"
    end
end


set comp_1 \
    'test -f $fifc_candidate' \
    '.*' \
    _fifc_test_exposed_vars \
    open_cmd \
    source_cmd \
    --fzf_option \
    '.*/(.*\.txt)$'

set _fifc_unordered_comp comp_1

set var candidate
set actual (_fifc_action "preview" "$dir/file 1.txt")
@test "exposed vars fifc_candidate" "$actual" = "$dir/file 1.txt"

set var extracted
set -x fifc_extracted
set _fifc_extract_regex '.*/(.*\.txt)$'
set actual (_fifc_action "preview" "$dir/file 1.txt")
@test "exposed vars fifc_extracted" "$actual" = "file 1.txt"

set var query
set -x fifc_query
set actual (_fifc_action "preview" "$dir/file 1.txt" "1")
@test "exposed vars fifc_query" "$actual" = 1

rm $_fifc_complist_path


================================================
FILE: tests/test_fifc.fish
================================================
set curr_fifc_unordered_comp $_fifc_unordered_comp
set _fifc_unordered_comp

fifc \
    -n 'test -n "$fifc_desc"' \
    -r '^functions\h+|^\h+' \
    -p _fifc_preview_fn \
    -o _fifc_open_fn

@test "fifc command completion added" (count $_fifc_unordered_comp) = 1
@test "fifc command completion condition" "$$_fifc_unordered_comp[1][1]" = 'test -n "$fifc_desc"'
@test "fifc command completion regex" "$$_fifc_unordered_comp[1][2]" = '^functions\h+|^\h+'
@test "fifc command completion preview" "$$_fifc_unordered_comp[1][3]" = _fifc_preview_fn
@test "fifc command completion open" "$$_fifc_unordered_comp[1][4]" = _fifc_open_fn

# set _fifc_unordered_comp
fifc \
    -n 'test -n "$fifc_desc"' \
    -r '^functions\h+|^\h+' \
    -s source_cmd

@test "fifc source added" (count $_fifc_unordered_comp) = 2
@test "fifc source condition" "$$_fifc_unordered_comp[2][1]" = 'test -n "$fifc_desc"'
@test "fifc source regex" "$$_fifc_unordered_comp[2][2]" = '^functions\h+|^\h+'
@test "fifc source command" "$$_fifc_unordered_comp[2][5]" = source_cmd

set -gx _fifc_unordered_comp $curr_fifc_unordered_comp


================================================
FILE: tests/test_file_type.fish
================================================
set actual (_fifc_file_type "tests/_resources/dir with spaces/file 71.txt")
@test "file type test txt" "$actual" = txt

set actual (_fifc_file_type "tests/_resources/dir with spaces/file.json")
@test "file type test json" "$actual" = json -o "$actual" = txt

set actual (_fifc_file_type "tests/_resources/dir with spaces/fish.png")
@test "file type test image" "$actual" = image

set actual (_fifc_file_type "tests/_resources/dir with spaces/file.bin")
@test "file type test binary" "$actual" = binary

set actual (_fifc_file_type "tests/_resources/dir with spaces/file.7z")
@test "file type test archive" "$actual" = archive

set actual (_fifc_file_type "tests/_resources/dir with spaces/file.pdf")
@test "file type test pdf" "$actual" = pdf

set actual_target (_fifc_file_type "tests/_resources/target.txt")
@test "file type test link target" "$actual_target" = txt

set actual_link (_fifc_file_type "tests/_resources/dir with spaces/symlink.txt")
@test "file type test link source" "$actual_link" = "$actual_target"


================================================
FILE: tests/test_group.fish
================================================
set _fifc_complist_path (mktemp)

set _commandline "kill "
complete -C --escape -- "$_commandline" >$_fifc_complist_path
set fifc_commandline "$_commandline"
set actual (_fifc_completion_group)
@test "group test pid" "$actual" = processes

set _commandline "ls tests/_resources/dir\ with\ spaces/"
complete -C --escape -- "$_commandline" >$_fifc_complist_path
set fifc_commandline "$_commandline"
set actual (_fifc_completion_group)
@test "group test files" "$actual" = files

set _commandline "ls -"
complete -C --escape -- "$_commandline" >$_fifc_complist_path
set fifc_commandline "$_commandline"
set actual (_fifc_completion_group)
@test "group test options" "$actual" = options

set -e _fifc_complist
set -e fifc_commandline
rm $_fifc_complist_path


================================================
FILE: tests/test_match_order.fish
================================================
set curr_fifc_unordered_comp $_fifc_unordered_comp
set curr_fifc_ordered_comp $_fifc_ordered_comp
set dir "tests/_resources/dir with spaces"
set _fifc_complist_path (mktemp)

# Add unordered completions
set comp_1 \
    'test -f $fifc_candidate' \
    '^cat $' \
    'echo comp_1' \
    open_cmd \
    source_cmd \
    --fzf_option \
    extract_regex

set comp_2 \
    'test -d $fifc_candidate' \
    '^ls $' \
    'echo comp_2' \
    open_cmd \
    source_cmd \
    --fzf_option \
    extract_regex

set _fifc_unordered_comp comp_1 comp_2

set fifc_commandline "cat "
set actual (_fifc_action "preview" "$dir/file 1.txt")
@test "preview match condition and regex first completion" "$actual" = comp_1

set fifc_commandline "ls "
set actual (_fifc_action "preview" "$dir")
@test "preview match condition and regex second completion" "$actual" = comp_2

echo "fallback    description" >$_fifc_complist_path
set fifc_commandline "fallback "
set actual (_fifc_action "preview" 'fallback')
@test "preview fallback fish description" "$actual" = description

# Add ordered completion, should be evaluated before unordered ones
set o_comp_1 \
    'test -f $fifc_candidate' \
    '^cat $' \
    'echo o_comp_1' \
    open_cmd \
    source_cmd_1 \
    --fzf_option_1 \
    extract_regex_1

set _fifc_ordered_comp o_comp_1
set fifc_commandline "cat "
set actual (_fifc_action "preview" "$dir/file 1.txt")
@test "preview match condition and regex ordered completion" "$actual" = o_comp_1

set -e fifc_commandline
set -gx _fifc_unordered_comp $curr_fifc_unordered_comp
set -gx _fifc_ordered_comp $curr_fifc_ordered_comp
rm $_fifc_complist_path


================================================
FILE: tests/test_open_cmd.fish
================================================
set fifc_candidate mkdir
set fifc_bat_opts '--color=never'

set actual (_fifc_open_cmd)
set expected (man mkdir)
@test "builtin cmd open" "$actual" = "$expected"


================================================
FILE: tests/test_open_file.fish
================================================
set dir "tests/_resources/dir with spaces"
set curr_fifc_editor $fifc_editor
set fifc_editor cat
set fifc_candidate "$dir/file 1.txt"

set actual (_fifc_open_file)
@test "builtin file open" "$actual" = 'foo 1'

set fifc_editor $curr_fifc_editor


================================================
FILE: tests/test_preview_file.fish
================================================
set dir "tests/_resources/dir with spaces"
set fifc_candidate "$dir/file 1.txt"
set fifc_bat_opts '--color=never'

set actual (_fifc_preview_file)
@test "builtin file preview" "$actual" = 'foo 1'


================================================
FILE: tests/test_source.fish
================================================
set curr_fifc_unordered_comp $_fifc_unordered_comp
set curr_fifc_ordered_comp $_fifc_ordered_comp
set _fifc_complist_path (mktemp)

# Add unordered sources
set comp_1 'test "$any" = "1"' '^kill $' '' '' 'echo comp_1'
set comp_2 'test "$any" = "2"' '^ps -p $' '' '' 'echo comp_2'
set _fifc_unordered_comp comp_1 comp_2

set fifc_commandline "kill "
set any 1
set actual (_fifc_action "source")
@test "source match first" "$actual" = "echo comp_1"

set fifc_commandline "ps -p "
set any 2
set actual (_fifc_action "source")
@test "source match second" "$actual" = "echo comp_2"

set fifc_commandline "foo "
set actual (_fifc_action "source")
@test "source fallback fish suggestions" "$actual" = _fifc_parse_complist

set -e fifc_commandline
set -gx _fifc_unordered_comp $curr_fifc_unordered_comp
set -gx _fifc_unordered_comp $curr_fifc_ordered_comp
rm $_fifc_complist_path


================================================
FILE: tests/version_test.fish
================================================
set -l actual (_fifc_test_version "3.4" -gt "3.0")
@test "version test basic gt" $status = 0

set -l actual (_fifc_test_version "3.4" -ge "3.4")
@test "version test basic ge equal" $status = 0

set -l actual (_fifc_test_version "3.5" -ge "3.4")
@test "version test basic ge greater" $status = 0

set -l actual (_fifc_test_version "3.4" -lt "3.5")
@test "version test basic lt" $status = 0

set -l actual (_fifc_test_version "3.4" -le "3.4")
@test "version test basic le equal" $status = 0

set -l actual (_fifc_test_version "3.4" -le "3.5")
@test "version test basic le lower" $status = 0

set -l actual (_fifc_test_version "3.4" -gt "3")
@test "version test length not equal" $status = 0

set -l actual (_fifc_test_version "3.4" -gt "3")
@test "version test length not equal 1" $status = 0

set -l actual (_fifc_test_version "3" -gt "3.4")
@test "version test length not equal 2" $status = 1

set -l actual (_fifc_test_version "fish 3.5.0" -gt "3.4.2")
@test "version test extract version left" $status = 0

set -l actual (_fifc_test_version "3.5.0" -gt "fish 3.4.2")
@test "version test extract version right" $status = 0
Download .txt
gitextract__9qpmax8/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       └── ci.yml
├── .pre-commit-config.yaml
├── CHANGELOG.md
├── LICENSE
├── README.md
├── completions/
│   └── fifc.fish
├── conf.d/
│   └── fifc.fish
├── cz.yaml
├── functions/
│   ├── _fifc.fish
│   ├── _fifc_action.fish
│   ├── _fifc_completion_group.fish
│   ├── _fifc_expand_tilde.fish
│   ├── _fifc_file_type.fish
│   ├── _fifc_help.fish
│   ├── _fifc_open_cmd.fish
│   ├── _fifc_open_dir.fish
│   ├── _fifc_open_file.fish
│   ├── _fifc_open_fn.fish
│   ├── _fifc_open_opt.fish
│   ├── _fifc_open_process.fish
│   ├── _fifc_parse_complist.fish
│   ├── _fifc_parse_pid.fish
│   ├── _fifc_path_to_complete.fish
│   ├── _fifc_preview_cmd.fish
│   ├── _fifc_preview_dir.fish
│   ├── _fifc_preview_file.fish
│   ├── _fifc_preview_file_default.fish
│   ├── _fifc_preview_fn.fish
│   ├── _fifc_preview_opt.fish
│   ├── _fifc_preview_process.fish
│   ├── _fifc_source_directories.fish
│   ├── _fifc_source_files.fish
│   ├── _fifc_test_version.fish
│   └── fifc.fish
└── tests/
    ├── _resources/
    │   ├── dir with spaces/
    │   │   ├── file 1.txt
    │   │   ├── file 2.txt
    │   │   └── file.json
    │   └── target.txt
    ├── test_exposed_vars.fish
    ├── test_fifc.fish
    ├── test_file_type.fish
    ├── test_group.fish
    ├── test_match_order.fish
    ├── test_open_cmd.fish
    ├── test_open_file.fish
    ├── test_preview_file.fish
    ├── test_source.fish
    └── version_test.fish
Condensed preview — 50 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (53K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 578,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"\"\nlabels: bug\nassignees: Gazorby\n---\n\n**Describe "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 603,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"\"\nlabels: enhancement\nassignees: \"\"\n---\n\n**Is "
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 1609,
    "preview": "name: CI\n\non:\n  push:\n    branches: [main]\n  pull_request:\n\n  # Allows you to run this workflow manually from the Action"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 577,
    "preview": "repos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v5.0.0\n    hooks:\n      - id: check-toml\n      "
  },
  {
    "path": "CHANGELOG.md",
    "chars": 221,
    "preview": "## v0.1.1 (2023-03-05)\n\n### Fix\n\n- **directories**: escape name with spaces instead of quoting them\n\n### Perf\n\n- improve"
  },
  {
    "path": "LICENSE",
    "chars": 1068,
    "preview": "MIT License\n\nCopyright (c) 2022 Matthieu MN\n\nPermission is hereby granted, free of charge, to any person obtaining a cop"
  },
  {
    "path": "README.md",
    "chars": 8781,
    "preview": "<div align=\"center\">\n\n# fifc 🐠\n\n_fish fzf completions_\n\n[![CI](https://github.com/gazorby/fifc/actions/workflows/ci.yml/"
  },
  {
    "path": "completions/fifc.fish",
    "chars": 775,
    "preview": "complete fifc --long condition --short -n --description \"Command or fish function to be evaluated\"\ncomplete fifc --long "
  },
  {
    "path": "conf.d/fifc.fish",
    "chars": 1806,
    "preview": "# Private\nset -gx _fifc_comp_count 0\nset -gx _fifc_unordered_comp\nset -gx _fifc_ordered_comp\n\nif status is-interactive\n "
  },
  {
    "path": "cz.yaml",
    "chars": 512,
    "preview": "---\ncommitizen:\n  annotated_tag: true\n  bump_message: v$new_version\n  name: cz_conventional_commits\n  style:\n    - - qma"
  },
  {
    "path": "functions/_fifc.fish",
    "chars": 3173,
    "preview": "function _fifc\n    set -f --export SHELL (command --search fish)\n    set -l result\n    set -Ux _fifc_extract_regex\n    s"
  },
  {
    "path": "functions/_fifc_action.fish",
    "chars": 2357,
    "preview": "function _fifc_action\n    # Can be either \"preview\", \"open\" or \"source\"\n    set -l action $argv[1]\n    set -l comp $_fif"
  },
  {
    "path": "functions/_fifc_completion_group.fish",
    "chars": 1043,
    "preview": "function _fifc_completion_group -d \"Determine completion group\"\n    set -l path_candidate (_fifc_path_to_complete)\n    #"
  },
  {
    "path": "functions/_fifc_expand_tilde.fish",
    "chars": 81,
    "preview": "function _fifc_expand_tilde\n    string replace --regex -- '^~' \"$HOME\" $argv\nend\n"
  },
  {
    "path": "functions/_fifc_file_type.fish",
    "chars": 757,
    "preview": "function _fifc_file_type -d \"Figure out file type (txt, json, image, pdf, archive, binary)\"\n    set -l mime (file --mime"
  },
  {
    "path": "functions/_fifc_help.fish",
    "chars": 4660,
    "preview": "function __fifc_help_print\n    argparse -s \"i/indentation=?\" \"l/level=?\" \"c/color=?\" e/escape n -- $argv\n    set -l spac"
  },
  {
    "path": "functions/_fifc_open_cmd.fish",
    "chars": 66,
    "preview": "function _fifc_open_cmd\n    _fifc_preview_cmd $fifc_candidate\nend\n"
  },
  {
    "path": "functions/_fifc_open_dir.fish",
    "chars": 116,
    "preview": "function _fifc_open_dir\n    if type -q broot\n        broot --color=yes $fifc_broot_opts $fifc_candidate\n    end\nend\n"
  },
  {
    "path": "functions/_fifc_open_file.fish",
    "chars": 775,
    "preview": "function _fifc_open_file -d \"Open a file with the right tool depending on its type\"\n    set -l filepath \"$fifc_candidate"
  },
  {
    "path": "functions/_fifc_open_fn.fish",
    "chars": 220,
    "preview": "function _fifc_open_fn -d \"Open a function definition using open file wrapper\"\n    set -l pathname (functions --details "
  },
  {
    "path": "functions/_fifc_open_opt.fish",
    "chars": 577,
    "preview": "function _fifc_open_opt -d \"Open a man page starting at the selected option\"\n    set -l cmd (string match --regex --grou"
  },
  {
    "path": "functions/_fifc_open_process.fish",
    "chars": 249,
    "preview": "function _fifc_open_process -d \"Open the tree view of the selected process (procs only)\"\n    set -l pid (_fifc_parse_pid"
  },
  {
    "path": "functions/_fifc_parse_complist.fish",
    "chars": 201,
    "preview": "function _fifc_parse_complist -d \"Extract the first column of fish completion list\"\n    cat $_fifc_complist_path \\\n     "
  },
  {
    "path": "functions/_fifc_parse_pid.fish",
    "chars": 147,
    "preview": "function _fifc_parse_pid -d \"Extract pid at the beginning of ps output lines\"\n    string match --regex --groups-only -- "
  },
  {
    "path": "functions/_fifc_path_to_complete.fish",
    "chars": 224,
    "preview": "function _fifc_path_to_complete\n    set -l token (string unescape -- $fifc_token)\n    if string match --regex --quiet --"
  },
  {
    "path": "functions/_fifc_preview_cmd.fish",
    "chars": 241,
    "preview": "function _fifc_preview_cmd -d \"Open man page of the selected command\"\n    if type -q bat\n        man $fifc_candidate 2>/"
  },
  {
    "path": "functions/_fifc_preview_dir.fish",
    "chars": 225,
    "preview": "function _fifc_preview_dir -d \"List content of the selected directory\"\n    if type -q exa\n        exa --color=always $fi"
  },
  {
    "path": "functions/_fifc_preview_file.fish",
    "chars": 1189,
    "preview": "function _fifc_preview_file -d \"Preview the selected file with the right tool depending on its type\"\n    set -l file_typ"
  },
  {
    "path": "functions/_fifc_preview_file_default.fish",
    "chars": 251,
    "preview": "function _fifc_preview_file_default -d \"Display informations about the selected file\"\n    set -l mime (file --mime-type "
  },
  {
    "path": "functions/_fifc_preview_fn.fish",
    "chars": 213,
    "preview": "function _fifc_preview_fn -d \"Preview the function definition\"\n    if type -q bat\n        type $fifc_candidate | bat --c"
  },
  {
    "path": "functions/_fifc_preview_opt.fish",
    "chars": 1131,
    "preview": "function _fifc_preview_opt -d \"Open man page of a command starting at the selected option\"\n    set -l regex \"(?s)^(\\-+[^"
  },
  {
    "path": "functions/_fifc_preview_process.fish",
    "chars": 538,
    "preview": "function _fifc_preview_process -d \"Preview process informations\"\n    set -l pid (_fifc_parse_pid \"$fifc_candidate\")\n    "
  },
  {
    "path": "functions/_fifc_source_directories.fish",
    "chars": 280,
    "preview": "function _fifc_source_directories -d \"Return a command to recursively find directories\"\n    if type -q fd\n        set --"
  },
  {
    "path": "functions/_fifc_source_files.fish",
    "chars": 1132,
    "preview": "function _fifc_source_files -d \"Return a command to recursively find files\"\n    set -l path (_fifc_path_to_complete | st"
  },
  {
    "path": "functions/_fifc_test_version.fish",
    "chars": 709,
    "preview": "function _fifc_test_version -d \"Compare version numbers\"\n    set -l arg_1 (string replace --regex --all '[^\\d]' '' -- \"$"
  },
  {
    "path": "functions/fifc.fish",
    "chars": 1870,
    "preview": "function __fifc_check_flag -d \"Check flag value for fifc\"\n    switch $_flag_name\n        case O order\n            if not"
  },
  {
    "path": "tests/_resources/dir with spaces/file 1.txt",
    "chars": 6,
    "preview": "foo 1\n"
  },
  {
    "path": "tests/_resources/dir with spaces/file 2.txt",
    "chars": 6,
    "preview": "foo 2\n"
  },
  {
    "path": "tests/_resources/dir with spaces/file.json",
    "chars": 3,
    "preview": "{}\n"
  },
  {
    "path": "tests/_resources/target.txt",
    "chars": 4,
    "preview": "foo\n"
  },
  {
    "path": "tests/test_exposed_vars.fish",
    "chars": 1053,
    "preview": "set curr_fifc_unordered_comp $_fifc_unordered_comp\nset dir \"tests/_resources/dir with spaces\"\nset _fifc_complist_path (m"
  },
  {
    "path": "tests/test_fifc.fish",
    "chars": 1100,
    "preview": "set curr_fifc_unordered_comp $_fifc_unordered_comp\nset _fifc_unordered_comp\n\nfifc \\\n    -n 'test -n \"$fifc_desc\"' \\\n    "
  },
  {
    "path": "tests/test_file_type.fish",
    "chars": 1019,
    "preview": "set actual (_fifc_file_type \"tests/_resources/dir with spaces/file 71.txt\")\n@test \"file type test txt\" \"$actual\" = txt\n\n"
  },
  {
    "path": "tests/test_group.fish",
    "chars": 754,
    "preview": "set _fifc_complist_path (mktemp)\n\nset _commandline \"kill \"\ncomplete -C --escape -- \"$_commandline\" >$_fifc_complist_path"
  },
  {
    "path": "tests/test_match_order.fish",
    "chars": 1632,
    "preview": "set curr_fifc_unordered_comp $_fifc_unordered_comp\nset curr_fifc_ordered_comp $_fifc_ordered_comp\nset dir \"tests/_resour"
  },
  {
    "path": "tests/test_open_cmd.fish",
    "chars": 162,
    "preview": "set fifc_candidate mkdir\nset fifc_bat_opts '--color=never'\n\nset actual (_fifc_open_cmd)\nset expected (man mkdir)\n@test \""
  },
  {
    "path": "tests/test_open_file.fish",
    "chars": 245,
    "preview": "set dir \"tests/_resources/dir with spaces\"\nset curr_fifc_editor $fifc_editor\nset fifc_editor cat\nset fifc_candidate \"$di"
  },
  {
    "path": "tests/test_preview_file.fish",
    "chars": 196,
    "preview": "set dir \"tests/_resources/dir with spaces\"\nset fifc_candidate \"$dir/file 1.txt\"\nset fifc_bat_opts '--color=never'\n\nset a"
  },
  {
    "path": "tests/test_source.fish",
    "chars": 871,
    "preview": "set curr_fifc_unordered_comp $_fifc_unordered_comp\nset curr_fifc_ordered_comp $_fifc_ordered_comp\nset _fifc_complist_pat"
  },
  {
    "path": "tests/version_test.fish",
    "chars": 1124,
    "preview": "set -l actual (_fifc_test_version \"3.4\" -gt \"3.0\")\n@test \"version test basic gt\" $status = 0\n\nset -l actual (_fifc_test_"
  }
]

About this extraction

This page contains the full source code of the gazorby/fifc GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 50 files (46.0 KB), approximately 15.0k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!