Waktunya Migrasi ke Fish Shell

Aditya Phra•

Setelah pemakaian fish selama seminggu, aku akhirnya memutuskan untuk all in ke fish shell karena fitur autosuggestions, tab completions, dan syntax highlighting yang sudah jadi fitur default.

Jadi, tidak perlu ribet lagi menginstal plugin satu per satu seperti yang aku lakukan sebelumnya di zsh dan bash.

Instalasi

Instalasi fish sesuaikan dengan paket manager yang kamu pakai sekarang, kalau di Arch Linux tinggal:

sudo pacman -S fish

Ganti default shell:

chsh -s /usr/bin/fish

Kalau tanpa mengganti default shell bisa dengan mengedit file ~/.bashrc kemudian isi dengan:

exec fish

Konfigurasi awal

Biasanya aku langsung mematikan fitur kata sambutan yang muncul setiap kali membuka fish:

set -U fish_greeting

Kalau kamu mau mengganti skema warna dan format prompt fish bisa memakai editor konfigurasi web yang harus diaktifkan dengan:

fish_config

Nanti langsung membuka editor konfigurasi versi web di browser.

Prompt yang biasanya kupakai sebelumnya di zsh dan bash itu starship, yang mantapnya bisa juga dipakai di fish shell.

Konfigurasi fish

File konfigurasi fish shell berada di direktori ~/.config/fish:

  • config.fish, fungsinya sama seperti file .bashrc atau .zshrc
  • functions, direktori untuk menyimpan fungsi & alias
  • fish_variables, file untuk menyimpan variabel universal (nanti dijelaskan)

Environment variable

Deklarasi environment variable di fish shell agak berbeda, biasanya memakai export kalau di bash dan zsh, kalau di fish memakai set seperti ini:

set -gx EDITOR nano

Fungsi -g untuk mendeklarasi variable di global scope dan -x agar variabel dapat diakses oleh child process yang bisa disebut environment variable.

Namun, akses environment variable hanya ada di sesi di mana variabel dideklarasikan. Biar tersedia di setiap sesi shell, bisa memakai fitur variabel universal (-U) seperti ini:

set -Ux EDITOR nano

Atau bisa juga dengan menambahkan konfigurasi ini ke file ~/.config/fish/config.fish:

set -gx EDITOR nvim

Environment variable juga bisa dideklarasikan sementara untuk child process seperti di bash dan zsh:

PAGER=cat git log

Menambahkan PATH baru

Menambahkan PATH baru agar program lokal bisa terdeteksi di shell penting, seperti yang aku lakukan sebelumnya di bash dan zsh.

Contoh ini untuk menambahkan ~/.local/bin ke PATH dengan fungsi fish_add_path:

fish_add_path ~/.local/bin

Cek PATH:

echo "$PATH"

Untuk menghapus ~/.local/bin dari PATH caranya dengan memodifikasi variabel universal fish_user_paths:

set -U fish_user_paths (string match -v ~/.local/bin $fish_user_paths)

Pada dasarnya fungsi fish_add_path itu membuat atau memodifikasi variabel universal fish_user_paths, jadi bisa dimodifikasi manual dengan set seperti yang di atas.

Alias dan fungsi

Cara kerja alias di fish shell sangatlah berbeda dari bash dan zsh. Di fish sendiri alias itu sebenarnya fungsi, bisa dicoba sendiri:

alias --save rmi="rm -i"

Perintah alias di atas akan membuat file ~/.config/fish/functions/rmi.fish yang berisi fungsi:

function rmi --wraps='rm -i' --description 'alias rmi=rm -i'
    rm -i $argv
end

Fungsi itu bisa diedit langsung melalui shell:

EDITOR=nano funced rmi

Setelah diedit, simpanlah fungsi ke file agar disimpan permanen:

funcsave rmi

Cara untuk menghapus fungsi tadi:

functions -e rmi
funcsave rmi

Membuat singkatan

Salah satu fitur unik dari fish shell itu bisa membuat singkatan-singkatan mirip alias, tetapi bisa direviu dan edit dulu sebelum dieksekusi.

Untuk membuat singkatan, tambahkan konfigurasi abbr ke ~/.config/fish/config.fish:

abbr -a ga -- git add

Kalau kamu mengetik ga[SPASI] di shell, langsung berubah menjadi seperti ini:

git add

Bisa juga mengatur posisi kursor agar berpindah ke dalam tanda kutip, seperti contoh abbr ini:

abbr -a --set-cursor -- gc git commit -m \'%\'

Contoh abbr agar bisa dipakai dengan sudo:

abbr -a -c '' -c sudo -- rmi rm -i

Jadi, kalau kamu mengetik rmi[SPASI] dan sudo rmi[SPASI], berubah menjadi seperti ini:

rm -i
sudo rm -i