Home Fish shell How To Manage Functions In Fish Shell On Linux

How To Manage Functions In Fish Shell On Linux

A Beginners Guide To Use functions Command In Fish Shell

By sk
649 views

The functions command in Fish shell is used for managing and interacting with Fish functions. It allows you to list, edit, erase, and even save functions. In this tutorial, we will learn how to manage functions in fish shell with examples on Linux.

What is the functions Command?

In Fish shell, functions are blocks of reusable code that you can define and call by name. The functions command is a built-in utility that helps you manage these functions. You can use it to:

  • List all functions.
  • Display the code of a specific function.
  • Edit a function.
  • Erase (delete) a function.
  • Save functions to a file.

When and Why Use the functions Command?

  • Efficiency: Quickly manage and modify functions without manually editing configuration files.
  • Debugging: Inspect and troubleshoot functions easily.
  • Portability: Save and share functions across systems.
  • Flexibility: Override or extend built-in commands with custom behavior.

Manage Functions in Fish Shell

1. Define (Create) a New Function

There are two ways to define a new function. You can either directly define it inside the fish configuration file (~/.config/fish/config.fish) or define it in a separate file inside a custom directory (e.g. ~/.config/fish/functions/).

The key difference between defining a function in ~/.config/fish/config.fish and saving it in ~/.config/fish/functions/ lies in how Fish handles function loading and execution.

1.1. Defining a Function in config.fish

When you add a function directly inside ~/.config/fish/config.fish, it runs every time a new Fish shell starts.

Example:

function cdls
    # Change to the specified directory
    builtin cd $argv[1]
    and begin
        # List directory contents with a timeout of 1 second
        echo "Changed to directory: $PWD"
        timeout 1s ls -l
    end
end

Pros:

  • Runs when Fish starts.
  • Good for small functions or quick customizations.

Cons:

  • If you have many functions in config.fish, it can become cluttered.
  • Functions are only loaded when a new shell starts, meaning changes require restarting Fish (exec fish or reopening the terminal).
  • Slower startup if config.fish contains many functions.

1.2. Saving a Function in a Custom Directory

When you use funcsave function_name or manually create a file in ~/.config/fish/functions/, Fish automatically loads the function when needed.

First, create the function in your current Fish session:

function cdls
    # Change to the specified directory
    builtin cd $argv[1]
    and begin
        # List directory contents with a timeout of 1 second
        echo "Changed to directory: $PWD"
        timeout 1s ls -l
    end
end

At this point, the function will work in your session, but it will disappear when you restart Fish.

To save a defined function permanently, we can use the funcsave command.

funcsave cdls

This saves cdls to ~/.config/fish/functions/cdls.fish, containing:

function cdls
    # Change to the specified directory
    builtin cd $argv[1]
    and begin
        # List directory contents with a timeout of 1 second
        echo "Changed to directory: $PWD"
        timeout 1s ls -l
    end
end

Pros:

  • Fish loads the function only when used, keeping startup fast.
  • Functions are stored separately, making them easier to manage.
  • You can delete a function permanently by removing its .fish file without editing config.fish.

Cons:

  • Requires an extra step to save (funcsave function_name or manually creating a .fish file).
  • Might not be obvious to new users where the function is stored.

Best Practice?

  • If the function is small and essential (e.g., an alias-like function), adding it to config.fish is fine.
  • If the function is used occasionally or complex, storing it in ~/.config/fish/functions/ is better for organization and performance.

2. List All Functions

To see a list of all currently defined functions in your Fish shell, use:

functions

This will display the names of all functions, including built-in ones and custom ones you’ve created.

Sample Output:

N_, abbr, alias, bg, cd, cdh, cdls, contains_seq, delete-or-exit, diff, dirh,
dirs, disown, down-or-search, edit_command_buffer, export, fg, fish_add_path,
fish_breakpoint_prompt, fish_clipboard_copy, fish_clipboard_paste,
fish_command_not_found, fish_commandline_append, fish_commandline_prepend,
fish_config, fish_default_key_bindings, fish_default_mode_prompt,
fish_git_prompt, fish_greeting, fish_hg_prompt, fish_hybrid_key_bindings,
fish_indent, fish_is_root_user, fish_job_summary, fish_key_reader,
fish_mode_prompt, fish_opt, fish_print_git_action, fish_print_hg_root,
fish_prompt, fish_sigtrap_handler, fish_status_to_signal, fish_svn_prompt,
fish_title, fish_update_completions, fish_vcs_prompt, fish_vi_cursor,
fish_vi_key_bindings, funced, funcsave, grep, help, history, isatty, kill, la,
ll, ls, man, nextd, nextd-or-forward-word, open, popd, prevd,
prevd-or-backward-word, prompt_hostname, prompt_login, prompt_pwd, psub, pushd,
realpath, seq, setenv, suspend, trap, umask, up-or-search, vared, wait
Functions Command Output in Fish Shell
Functions Command Output in Fish Shell

3. View the Definition of a Function

To view the code of a specific function, use:

functions <function_name>

For example, to see the code for the cdls function:

functions cdls

This will print the entire definition of the cd function.

function cdls
    # Change to the specified directory
    builtin cd $argv[1]
    and begin
        # List directory contents with a timeout of 1 second
        echo "Changed to directory: $PWD"
        timeout 1s ls -l
    end
end

4. Edit a Function

You can edit a function directly in your default text editor using:

funced <function_name>

For example, to edit the cd function:

funced cdls

This will open the function in your editor (e.g., nano or vim), allowing you to modify it. Once you save and exit, the changes will take effect immediately.

5. Save a Function to a File

This is SAME as creating new functions with funcsave command.

First, define the function in the current session.

If you want to save a function’s definition to a file, use:

functions <function_name> > filename.fish

For example, to save the cdls function to a file:

functions cdls > ~/.config/fish/functions/cdls.fish

This is useful for backing up or sharing functions.

6. Copy a Function

You can copy an existing function to a new name using -c or --copy flag:

functions --copy <old_function_name> <new_function_name>

For example, to copy the cd function to a new function called mycd:

functions --copy cd mycd

Now you can modify mycd without affecting the original cd function.

7. Erase (Delete) a Function

To delete a function from the current session, use -e or --erase flag:

functions --erase <function_name>

For example, to remove a custom cdls function:

functions --erase cdls

This removes cdls but does not affect permanent functions stored in config.fish or in ~/.config/fish/functions/ directory.

To permanently remove a function, open the fish configuration file and comment out or delete the entire function.

After removing the function, reload fish to apply changes:

exec fish

Or restart your Terminal.

If you saved the function using funcsave or created it manually, Fish stores it in ~/.config/fish/functions/.

To remove it permanently, simply delete the function file:

rm ~/.config/fish/functions/function_name.fish

Example:

rm ~/.config/fish/functions/cdls.fish

And then reload the fish or restart the terminal.

Summary of functions Command Options

CommandDescription
functionsList all functions.
functions <function_name>Display the code of a specific function.
funced <function_name>Edit a function in your default text editor.
functions --erase <function_name>Delete a function.
functions --copy <old> <new>Copy a function to a new name.
functions <name> > file.fishSave a function’s definition to a file.

Conclusion

The functions command is a must-know tool for Fish shell users. It gives you full control over your shell environment and makes working with functions a breeze. For more details, refer to the functions section in the fish shell official documentation.

Related Read:

You May Also Like

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

This website uses cookies to improve your experience. By using this site, we will assume that you're OK with it. Accept Read More