scriptura
A fish version of ianthehenry/sd. It provides a convenient way to organise and execute your shell scripts from anywhere in your terminal.
Just like the original sd, you can organise your scripts in a logical directory hierarchy, and then execute them with a much shorter command.
Differences from original sd
This fish version has a few differences from the original sd:
- Flags for
scripturamust be placed before any arguments, unlike the original where flags could come after arguments --reallyflag has been removed (the above constraint makes it no longer necessary)--can be used to separate arguments intended forscripturaitself from those intended for the executed command- Choose your own short alias
Motivation
The command name sd conflicts with chmln/sd (a nicer version of sed), which I’ve been using for quite some time.
sd doesn’t include completions for fish and the linked gist seems to have been removed.
I also thought that a fish implementation would be cleaner.
Installation
Currently, installation via Nix is the only known method. Installation via a fish plugin manager will probably work, but is untested. Feedback on this would be appreciated.
Using Nix
If you’re using Nix, scriptura is available as a flake, intended for use with home-manager and the script-directory module:
inputs.scriptura.url = "git+https://codeberg.org/alinnow/scriptura";
Add the overlay:
overlays = [
scriptura.overlays.default
]
And then configure the script-directory module:
programs.script-directory = {
enable = true;
package = pkgs.scriptura
settings = {
SD_ROOT = "${config.home.homeDirectory}/.sd";
SD_EDITOR = "nvim";
SD_CAT = "lolcat";
};
};
Any SD_* variables will be respected as long as their SCRIPTURA_* counterpart is not set.
Shorter command name
Who wants to type out the name scriptura every time? Not me.
I find sf (*s*cript *f*older) to be nice to type and it doesn’t clash with anything, but you can choose. Aliases in fish automatically inherit the completion of the parent.
alias --save sf scriptura
In home-manager you can do this with
home.shellAliases.sf = "scriptura";
Usage
The default behaviour for scriptura foo bar is:
- Assume scripts are under ~/sd.
- If ~/sd/foo is an executable file, execute ~/sd/foo bar.
- If ~/sd/foo/bar is an executable file, execute it with no arguments.
- If ~/sd/foo/bar is a directory, it prints usage information.
- If ~/sd/foo/bar is a non-executable regular file, it just prints the file out.
Special Flags
scriptura supports several special flags that override normal execution:
--help: Print help information--new: Create a new script--edit: Open the script in an editor--cat: Print the contents of the script--which: Print the path of the script
Help
The --help switch prints the content of a help file or comments inside a script.
For directories, the content of a file called help will be printed, if it exists. scriptura --help nix would print the contents of ~/sd/nix/help.
Given a script at ~/sd/foo/bar, --help will print the contents of a corresponding file with the .help extension, in this case ~/sd/foo/bar.help.
If such a file does not exist, any comments in the script (excluding shebang) are printed instead.
Configuration
The following environment variables can be used to configure scriptura:
SCRIPTURA_ROOT: location of the script directory. Defaults to$HOME/sd.SCRIPTURA_EDITOR: used byscriptura --edit fooandscriptura --new foo. Defaults to$VISUAL, then$EDITOR, then, if neither of those are set, triesvim,nano, and finally,vi.SCRIPTURA_CAT: program used when printing files, in case you want to use something likebat. Defaults tocat.
If not defined, each variable will try the SD_ equivalent before using default values.