Create CONTRIBUTING.md
This commit is contained in:
parent
2cfafa20af
commit
bbc279f9cd
1 changed files with 108 additions and 0 deletions
108
CONTRIBUTING.md
Normal file
108
CONTRIBUTING.md
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
# Contributoin guidelines
|
||||||
|
|
||||||
|
Before writing additional functionality to fzf.kak please refer to
|
||||||
|
[Kakoune's scripting guidelines](https://github.com/mawww/kakoune/blob/master/doc/writing_scripts.asciidoc).
|
||||||
|
|
||||||
|
## Adding new command
|
||||||
|
When adding commands to fzf.kak script please ensure to provide meaningfull names,
|
||||||
|
and prever full command defenitions. Also ensure that code must be resourcible, so if user
|
||||||
|
want to resource kakrc plugin would not provide any warnings.
|
||||||
|
|
||||||
|
Good code:
|
||||||
|
```kak
|
||||||
|
define-command -override -hidden -docstring \
|
||||||
|
"This is an example of adding new fzf-mode command.
|
||||||
|
Note that '-override' is used since script should always be resourcible
|
||||||
|
If shell scripting is involved please follow POSIX standards, and test
|
||||||
|
your code in POSIX shells, like 'dash', 'ash', and popular POSIX-compatible
|
||||||
|
shells, like 'bash' and 'zsh' You earn bonus points if your script works in 'fish'.
|
||||||
|
Also notice that '-hidden' is used since all commands of fzf should be accesible from
|
||||||
|
fzf-mode keybindings. User should not remember all possible commands.
|
||||||
|
" \ fzf-good-example %{
|
||||||
|
# This script features fzf command that accepts two arguments:
|
||||||
|
# First argument is the command that should be used by kakoune
|
||||||
|
# after fzf returns its result
|
||||||
|
# Second argument is a command to the fzf itself, which will be used
|
||||||
|
# to provede list for fzf to show.
|
||||||
|
fzf "echo $1" "echo 'thisisanexample'"
|
||||||
|
}
|
||||||
|
|
||||||
|
map global fzf -docstring "fzf example command" e '<esc>: fzf-good-example<ret>'
|
||||||
|
# Note that space after column is intentional and prevents showing 'fzf-good-example' in command history
|
||||||
|
```
|
||||||
|
|
||||||
|
Bad code:
|
||||||
|
```kak
|
||||||
|
# example
|
||||||
|
def fzf-good-exmpl %{ fzf "echo $1" "echo 'actually i'm bad example'" }
|
||||||
|
```
|
||||||
|
|
||||||
|
Although such code is short, it is not *safe*, because reloading kakrc will cause an error here.
|
||||||
|
Also user doesnt know about all fzf commands, and by not adding command to `fzf-mode` you force
|
||||||
|
user to search for fzf commands in commandline which isn't the way how plugin should work. And even
|
||||||
|
if user finds this command in commandline, there's no documentation, and name is short and may be not
|
||||||
|
meaningful enough for user to understand what this command actually does. The name may also be misleading
|
||||||
|
like in whis example - command says that it is good, but the result will be bad for the user.
|
||||||
|
|
||||||
|
## Shell scripting
|
||||||
|
Shell scripting should be POSIX compatible. Please avoid bashisms. You can refer to
|
||||||
|
[Kakoune's scripting guidelines](https://github.com/mawww/kakoune/blob/master/doc/writing_scripts.asciidoc).
|
||||||
|
Please test your code in POSIX shells, like [dash](https://packages.debian.org/stretch/dash),
|
||||||
|
[ash](https://www.in-ulm.de/~mascheck/various/ash/), and in [Busybox](https://www.busybox.net/) environment
|
||||||
|
if possible. Also please test in popular POSIX-compatible shells, e.g. [bash](https://www.gnu.org/software/bash/),
|
||||||
|
[zsh](https://www.zsh.org/).
|
||||||
|
|
||||||
|
Sometimes it is not possible to use `fzf` command directly, like in previous example. Some preparations may
|
||||||
|
be needed. For example, you would like to check if tool that would be used to provide list for fzf is installed,
|
||||||
|
and fallback to another if not. Is so `fzf` can be called from shell expansion `%sh{ }`. Consider some examples:
|
||||||
|
|
||||||
|
Good code:
|
||||||
|
```kak
|
||||||
|
define-command -override -hidden -docstring \
|
||||||
|
"This is an example of using fzf command from shell expansion.
|
||||||
|
Note that first argument should be used with escaped '$1'. This is intentional
|
||||||
|
because you will echo whole command out of shell expansion and without escaping '$1'
|
||||||
|
will be expanded to nothing.
|
||||||
|
Also notice that we need to escape quotes and use shell 'eval' command to actually
|
||||||
|
expand '$cmd' to it's value.
|
||||||
|
" \ fzf-ripgrep-good %{
|
||||||
|
evaluate-commands %sh{
|
||||||
|
if [ -z $(command -v rg) ]; then
|
||||||
|
echo "echo -markup '{Information}$kak_opt_fzf_file_command is not installed. Falling back to ''find'''"
|
||||||
|
cmd="find -type f"
|
||||||
|
else
|
||||||
|
cmd="rg --files"
|
||||||
|
fi
|
||||||
|
eval echo 'fzf \"edit \$1\" \"$cmd\"'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
map global fzf -docstring "use ripgrep to search for files" s '<esc>: fzf-ripgrep-good<ret>'
|
||||||
|
```
|
||||||
|
|
||||||
|
Bad code:
|
||||||
|
```kak
|
||||||
|
def fzf-ripgrep-bad %{ eval %sh{
|
||||||
|
cmd="rg --files"
|
||||||
|
[[ "$(which rg)" =~ "not found" ]] && cmd="find -type f"
|
||||||
|
eval echo 'fzf \"edit \$1\" \"$cmd\"'
|
||||||
|
}}
|
||||||
|
|
||||||
|
map global fzf -docstring "use ripgrep to search for files" r '<esc>: fzf-shell-example<ret>'
|
||||||
|
```
|
||||||
|
|
||||||
|
Not only bashisms are being used here, but also everything what happens here is obscured from user. This command
|
||||||
|
says that it will use ripgrep to form file list for fzf. But If `rg` is not installed, user will be misleaded by
|
||||||
|
the fact that `fzf-shell-bad` works, but don't act like it should work when `rg` is installed. And nothing seems
|
||||||
|
to be wrong when this function if executed.
|
||||||
|
|
||||||
|
Although it may be good in some cases to obscure well-handled errors, this is not the case, and a warning should
|
||||||
|
be shown.
|
||||||
|
|
||||||
|
This code also uses `which` program, however this program is should be avoided. Because is it an external process
|
||||||
|
for doing very little thing (`hash` or `command` are way cheaper). `which` also is an external command, so it may
|
||||||
|
be not installed.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
This document may be extended, so please check it from time to time.
|
Loading…
Reference in a new issue