spmenu-wiki/Functions in spmenu_run.md

103 lines
4 KiB
Markdown
Raw Normal View History

# Functions in spmenu_run
2023-05-09 19:37:40 +02:00
spmenu_run has a configuration file located in ~/.config/spmenu/run/config,
which should be generated when you run it for the first time. This file is
simply sourced by spmenu_run meaning all functions, variables and arrays are
imported. The script looks for a few functions which will run if found during
different stages. There are a few of these functions, and the default config
file should list them out.
2023-05-09 19:37:40 +02:00
- 'run_pre_func' before spawning spmenu.
- 'run_post_func' after spawning spmenu, selected item passed as an argument.
- 'desktop_pre_func' before spawning spmenu.
- 'desktop_post_func' after spawning spmenu, selected item passed as an argument.
- 'fm_pre_func' before spawning spmenu.
- 'fm_post_func' after spawning spmenu, selected item passed as an argument.
- 'fm_pre_list_func' right before listing out files.
- 'fm_post_list_func' right after listing out files.
- 'fm_dir_func' before changing directory to the selected directory.
- 'fm_line_func' for each line in ls output, the line is passed as an argument,
including SGR colors. - 'read_man' when reading a man page, selected item
passed as an argument.
These are quite self-explanatory. The default configuration file even gives an
example of how this can be used. Additionally the default config file should
already have a 'read_man' function. It looks something like this:
```Shell
read_man() {
man "$1" | col -b | ${RUNLAUNCHER:-spmenu} --lines 40 --columns 1 -p
"man $1"
}
```
In case you are new to shell scripting, $1 here is the first argument passed to
this function, outside of the function name itself which is $0. This function
gets passed the input minus the '?' character, and then looks up the man page
for that. Then it will parse the output and display it in an spmenu prompt.
Same goes for many of the other functions.
2023-05-09 19:37:40 +02:00
## Writing a function
Let's say we want to display a few more entries in the run launcher. Let's say
we want to open Discord and Element in our web browser (Chromium) as an app,
but don't want to have a shell script for it. Well, then we can do something
like this.
```Shell
run_pre_func() {
printf "discord\nelement\n"
}
run_post_func() {
case "$1" in
"discord") chromium --app="https://discord.com/channels/@me"; exit 0 ;;
"element") chromium --app="https://app.element.io/index.html"; exit 0 ;;
esac
}
```
So as you can see, run_pre_func is useful if we want to print stuff. We can
then use run_post_func to parse the user input. Entries from run_pre_func
should be sorted before being displayed to the user, provided SORT=true in the
config.
**NOTE: Do not forget to exit in the case statement, otherwise spmenu will
attempt to run the input. spmenu does not exit after running the function.**
Now let's do one for the file launcher provided by spmenu_run -fm. For this
example, let's open the file depending on the file extension. A pre_func is not
necessary here.
```Shell
fm_post_func() {
case "$1" in
*.pdf) zathura "$1"; exit 0 ;;
*.md|*.php|*.txt|*.c|*.h|*.css|*.conf) nvim "$1"; exit 0 ;;
*.html|*.htm) chromium "$1"; exit 0 ;;
*.png|*.jpg|*.jpeg|*.gif|*.tiff) nsxiv "$1"; exit 0 ;;
*.mp4|*.mkv|*.mp3|*.flac|*.wav) mpv "$1"; exit 0 ;;
*) [ ! -x "$1" ] && nvim "$1"; exit 0 ;;
esac
}
```
This function will handle opening of files based on the file extension. Case
statements are very useful and powerful for things like matching strings.
Again, do not forget to exit or else spmenu_run will try to handle running it.
Also note that the --stdout flag will **not** run this function.
Another one for the file launcher. This one however **requires** spmenu 1.0.
This function will display images if possible.
```Shell
fm_line_func() {
case "$1" in
*.png|*.jpg|*.jpeg|*.svg|*.gif|*.tiff) printf "img://$1\t" ;;
esac
}
```
Note that this may add a lot of slowdown in some cases. Use with care, and feel
free to adjust.