Command suggestions, command-not-found and thefuck replacement written in Rust https://codeberg.org/iff/pay-respects
Find a file
2023-07-31 20:09:24 +02:00
rule_parser format: remove extra spaces from error output 2023-07-31 11:03:50 +02:00
rules fix: missing space in git rules 2023-07-31 19:07:21 +02:00
src format: remove additional space at suggestion 2023-07-31 20:09:24 +02:00
.gitignore init 2023-07-30 18:40:18 +02:00
.rustfmt.toml init 2023-07-30 18:40:18 +02:00
Cargo.toml update: README 2023-07-31 19:04:35 +02:00
LICENSE add LICENSE 2023-07-30 20:08:31 +02:00
README.md add: images 2023-07-31 19:49:05 +02:00

Pay Respect

Typed a wrong command? Pay Respect will try to correct your wrong console command simply by pressing F!

example-sudo-echo

example-typo-paru

example-typo-git

How to Pay Respect

The binary is named pay-respect, by adding an alias to your shell configuration:

# Note: You may need to have the binary exposed in your path
alias f="$(pay_respect <your_shell_here>)"

# for example, using `zsh`:
alias f="$(pay_respect zsh)"

You can now press F to Pay Respect!

Currently, only corrections to bash, zsh, and fish are working flawlessly.

nushell has broken aliases, therefore it has following 2 limitations:

  • You have to manually add the output of pay_respect nushell to your configuration as alias
  • Aliased commands cannot be expanded to their original command

Installing

If you are using Arch Linux, you can install from AUR directly:

paru -S pay_respect

Otherwise, you can use cargo to compile the project:

cargo build --release

and the binary can be found at target/release/pay_respect.

Rule Files

Rule files are parsed at compilation. What actually gets compiled is a HashMap that contains patterns and suggestions for a specific command.

Syntax of a rule file (placed under rules):

# this field should be the name of the command
command = "world"

# you can add as many `[[match_err]]` section as you want
[[match_err]]
# the suggestion of this section will be used for the following patterns of the error output
# note that the error is formatted to lowercase without extra spaces
pattern = [
	"pattern 1",
	"pattern 2",
]
# this will change the first argument to `fix`, while keeping the rest intact
suggest = "{{command[0]}} fix {{command[2:]}}"

[[match_err]]
pattern = [
	"pattern 1",
]
# this will add a `sudo` before the command if:
# - the `sudo` is found by `which`
# - the last command does not contain `sudo`
suggest = '''
#[executable(sudo), !cmd_contains(sudo)]
sudo {{command}}'''

The placeholder is evaluated as following:

  • {{command}}: All the command without any modification
  • {{command[1]}}: The first argument of the command (the command itself has index of 0)
  • {{command[2:5]}}: The second to fifth arguments. If any of the side is not specified, them it defaults to the start (if it is left) or the end (if it is right).
  • {{typo[2](fix1, fix2)}}: This will try to change the second argument to candidates in the parenthesis. The argument in parentheses must have at least 2 values. Single arguments are reserved for specific matches, for instance, path to search all commands found in the $PATH environment.

The suggestion can have additional conditions to check. To specify the conditions, add a #[...] at the first line (just like derive macros in Rust). Available conditions:

  • executable: Check if the argument can be found by which
  • cmd_contains: Check if the last user input contains the argument
  • err_contains: Check if the error of the command contains the argument

Current Progress

We need more rule files!