{"id":28277616,"url":"https://github.com/jabbalaci/my-fish","last_synced_at":"2026-04-15T05:32:07.367Z","repository":{"id":294074990,"uuid":"985904965","full_name":"jabbalaci/my-fish","owner":"jabbalaci","description":"My Fish shell config. It has lots of useful filter and regular functions.","archived":false,"fork":false,"pushed_at":"2026-03-08T18:23:26.000Z","size":312,"stargazers_count":22,"open_issues_count":1,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-08T22:31:54.759Z","etag":null,"topics":["bash","dotfiles","filter","filters","fish","fish-shell","linux","python","scripts","shell","zsh"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jabbalaci.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-18T19:01:51.000Z","updated_at":"2026-03-08T18:23:29.000Z","dependencies_parsed_at":"2025-06-19T16:33:42.714Z","dependency_job_id":"b4a02320-bc6f-4e72-9a97-aa1f9bd96e37","html_url":"https://github.com/jabbalaci/my-fish","commit_stats":null,"previous_names":["jabbalaci/my-fish"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jabbalaci/my-fish","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabbalaci%2Fmy-fish","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabbalaci%2Fmy-fish/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabbalaci%2Fmy-fish/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabbalaci%2Fmy-fish/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jabbalaci","download_url":"https://codeload.github.com/jabbalaci/my-fish/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jabbalaci%2Fmy-fish/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31828531,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T18:05:02.291Z","status":"online","status_checked_at":"2026-04-15T02:00:06.175Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","dotfiles","filter","filters","fish","fish-shell","linux","python","scripts","shell","zsh"],"created_at":"2025-05-21T07:12:35.869Z","updated_at":"2026-04-15T05:32:07.314Z","avatar_url":"https://github.com/jabbalaci.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# My Fish\n\nThis repo. contains my configuration files for\nthe [Fish 🐟 shell](https://fishshell.com/).\n\nLocation of this folder: `~/.config/fish`\n\n## Table of Contents\n\n1. [Screenshot](#screenshot)\n1. [Filters](#filters)\n1. [Functions](#functions)\n3. [Issues](#issues)\n4. [Links](#links)\n5. [Author](#author)\n\n## Screenshot\n\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"100%\" src=\"https://i.imgur.com/7U8EtJ0.png\"\u003e\n\u003c/p\u003e\n\nI use a light theme, BTW.\n\n## Filters\n\nI've made lots of useful filters that you can\nfind in the [`functions/`](functions/) folder.\n\nA filter takes the output of a program as its input and transforms it.\nIt is used after a pipe. Example:\n\n```shell\n$ echo \"hello\" | upper\nHELLO\n```\n\nMost of my filters are implemented in the form\nof embedded Python scripts.\n\nLet me put here a note: by default, CPython starts\nslowly. Normally it's not an issue, but when\nyou chain several filters together, these times\nadd up. On my machine, executing an empty file\ntook 90 ms. It was the startup time of the interpreter.\nThe more filters I chained, the slower it became.\nBut I found a trick: with the `-S` option (ex.: `python3 -S script.py`) we can\ndisable the import of the `site` module, thus\nI could reduce the startup time from 90 ms to 10 ms.\nSince I don't use any 3rd-party libraries in my filters,\njust the standard library, it shouldn't cause any\nproblems. However, if you encounter any problem,\njust let me know. Thanks.\n\nOn Reddit, from `/u/_mattmc3_` I got some great tips\nhow to rewrite some of these functions in an\nidiomatic way.\n\nHere is the list of my filters in alphabetical order:\n\n\u003c!-- START: filters --\u003e\n\n### (1) addprefix: Add prefix to every line\n\n[addprefix.fish](functions/addprefix.fish)\n\n```shell\n    $ cat main.py\n    x = 1\n    y = 2\n\n    $ cat main.py | addprefix \"# \"\n    # x = 1\n    # y = 2\n```\n\n### (2) addsuffix: Add suffix to every line\n\n[addsuffix.fish](functions/addsuffix.fish)\n\n```shell\n    $ cat main.py\n    x = 1\n    y = 2\n\n    $ cat main.py | addsuffix \" # variable\"\n    x = 1 # variable\n    y = 2 # variable\n```\n\n### (3) avg: Calculate the average\n\n[avg.fish](functions/avg.fish)\n\n```shell\n    $ cat file.txt\n    169.69\n    230.35\n    211.62\n    269.94\n    209.64\n    492.34\n    425.83\n\n    $ cat file.txt | avg\n    287.06\n```\n\n### (4) base64decode: Base64 decode\n\n[base64decode.fish](functions/base64decode.fish)\n\n```shell\n    $ echo \"aGVsbG8=\" | base64decode\n    hello\n\n    $ echo \"aGVsbG8=\" | base64decode | base64encode\n    aGVsbG8=\n```\n\n### (5) base64encode: Base64 encode\n\n[base64encode.fish](functions/base64encode.fish)\n\n```shell\n    $ echo \"hello\" | base64encode\n    aGVsbG8=\n\n    $ echo \"hello\" | base64encode | base64decode\n    hello\n```\n\n### (6) between: Print lines between `\u003cstart_line\u003e` and `\u003cend_line\u003e` [incl.]\n\n[between.fish](functions/between.fish)\n\n```shell\n    $ cat 123.txt\n    one\n    two\n    three\n\n    $ cat 123.txt | between 2 3\n    two\n    three\n```\n\n### (7) between.re: Print lines between two regex matches [inclusive]\n\n[between.re.fish](functions/between.re.fish)\n\n```shell\n    $ cat file.txt\n    aaa\n    ONE\n    bbb\n    ccc\n    TWO\n    ddd\n\n    $ cat file.txt | between.re ONE TWO\n    ONE\n    bbb\n    ccc\n    TWO\n\n    $ cat file.txt | between.re ONE TWO | skip 1 | skip last\n    bbb\n    ccc\n```\n\nThere's a similar filter called `between`, which requires two line numbers\nand prints all the lines between these two values (incl.).\n\nHere you need to specify two regular expressions instead of two line numbers.\n\nIt reads the whole input, thus don't use it with huge files.\n\n### (8) bin: Decimal number to binary\n\n[bin.fish](functions/bin.fish)\n\n```shell\n    $ echo 2025 | bin\n    0b11111101001\n\n    $ echo 2025 | bin | unbin\n    2025\n```\n\n### (9) border: Draw border around text\n\n[border.fish](functions/border.fish)\n\n```shell\n    $ echo \"Section 1\" | border\n    #################\n    ##  Section 1  ##\n    #################\n\n    $ echo \"Section 1\" | border '+'\n    +++++++++++++++++\n    ++  Section 1  ++\n    +++++++++++++++++\n```\n\n### (10) capitalize: Convert to capitalized text\n\n[capitalize.fish](functions/capitalize.fish)\n\n```shell\n    $ echo \"hEllO\" | capitalize\n    Hello\n```\n\n### (11) collapse: Collapse multiple whitespaces into single space\n\n[collapse.fish](functions/collapse.fish)\n\n```shell\n    $ echo \"    .aa    bb.    \" | quotes\n    '    .aa    bb.    '\n\n    $ echo \"    .aa    bb.    \" | collapse\n    .aa bb.\n\n    $ echo \"    .aa    bb.    \" | collapse | quotes\n    '.aa bb.'\n```\n\n### (12) dedup: Remove duplicate lines and keep the original order\n\n[dedup.fish](functions/dedup.fish)\n\n```shell\n    $ cat file.txt\n    dd\n    bb\n    dd  # duplicate\n    aa\n    aa  # duplicate\n    bb  # duplicate\n\n    $ cat file.txt | dedup\n    dd\n    bb\n    aa\n```\n\nIn the first example, `duplicate` is just a note, not part of the file.\n\n### (13) dups: Find duplicate lines\n\n[dups.fish](functions/dups.fish)\n\n```shell\n    $ cat file.txt\n    dd\n    bb\n    dd  # duplicate\n    aa\n    aa  # duplicate\n    aa  # duplicate\n\n    $ cat file.txt | dups\n    dd\n    aa\n    aa\n\n    $ cat file.txt | dups | dedup\n    dd\n    aa\n```\n\nIn the first example, `duplicate` is just a note, not part of the file.\n\n`dups` will print all the duplicates, even several times.\nIf you want to see a duplicate just once, then combine it with the `dedup` filter.\n\n### (14) every: Take every \u003cn\u003eth line, optionally starting from \u003cfrom\u003e\n\n[every.fish](functions/every.fish)\n\n```shell\n    $ cat file.txt\n    1\n    one\n    2\n    two\n    3\n    three\n\n    # take every second line\n    $ cat file.txt | every 2\n    one\n    two\n    three\n\n    # take every second line from the first line\n    $ cat file.txt | every 2 --from 1\n    1\n    2\n    3\n\n    # take every second line from the fourth line\n    $ cat file.txt | every 2 --from 4\n    two\n    three\n```\n\nThe index of the 1st line is 1.\n\n### (15) ex.thumbnail: Extract the URL of a YouTube video's thumbnail\n\n[ex.thumbnail.fish](functions/ex.thumbnail.fish)\n\n```shell\n    $ echo \"https://www.youtube.com/watch?v=GFxH8bi4Qps\" | ex.thumbnail\n    https://i.ytimg.com/vi/GFxH8bi4Qps/maxresdefault.jpg\n\n    $ echo \"https://www.youtube.com/watch?v=GFxH8bi4Qps\" | ex.thumbnail open\n    https://i.ytimg.com/vi/GFxH8bi4Qps/maxresdefault.jpg\n    # and it also opens the thumbnail with the default image viewer\n```\n\nIt extracts the URL of the thumbnail of a YouTube video.\n\n### (16) ex.title: Extract HTML title from a webpage\n\n[ex.title.fish](functions/ex.title.fish)\n\n```shell\n    $ curl -s https://fishshell.com/ | ex.title\n    fish shell\n```\n\nIt was extracted from `\u003ctitle\u003efish shell\u003c/title\u003e`.\n\n### (17) ex.urls: Extract all URLs\n\n[ex.urls.fish](functions/ex.urls.fish)\n\n```shell\n    $ curl -s https://fishshell.com/ | ex.urls\n    https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js\n    https://oss.maxcdn.com/respond/1.4.2/respond.min.js\n    ...\n```\n\n### (18) filesize: Convert filesize [bytes] to human-readable format\n\n[filesize.fish](functions/filesize.fish)\n\n```shell\n    $ echo 123456 | filesize\n    120.56 KB\n```\n\n### (19) flip: Flip input text upside down using Unicode\n\n[flip.fish](functions/flip.fish)\n\n```shell\n    $ echo \"Fish shell\" | flip\n    ʃʃǝɥs ɥsᴉℲ\n\n    $ echo \"Fish shell\" | flip | unflip\n    Fish shell\n```\n\n### (20) freq: Word frequency [simple, case-insensitive]\n\n[freq.fish](functions/freq.fish)\n\n```shell\n    $ cat words.txt\n    aa bb aa aa cc cc dd\n\n    $ cat words.txt | freq\n    aa: 3\n    cc: 2\n    bb: 1\n    dd: 1\n```\n\n### (21) getcol: Split the input on whitespace and print the column indicated\n\n[getcol.fish](functions/getcol.fish)\n\n```shell\n    $ echo 1 2 | getcol 2\n    2\n```\n\n**get** the given **col**umn\n\n### (22) getrow: Print the row of the input indicated\n\n[getrow.fish](functions/getrow.fish)\n\n```shell\n    $ seq 3\n    1\n    2\n    3\n\n    $ seq 3 | getrow 2\n    2\n```\n\n**get** the given **row**\n\n### (23) hex: Decimal number to hex\n\n[hex.fish](functions/hex.fish)\n\n```shell\n    $ echo 2025 | hex\n    0x7e9\n\n    $ echo 2025 | hex | unhex\n    2025\n```\n\n### (24) hexview: Show hex values of the input\n\n[hexview.fish](functions/hexview.fish)\n\n```shell\n    $ echo \"Éva\" | hexview\n    ÉC9 v76 a61 ␤0A\n\n    $ echo -n \"Éva\" | hexview\n    ÉC9 v76 a61\n    # echo -n: no newline character\n\n    $ echo \"Éva\" | hexview bin\n    .C3 .89 v76 a61 ␤0A\n```\n\nThis filter is **made for text input** that may contain non-ASCII characters.\nFor binary files, use a proper hex editor.\n\nYou can use it 2 modes:\n\n* text mode (default)\n* binary mode\n\nTab, newline, carriage return and space characters are made visible with Unicode characters.\n\nIn text mode, in front of a hex value it also shows the character for easier identification.\nIf you have non-ASCII characters in your input, you'd better switch to binary mode.\nIn binary mode, the input is processed as a byte stream. Non-printable characters appear as a dot (`.`).\n\n### (25) hexview2: Show the input and the hex values of the input side-by-side\n\n[hexview2.fish](functions/hexview2.fish)\n\n```shell\n    $ cat main.c | hexview2\n    # opens an editor in split mode\n    # left side: content of the file\n    # right side: hex values of the lines\n\n    $ cat main.c | hexview2 bin\n    # bin mode is also available for hexview2\n```\n\nThis filter is **made for text input** that may contain non-ASCII characters.\nFor binary files, use a proper hex editor.\n\nYou can see the input and the hex values side-by-side.\nThe hex values are generated with the `hexview` filter.\n\n### (26) joinlines: Join the input lines with a separator\n\n[joinlines.fish](functions/joinlines.fish)\n\n```shell\n    $ cat text.txt\n    aaa\n    bbb\n    ccc\n\n    $ cat text.txt | joinlines\n    aaabbbccc\n\n    $ cat text.txt | joinlines \", \"\n    aaa, bbb, ccc\n```\n\n### (27) justify: Fully justify text to `\u003cwidth\u003e` [default: 78]\n\n[justify.fish](functions/justify.fish)\n\n```shell\n    $ cat lorem.txt\n    Lorem ipsum dolor sit amet consectetur adipisicing elit. Maxime mollitia,\n    molestiae quas vel sint commodi repudiandae consequuntur voluptatum laborum\n    numquam blanditiis harum quisquam eius sed odit fugiat iusto fuga praesentium\n    optio, eaque rerum!\n\n    $ cat lorem.txt | justify\n    Lorem  ipsum  dolor  sit  amet  consectetur adipisicing elit. Maxime mollitia,\n    molestiae  quas  vel  sint commodi repudiandae consequuntur voluptatum laborum\n    numquam  blanditiis harum quisquam eius sed odit fugiat iusto fuga praesentium\n    optio, eaque rerum!\n\n    $ cat lorem.txt | justify 50\n    Lorem ipsum dolor sit amet consectetur adipisicing\n    elit.  Maxime  mollitia,  molestiae  quas vel sint\n    commodi    repudiandae   consequuntur   voluptatum\n    laborum numquam blanditiis harum quisquam eius sed\n    odit  fugiat  iusto  fuga praesentium optio, eaque\n    rerum!\n```\n\n### (28) len: Length of a string\n\n[len.fish](functions/len.fish)\n\n```shell\n    $ echo \"hello\" | len\n    5\n```\n\n### (29) longest: Length of the longest line\n\n[longest.fish](functions/longest.fish)\n\n```shell\n    $ cat main.c | longest\n    22\n```\n\n### (30) lower: Convert to lowercase\n\n[lower.fish](functions/lower.fish)\n\n```shell\n    $ echo \"hEllO\" | lower\n    hello\n\n    $ echo \"hEllO\" | lower | upper\n    HELLO\n```\n\n### (31) max: Find the largest element [default type: int]\n\n[max.fish](functions/max.fish)\n\n```shell\n    $ cat file.txt\n    1\n    3\n    2\n\n    $ cat file.txt | max\n    3\n\n    $ cat numbers.txt\n    230.35\n    211.62\n    269.94\n    169.69\n    209.64\n    492.34\n    425.83\n\n    $ cat numbers.txt | max --float\n    492.34\n```\n\nWe suppose that there's one value per line in the input.\n\nYou can specify the data type of the input.\nSupported data types: `--int` (default), `--float` and `--str`.\n\n### (32) min: Find the smallest element [default type: int]\n\n[min.fish](functions/min.fish)\n\n```shell\n    $ cat file.txt\n    3\n    1\n    2\n\n    $ cat file.txt | min\n    1\n\n    $ cat numbers.txt\n    230.35\n    211.62\n    269.94\n    169.69\n    209.64\n    492.34\n    425.83\n\n    $ cat numbers.txt | min --float\n    169.69\n```\n\nWe suppose that there's one value per line in the input.\n\nYou can specify the data type of the input.\nSupported data types: `--int` (default), `--float` and `--str`.\n\n### (33) mirror: Mirror text using mirrored Unicode characters\n\n[mirror.fish](functions/mirror.fish)\n\n```shell\n    $ echo \"Fish shell\" | mirror\n    llɘʜƨ ʜƨiᖷ\n\n    $ echo \"Fish shell\" | mirror | unmirror\n    Fish shell\n```\n\nIt might be improved with https://www.flipyourtext.com/\n\n### (34) mixup: Mix up inner letters of each word, keeping first/last intact\n\n[mixup.fish](functions/mixup.fish)\n\n```shell\n    $ echo \"This is just a sentence.\" | mixup\n    Tihs is just a snetcnee.\n\n    $ cat fish.txt | mixup\n    Fish (feldirny iarncitetve shlel; syeilztd in lcworasee) is a Uinx-like slhel wtih a foucs\n    on icintiettravy and utilaisby. Fish is dngeised to be fatreue-rich by dfaulet,\n    reathr tahn highly clfrguoaibne, and does not ardehe to PISOX shlel sdartdans by desgin.\n```\n\nInterestingly, if you mix up the inner letters of words, but you keep the first\nand last letters intact, the text is still rather readable.\n\nThe readable version of the 2nd example is [here](https://en.wikipedia.org/wiki/Fish_%28Unix_shell%29).\n\n### (35) morse: Convert text to Morse code [e.g., 'SOS' -\u003e '... --- ...']\n\n[morse.fish](functions/morse.fish)\n\n```shell\n    $ echo \"SOS Titanic\" | morse\n    ... --- ... / - .. - .- -. .. -.-.\n\n    $ echo \"SOS Titanic\" | morse | unmorse\n    SOS TITANIC\n```\n\n* International Morse code: https://www.itu.int/rec/R-REC-M.1677-1-200910-I/\n* https://en.wikipedia.org/wiki/Morse_code\n\n### (36) noaccents: Remove accents [á -\u003e a, etc.]\n\n[noaccents.fish](functions/noaccents.fish)\n\n```shell\n    $ echo \"László\" | noaccents\n    Laszlo\n```\n\n### (37) nonempty: Remove empty lines\n\n[nonempty.fish](functions/nonempty.fish)\n\n```shell\n    $ cat main.c\n    #include \u003cstdio.h\u003e\n\n    int main()\n    {\n        printf(\"hello\\n\");\n\n        return 0;\n    }\n\n    $ cat main.c | nonempty\n    #include \u003cstdio.h\u003e\n    int main()\n    {\n        printf(\"hello\\n\");\n        return 0;\n    }\n```\n\n### (38) obfuscate: Replace letters with similar-looking symbols [e -\u003e 3, a -\u003e @, etc.]\n\n[obfuscate.fish](functions/obfuscate.fish)\n\n```shell\n    $ echo \"This is just a sentence.\" | obfuscate\n    7h1$ 1$ ju$7 @ $3n73nc3.\n```\n\n### (39) oct: Decimal number to octal\n\n[oct.fish](functions/oct.fish)\n\n```shell\n    $ echo 2025 | oct\n    0o3751\n\n    $ echo 2025 | oct | unoct\n    2025\n```\n\n### (40) p.allext: Path [/usr/lib/a.tar.gz -\u003e .tar.gz]\n\n[p.allext.fish](functions/p.allext.fish)\n\n```shell\n    $ echo /usr/lib/python2.5/stuff.tar.gz | p.allext\n    .tar.gz\n```\n\n### (41) p.ext: Path [/usr/lib/a.tar.gz -\u003e .gz]\n\n[p.ext.fish](functions/p.ext.fish)\n\n```shell\n    $ echo /usr/lib/python2.5/stuff.tar.gz | p.ext\n    .gz\n```\n\n### (42) p.fname: Path [/usr/lib/stuff.tar.gz -\u003e stuff]\n\n[p.fname.fish](functions/p.fname.fish)\n\n```shell\n    $ echo /usr/lib/python2.5/stuff.tar.gz | p.fname\n    stuff\n```\n\n### (43) p.name: Path [/usr/lib/python2.5/gopherlib.py -\u003e gopherlib.py]\n\n[p.name.fish](functions/p.name.fish)\n\n```shell\n    $ echo /usr/lib/python2.5/stuff.tar.gz | p.name\n    stuff.tar.gz\n```\n\n### (44) p.parent: Path [/usr/lib/python2.5/gopherlib.py -\u003e /usr/lib/python2.5]\n\n[p.parent.fish](functions/p.parent.fish)\n\n```shell\n    $ echo /usr/lib/python2.5/stuff.tar.gz | p.parent\n    /usr/lib/python2.5\n```\n\n### (45) p.stem: Path [/usr/lib/python2.5/gopherlib.py -\u003e gopherlib]\n\n[p.stem.fish](functions/p.stem.fish)\n\n```shell\n    $ echo /usr/lib/python2.5/stuff.tar.gz | p.stem\n    stuff.tar\n```\n\n### (46) prettyjson: Pretty-print JSON\n\n[prettyjson.fish](functions/prettyjson.fish)\n\n```shell\n    $ cat example.json\n    { \"title\": \"Hackers\", \"year\": 1995 }\n\n    $ cat example.json | prettyjson\n    # the output is shown with `bat`\n\n    $ cat example.json | prettyjson cat\n    {\n        \"title\": \"Hackers\",\n        \"year\": 1995\n    }\n    # the output is shown with `cat`\n```\n\nBy default it wants to use the command `bat` (make sure that it's installed).\nIf you don't have `bat`, you can also use `cat`.\nHere is a [screenshot](https://i.imgur.com/W93WyiO.png) of the difference.\n\n### (47) prettynum: Prettify a number\n\n[prettynum.fish](functions/prettynum.fish)\n\n```shell\n    $ echo 12345679 | prettynum\n    12,345,679\n\n    $ echo 12345679 | prettynum '_'\n    12_345_679\n```\n\n### (48) prod: Product of the values in the input\n\n[prod.fish](functions/prod.fish)\n\n```shell\n    $ cat file.txt\n    3\n    5\n    2\n\n    $ cat file.txt | prod\n    30\n\n    $ cat numbers.txt\n    230.35\n    211.62\n    269.94\n\n    $ cat numbers.txt | prod --float\n    13158675.28998\n```\n\nWe suppose that there's one value per line in the input.\n\nYou can specify the data type of the input.\nSupported data types: `--int` (default) and `--float`.\n\n### (49) qrcode: Generate a QR code from text [ANSI]\n\n[qrcode.fish](functions/qrcode.fish)\n\n```shell\n    $ echo \"https://fishshell.com/\" | qrcode\n```\n\nIt requires the `qrencode` package (`yay -S qrencode`).\nThe QR code is shown in the terminal (see [screenshot](https://i.imgur.com/WaWTdmG.png)).\n\n### (50) qrcode2: Generate a QR code from text [PNG]\n\n[qrcode2.fish](functions/qrcode2.fish)\n\n```shell\n    $ echo \"https://fishshell.com/\" | qrcode2\n```\n\nIt requires the `qrencode` package (`yay -S qrencode`).\nThe QR code is saved as a PNG and opened automatically with the default image viewer\n(see [screenshot](https://i.imgur.com/DrFVW2i.png)).\n\n### (51) quote: Create GET-style quoted text\n\n[quote.fish](functions/quote.fish)\n\n```shell\n    $ echo \"largest prime below 1 million\" | quote\n    largest+prime+below+1+million\n\n    $ echo \"largest prime below 1 million\" | quote | unquote\n    largest prime below 1 million\n```\n\n### (52) quotes: Add quotes around the input\n\n[quotes.fish](functions/quotes.fish)\n\n```shell\n    $ echo \"hello\"\n    hello\n\n    $ echo \"hello\" | quotes\n    'hello'\n```\n\nPuts the input among quotes, making the beginning and the end of the input clearly visible.\n\n### (53) randomcase: Alternate case randomly\n\n[randomcase.fish](functions/randomcase.fish)\n\n```shell\n    $ echo \"Hello World\" | randomcase\n    heLLo woRLd\n\n    $ echo \"Hello World\" | randomcase\n    HEllo WorLD\n```\n\n### (54) randomline: Select a non-empty random line from input\n\n[randomline.fish](functions/randomline.fish)\n\n```shell\n    $ cat 123.txt\n    one\n    two\n    three\n\n    $ cat 123.txt | randomline\n    two\n\n    $ cat 123.txt | randomline\n    one\n```\n\n### (55) removeprefix: Remove prefix\n\n[removeprefix.fish](functions/removeprefix.fish)\n\n```shell\n    $ cat main.py\n    # x = 1\n    # y = 2\n\n    $ cat main.py | removeprefix \"# \"\n    x = 1\n    y = 2\n```\n\n### (56) removesuffix: Remove suffix\n\n[removesuffix.fish](functions/removesuffix.fish)\n\n```shell\n    $ cat main.py\n    x = 1 # variable\n    y = 2 # variable\n\n    $ cat main.py | removesuffix \" # variable\"\n    x = 1\n    y = 2\n```\n\n### (57) repeat: Repeat a text `\u003cn\u003e` times\n\n[repeat.fish](functions/repeat.fish)\n\n```shell\n    $ echo \"*\" | repeat 5\n    *****\n```\n\n### (58) replace: Replace `\u003cold\u003e` with `\u003cnew\u003e`\n\n[replace.fish](functions/replace.fish)\n\n```shell\n    $ echo \"cat dog cat cat\" | replace cat kitten\n    kitten dog kitten kitten\n```\n\n### (59) reverse: Reverse a string\n\n[reverse.fish](functions/reverse.fish)\n\n```shell\n    $ echo \"hello\" | reverse\n    olleh\n\n    $ echo \"hello\" | reverse | reverse\n    hello\n```\n\nIf you pass it the content of a text file, it reads the whole content of the\nfile and reverses the whole content.\n\nIf you want to reverse a file line-by-line, use the `rev` command from the `util-linux` package:\n\n```shell\n    $ cat book.txt | rev\n```\n\n### (60) roman: Convert number to Roman numeral [1-3999]\n\n[roman.fish](functions/roman.fish)\n\n```shell\n    $ echo 2025 | roman\n    MMXXV\n\n    $ echo 2025 | roman | unroman\n    2025\n```\n\n### (61) rot: Rotate letters with with `\u003cn\u003e` positions\n\n[rot.fish](functions/rot.fish)\n\n```shell\n    $ echo \"Fish\" | rot 2\n    Hkuj\n\n    $ echo \"Fish\" | rot -2\n    Dgqf\n\n    $ echo \"Fish\" | rot 2 | rot -2\n    Fish\n\n    $ echo \"Fish\" | rot 13\n    Svfu\n\n    $ echo \"Fish\" | rot 13 | rot13\n    Fish\n```\n\n[Caesar's code.](https://en.wikipedia.org/wiki/Caesar_cipher) Letters of the English\nalphabet are rotated by `n` positions. `n` can be negative too, in which case letters\nare rotated left.\n\n[ROT13](https://en.wikipedia.org/wiki/ROT13) is a special case of the Caesar cipher.\n\n### (62) shuffle: Shuffle characters in each line\n\n[shuffle.fish](functions/shuffle.fish)\n\n```shell\n    $ echo \"12345678\" | shuffle\n    14857362\n\n    $ echo \"12345678\" | shuffle\n    12563487\n```\n\n### (63) skip: Skip the first `\u003cn\u003e` lines of stdin, or skip the last line if `last` is provided\n\n[skip.fish](functions/skip.fish)\n\n```shell\n    $ seq 5\n    1\n    2\n    3\n    4\n    5\n\n    $ seq 5 | skip 2\n    3\n    4\n    5\n\n    $ seq 5 | skip last\n    1\n    2\n    3\n    4\n```\n\nSkips the first `n` lines of stdin.\n\nIf `last` is provided, then it skips the last line.\n\n### (64) sparkline: Generate sparkline chart from numbers\n\n[sparkline.fish](functions/sparkline.fish)\n\n```shell\n    $ echo \"15 8 23 17 42 8 35 27\" | sparkline\n    ▂▁▅▃█▁▇▆\n```\n\n### (65) sum: Sum of the values in the input\n\n[sum.fish](functions/sum.fish)\n\n```shell\n    $ cat file.txt\n    3\n    1\n    2\n\n    $ cat file.txt | sum\n    6\n\n    $ cat numbers.txt\n    230.35\n    211.62\n    269.94\n    169.69\n    209.64\n    492.34\n    425.83\n\n    $ cat numbers.txt | sum --float\n    2009.41\n```\n\n`sum` is an existing program in the `coreutils` package. If you need that,\nthen give this function a different name.\n\nWe suppose that there's one value per line in the input.\n\nYou can specify the data type of the input.\nSupported data types: `--int` (default) and `--float`.\n\n### (66) swapcase: Swap lower- and uppercase\n\n[swapcase.fish](functions/swapcase.fish)\n\n```shell\n    $ echo \"Hello World\" | swapcase\n    hELLO wORLD\n```\n\n### (67) take: Take the first `\u003cn\u003e` lines of stdin, or take the last line if `last` is provided\n\n[take.fish](functions/take.fish)\n\n```shell\n    $ seq 5\n    1\n    2\n    3\n    4\n    5\n\n    $ seq 5 | take 3\n    1\n    2\n    3\n\n    $ seq 5 | take last\n    5\n```\n\nTake the first `n` lines of the standard input.\n\nIf `last` is provided, then take the last line.\n\n### (68) tiny: Convert text to tiny superscript letters\n\n[tiny.fish](functions/tiny.fish)\n\n```shell\n    $ echo \"Fish shell\" | tiny\n    ᶠⁱˢʰ ˢʰᵉˡˡ\n\n    $ echo \"Fish shell\" | tiny | untiny\n    FiSh Shell\n```\n\nConversion from tiny to normal is not perfect due to some Unicode limitations.\n\n### (69) title: Convert to title case\n\n[title.fish](functions/title.fish)\n\n```shell\n    $ echo \"hello world\" | title\n    Hello World\n```\n\n### (70) trim: Trim leading/trailing whitespace\n\n[trim.fish](functions/trim.fish)\n\n```shell\n    $ echo \"     aa bb    \" | trim\n    aa bb\n\n    $ echo \"     aa bb    \" | trim | len\n    5\n```\n\n### (71) typewriter: Print like a typewriter\n\n[typewriter.fish](functions/typewriter.fish)\n\n```shell\n    $ cat main.c | typewriter\n    #include \u003cstdio.h\u003e\n\n    int main...\n```\n\nThe content of the file is printed character by character,\nwith some delay, similarly to a typewriter.\n\n### (72) typewriter2: Print like a typewriter with sound effects\n\n[typewriter2.fish](functions/typewriter2.fish)\n\n```shell\n    $ cat main.c | typewriter2\n    #include \u003cstdio.h\u003e\n\n    int main...\n```\n\nThe content of the file is printed character by character,\nwith some delay. This version adds clicky sounds to\neach character, making it similar to typing on a keyboard.\n\nThe sound files are played with `mplayer` (make sure it's installed).\nYou can download some sound file packs from here: https://github.com/jabbalaci/keysound/tree/main/sounds .\nThis one uses the `fallout` sound pack.\n\n### (73) unbin: Binary number to decimal\n\n[unbin.fish](functions/unbin.fish)\n\n```shell\n    $ echo 1110 | unbin\n    14\n\n    $ echo 1110 | unbin | bin\n    0b1110\n```\n\n### (74) unflip: Revert upside-down Unicode text back to normal\n\n[unflip.fish](functions/unflip.fish)\n\n```shell\n    $ echo \"ʃʃǝɥs ɥsᴉℲ\" | unflip\n    Fish shell\n\n    $ echo \"ʃʃǝɥs ɥsᴉℲ\" | unflip | flip\n    ʃʃǝɥs ɥsᴉℲ\n```\n\n### (75) unhex: Hex number to decimal\n\n[unhex.fish](functions/unhex.fish)\n\n```shell\n    $ echo ff | unhex\n    255\n\n    $ echo ff | unhex | hex\n    0xff\n```\n\n### (76) unmirror: Convert mirrored text back to normal\n\n[unmirror.fish](functions/unmirror.fish)\n\n```shell\n    $ echo \"llɘʜƨ ʜƨiᖷ\" | unmirror\n    Fish shell\n\n    $ echo \"llɘʜƨ ʜƨiᖷ\" | unmirror | mirror\n    llɘʜƨ ʜƨiᖷ\n```\n\nIt might be improved with https://www.flipyourtext.com/\n\n### (77) unmorse: Convert Morse code to text [e.g., '... --- ...' -\u003e 'SOS']\n\n[unmorse.fish](functions/unmorse.fish)\n\n```shell\n    $ echo \"- .. - .- -. .. -.-.\" | unmorse\n    TITANIC\n\n    $ echo \"- .. - .- -. .. -.-.\" | unmorse | morse\n    - .. - .- -. .. -.-.\n```\n\n* International Morse code: https://www.itu.int/rec/R-REC-M.1677-1-200910-I/\n* https://en.wikipedia.org/wiki/Morse_code\n\n### (78) unoct: Octal number to decimal\n\n[unoct.fish](functions/unoct.fish)\n\n```shell\n    $ echo 755 | unoct\n    493\n\n    $ echo 755 | unoct | oct\n    0o755\n```\n\n### (79) unquote: Decode GET-style quoted text\n\n[unquote.fish](functions/unquote.fish)\n\n```shell\n    $ echo \"largest+prime+below+1+million\" | unquote\n    largest prime below 1 million\n\n    $ echo \"largest+prime+below+1+million\" | unquote | quote\n    largest+prime+below+1+million\n```\n\n### (80) unroman: Convert Roman numeral to number\n\n[unroman.fish](functions/unroman.fish)\n\n```shell\n    $ echo MMXXV | unroman\n    2025\n\n    $ echo MMXXV | unroman | roman\n    MMXXV\n```\n\n### (81) untiny: Convert tiny superscript letters back to normal text [not perfect]\n\n[untiny.fish](functions/untiny.fish)\n\n```shell\n    $ echo \"ᶠⁱˢʰ ˢʰᵉˡˡ\" | untiny\n    FiSh Shell\n\n    $ echo \"ᶠⁱˢʰ ˢʰᵉˡˡ\" | untiny | tiny\n    ᶠⁱˢʰ ˢʰᵉˡˡ\n```\n\nConversion from tiny to normal is not perfect due to some Unicode limitations.\n\n### (82) unutf8: Decode the input with UTF-8\n\n[unutf8.fish](functions/unutf8.fish)\n\n```shell\n    $ echo \"\\xc3\\x89\\x76\\x61\" | unutf8\n    Éva\n\n    $ echo \"\\xc3\\x89\\x76\\x61\" | unutf8 | utf8\n    \\xc3\\x89\\x76\\x61\\x0a\n    # where \\x0a is the newline character ('\\n')\n```\n\nDecode a UTF-8-encoded byte array.\n\n### (83) upper: Convert to uppercase\n\n[upper.fish](functions/upper.fish)\n\n```shell\n    $ echo \"hEllO\" | upper\n    HELLO\n\n    $ echo \"hEllO\" | upper | lower\n    hello\n```\n\n### (84) urldecode: URL-decode input\n\n[urldecode.fish](functions/urldecode.fish)\n\n```shell\n    $ echo \"https%3A//en.wikipedia.org/wiki/C_%28programming_language%29\" | urldecode\n    https://en.wikipedia.org/wiki/C_(programming_language)\n\n    $ echo \"https%3A//en.wikipedia.org/wiki/C_%28programming_language%29\" | urldecode | urlencode\n    https%3A//en.wikipedia.org/wiki/C_%28programming_language%29\n```\n\n### (85) urlencode: URL-encode input\n\n[urlencode.fish](functions/urlencode.fish)\n\n```shell\n    $ echo \"https://en.wikipedia.org/wiki/C_(programming_language)\" | urlencode\n    https%3A//en.wikipedia.org/wiki/C_%28programming_language%29\n\n    $ echo \"https://en.wikipedia.org/wiki/C_(programming_language)\" | urlencode | urldecode\n    https://en.wikipedia.org/wiki/C_(programming_language)\n```\n\n### (86) utf8: Encode the input with UTF-8\n\n[utf8.fish](functions/utf8.fish)\n\n```shell\n    $ echo -n \"Éva\" | utf8\n    \\xc3\\x89\\x76\\x61\n\n    $ echo -n \"Éva\" | utf8 | unutf8\n    Éva\n```\n\nEncode the input to a UTF-8-encoded byte array.\n\n### (87) whitespaces: Show whitespaces\n\n[whitespaces.fish](functions/whitespaces.fish)\n\n```shell\n    $ cat Makefile\n    cat:\n            cat Makefile\n\n    $ cat Makefile | whitespaces\n    cat:␤\n    ⭾cat␣Makefile␤\n```\n\nTab, newline, carriage return and space characters are made visible with Unicode characters.\n\n### (88) wolfram: Ask Wolfram Alpha\n\n[wolfram.fish](functions/wolfram.fish)\n\n```shell\n    $ echo \"largest prime below 1 million\" | wolfram\n    999983\n\n    $ echo \"Is 31 a prime?\" | wolfram\n    yes\n```\n\nYou need an API key for this (it's free).\nAPI docs: https://products.wolframalpha.com/short-answers-api/documentation\n\n### (89) words: Split input into words\n\n[words.fish](functions/words.fish)\n\n```shell\n    $ cat file.txt\n    aa      bb     cc\n    dd\n\n    $ cat file.txt | words\n    aa\n    bb\n    cc\n    dd\n```\n\nEach word is printed on a separate line.\n\n### (90) zalgo1: Add funny accents to characters [a -\u003e ấ, etc.]\n\n[zalgo1.fish](functions/zalgo1.fish)\n\n```shell\n    $ echo \"Fish shell\" | zalgo1\n    Fǐśħ śĥéŀĺ\n\n    $ echo \"Fish shell\" | zalgo2\n    F̌i̖s̕ȟ ͎sͅhel̬l͜\n\n    $ echo \"Fish shell\" | zalgo3\n    F̪̘҄҃̚i̗̙̖ͨs̱̰ͮ҄҉̚̚h̋̈͐҈̙̗҅ š̖̙ͫ͢h̜̱̘̀҃e͈̠̐҅҉̘l̵̘̃̉҄l͓̘̘\n```\n\nIt adds glitchy characters to the text.\n\n* zalgo1: light\n* zalgo2: medium\n* zalgo3: aggressive\n\n### (91) zalgo2: Add random Unicode glitches to text\n\n[zalgo2.fish](functions/zalgo2.fish)\n\n```shell\n    $ echo \"Fish shell\" | zalgo1\n    Fǐśħ śĥéŀĺ\n\n    $ echo \"Fish shell\" | zalgo2\n    F̌i̖s̕ȟ ͎sͅhel̬l͜\n\n    $ echo \"Fish shell\" | zalgo3\n    F̪̘҄҃̚i̗̙̖ͨs̱̰ͮ҄҉̚̚h̋̈͐҈̙̗҅ š̖̙ͫ͢h̜̱̘̀҃e͈̠̐҅҉̘l̵̘̃̉҄l͓̘̘\n```\n\nIt adds glitchy characters to the text.\n\n* zalgo1: light\n* zalgo2: medium\n* zalgo3: aggressive\n\n### (92) zalgo3: Add Zalgo (glitchy) characters\n\n[zalgo3.fish](functions/zalgo3.fish)\n\n```shell\n    $ echo \"Fish shell\" | zalgo1\n    Fǐśħ śĥéŀĺ\n\n    $ echo \"Fish shell\" | zalgo2\n    F̌i̖s̕ȟ ͎sͅhel̬l͜\n\n    $ echo \"Fish shell\" | zalgo3\n    F̪̘҄҃̚i̗̙̖ͨs̱̰ͮ҄҉̚̚h̋̈͐҈̙̗҅ š̖̙ͫ͢h̜̱̘̀҃e͈̠̐҅҉̘l̵̘̃̉҄l͓̘̘\n```\n\nIt adds glitchy characters to the text.\n\n* zalgo1: light\n* zalgo2: medium\n* zalgo3: aggressive\n\n\u003c!-- END: filters --\u003e\n\n## Functions\n\nSome of my functions (that are NOT filters) in\nalphabetical order:\n\n\u003c!-- START: functions --\u003e\n\n### (1) alphabet: Print the alphabet (lowercase, uppercase, digits, printable characters)\n\n[alphabet.fish](functions/alphabet.fish)\n\n```text\n    $ alphabet\n    abcdefghijklmnopqrstuvwxyz\n    ABCDEFGHIJKLMNOPQRSTUVWXYZ\n    abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n    !\\\"#$%\u0026'()*+,-./:;\u003c=\u003e?@[\\]^_`{|}~\n    0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\\"#$%\u0026'()*+,-./:;\u003c=\u003e?@[\\]^_`{|}~\n```\n\nIt prints the alphabet (lowercase, uppercase letters), digits and printable characters.\n\n### (2) aur: Find package in the AUR repository\n\n[aur.fish](functions/aur.fish)\n\n```shell\n    $ aur edit\n    # find the package 'edit' in the AUR repo\n```\n\nFind the given package in the AUR repository. It performs an \"exact name\" search.\n\n### (3) awk-info: Basic usage of the awk command\n\n[awk-info.fish](functions/awk-info.fish)\n\n```shell\n    $ awk-info\n    # print some info about its basic usage\n```\n\n### (4) bak: Create a backup file\n\n[bak.fish](functions/bak.fish)\n\n```shell\n    $ ls\n    file.txt\n\n    $ bak file.txt\n\n    $ ls\n    file.txt\n    file.txt.bak\n```\n\nMakes a copy of a file with `.bak` extension.\n\n### (5) beep: Play a beep sound\n\n[beep.fish](functions/beep.fish)\n\n```shell\n    $ slow_command; beep\n    # plays a beep sound\n```\n\nPlays a beep sound. Useful to notify you when a slow program finishes.\n\n### (6) binds: Some useful keyboard bindings in Fish\n\n[binds.fish](functions/binds.fish)\n\n```shell\n    $ binds\n    # list some useful keyboard bindings\n```\n\nJust a reminder for me. I tend to forget these goodies.\n\n### (7) bing: Extract the URL of the wallpaper image on bing.com\n\n[bing.fish](functions/bing.fish)\n\n```shell\n    $ bing\n    https://www.bing.com/th?id=OHR.HoneyBeeLavender_ROW6706348405_tmb.jpg\n\n    $ bing open\n    https://www.bing.com/th?id=OHR.HoneyBeeLavender_ROW6706348405_tmb.jpg\n    # and it also opens the image with the default image viewer\n```\n\nIt extracts the URL of the wallpaper photo on bing.com .\nSometimes it doesn't produce any output. Then try again :)\n\n### (8) bm: Bookmark a file (for copy/paste)\n\n[bm.fish](functions/bm.fish)\n\n```shell\n    $ pwd\n    /tmp/send\n\n    $ bm -c file.txt\n    Bookmarked: /tmp/send/file.txt\n\n    $ bm -l\n    Bookmarked file: /tmp/send/file.txt\n\n    $ cd\n    $ pwd\n    /home/jabba\n\n    $ bm -p\n    copy: '/tmp/send/file.txt' -\u003e './file.txt'\n\n    $ bm -l\n    Bookmarked file: /tmp/send/file.txt\n\n    $ bm -e\n    Bookmark cleared.\n```\n\n```\nUsage:\n  bm -c \u003cfile\u003e   : Bookmark file\n  bm -p          : Paste bookmarked file here\n  bm -l          : List bookmarked file\n  bm -e          : Erase bookmark\n```\n\nYou can mark (bookmark) a file. Then, move around\nfolders and paste the file in a destination folder.\nIt also works among sessions.\n\n### (9) char: Detailed information about a character\n\n[char.fish](functions/char.fish)\n\n```shell\n    $ char -h\n    -h, --help      This help\n    --dec 65        Unicode code point as decimal number (here: 'A')\n    --hex 41        Unicode code point as hex. number (here: 0x41 = 65, which is 'A')\n    --char á        Provide the character (here: 'á')\n\n    $ char\n    Char: á\n    ===\n    ## Basic Information\n    Character:                    'á'\n    Unicode code point (dec):     225\n    Unicode code point (hex):     U+00E1\n    In binary:                    1110 0001\n    Unicode name:                 LATIN SMALL LETTER A WITH ACUTE\n    Category:                     Ll (Lowercase Letter)\n\n    ## Case \u0026 Transformation\n    Uppercase:                    'Á' (U+00C1)\n    Lowercase:                    'á' (U+00E1)\n\n    ## Encoding Information\n    UTF-8:                        b'\\xc3\\xa1' (2 bytes)\n    UTF-8 binary:                 1100 0011  1010 0001\n    URL encode:                   %C3%A1\n\n    ## Normalization Forms\n    Decomposition info (NFD):     'á' = (U+0061 (LATIN SMALL LETTER A) + U+0301 (COMBINING ACUTE ACCENT))\n\n    ## Web \u0026 Markup\n    HTML entity:                  \u0026aacute;\n    HTML numeric:                 \u0026#225; or \u0026#x00E1;\n    JSON escape:                  \\u00e1\n\n    $ char\n    Char: helló\n    ===\n    Error: provide a single character\n    It contains 5 characters.\n    NFKC decomposition: helló (U+0068 0065 006C 006C 00F3)\n```\n\nEverything you wanted to know about a character :)\n\nIf some info is missing, let me know.\n\n### (10) cop: Copy a file interactively\n\n[cop.fish](functions/cop.fish)\n\n```shell\n    $ cop main.c\n    Copy's name: main.c\n    # you can edit the file's name (move the cursor, delete a char, etc.)\n```\n\nIt allows you to copy a file interactively.\n\n### (11) crepl: Start the C REPL\n\n[crepl.fish](functions/crepl.fish)\n\n```shell\n    $ crepl\n    C REPL v0.0.2 by Jabba Laci (jabba.laci@gmail.com), 2025\n    \u003e\u003e\u003e\n```\n\nIt starts my interactive C REPL. The project can be found here: https://github.com/jabbalaci/c-repl\n\n### (12) ct: Start CudaText\n\n[ct.fish](functions/ct.fish)\n\nStart cudatext (text editor) in the background.\n\nUnder Manjaro, it's in the package `cudatext-qt5-bin`.\n\n### (13) cut-info: Basic usage of the cut command\n\n[cut-info.fish](functions/cut-info.fish)\n\n```shell\n    $ cut-info\n    # print some info about its basic usage\n```\n\n### (14) dname: Print just the current directory name\n\n[dname.fish](functions/dname.fish)\n\n```shell\n    $ pwd\n    /home/jabba/.config/fish\n\n    $ dname\n    fish\n```\n\n### (15) dos-greeting: Classical DOS starting screen\n\n[dos-greeting.fish](functions/dos-greeting.fish)\n\n```shell\n    $ dos-greeting\n    Starting MS-DOS...\n\n    HIMEM is testing extended memory...done.\n```\n\nFor fun. Tip: combine it with `dos-prompt`.\n\n### (16) dos-prompt: Activate the DOS prompt\n\n[dos-prompt.fish](functions/dos-prompt.fish)\n\n```shell\n    $ pwd\n    /home/jabba\n\n    $ dos-prompt\n    C:\\Users\\jabba\u003e\n```\n\nIt changes the prompt to a DOS-style prompt. Tip: combine it with `dos-greeting`.\n\n### (17) edit2: Edit two files side by side\n\n[edit2.fish](functions/edit2.fish)\n\n```shell\n    $ edit2 file1 file2\n    # opens both files in a text editor side by side\n```\n\nIt opens the two files with the [micro](https://micro-editor.github.io/)\ntext editor (my favourite) side by side.\n\nSame thing with vim: `vim -O file1 file2`\n\n### (18) edits: Print editing possibilities\n\n[edits.fish](functions/edits.fish)\n\n```shell\n    $ edits\n    # prints some help about the editing possibilities\n```\n\nIt just prints a text that sums up my aliases / functions\nused for editing. How to edit `config.sh`, aliases, etc.\n\n### (19) ef: Edit the given function\n\n[ef.fish](functions/ef.fish)\n\n```shell\n    $ ef upper\n    # opens upper.fish in your text editor\n\n    $ ef upper.fish\n    # using the .fish extension is optional\n```\n\n**e**dit a **f**unction from anywhere\n\n### (20) efs: Edit the given function's corresponding script\n\n[efs.fish](functions/efs.fish)\n\n```shell\n    $ efs char\n    # opens ~/.config/fish/myscripts/char.py in a text editor\n```\n\n**e**dit **f**unction's **s**cript\n\nSometimes, a function is just a wrapper (launcher) for a script.\nFor instance, `~/.config/fish/functions/char.fish` calls `~/.config/fish/myscripts/char.py`.\nWith `efs char`, you can edit `char.py`.\n\n### (21) epair: Edit the given function and its pair (ex.: hex and unhex)\n\n[epair.fish](functions/epair.fish)\n\n```shell\n    $ epair bin\n    # opens bin.fish and unbin.fish in your text editor\n\n    $ epair unbin\n    # opens unbin.fish and bin.fish in your text editor\n```\n\n**e**dit a **pair** of functions from anywhere\n\nIf a function has an un*.fish pair, then you can edit both of them\nin your text editor side by side. The `micro` text editor is used by default.\n\n### (22) ex: Universal archive extractor\n\n[ex.fish](functions/ex.fish)\n\n```shell\n    $ ex file.zip\n    # extracts the archive\n```\n\nA universal solution for extracting any archive.\n\n### (23) exit_code: Produce the given exit code\n\n[exit_code.fish](functions/exit_code.fish)\n\n```shell\n    $ exit_code 3\n    $ echo $status\n    3\n```\n\nProduce the given exit code. For testing purposes.\n\n### (24) feh-slideshow: Start a slideshow with feh\n\n[feh-slideshow.fish](functions/feh-slideshow.fish)\n\n```shell\n    $ feh-slideshow\n    # start slideshow in the current directory\n```\n\nMeaning of the options:\n\n* `-D 5`:          5 sec. delay\n* `-F`:            fullscreen\n* `-Z`:            auto-zoom images to fit screen\n\n### (25) filters: My filters\n\n[filters.fish](functions/filters.fish)\n\n```shell\n    $ filters\n    # prints my filters\n```\n\nIt just prints a list of my filters.\nThe filters are organized into categories.\nI must update this list manually.\n\n### (26) find_conflicted_copies: Find conflicted copies in your Dropbox folder\n\n[find_conflicted_copies.fish](functions/find_conflicted_copies.fish)\n\n```shell\n    $ find_conflicted_copies\n    ./.git/index (jabba-logic's conflicted copy 2025-05-27)\n    ...\n```\n\nThe Dropbox client sometimes produces conflicted copies.\nThis function lists them.\n\n### (27) fish_command_not_found: Ubuntu-like suggestion when a command is not found\n\n[fish_command_not_found.fish](functions/fish_command_not_found.fish)\n\n```shell\n    $ mc\n    fish: Unknown command: mc\n    extra/mc\n```\n\nProvides an Ubuntu-like suggestion when a command is not found.\n\n### (28) fish_greeting: Default greeting message\n\n[fish_greeting.fish](functions/fish_greeting.fish)\n\nWhen you open a new terminal / tab, this function is called automatically.\nWith this you can print some greeting message before the first prompt.\n\nIf this function doesn't print anything on the screen, then there's no\ngreeting message. If you want to disable messages, just leave its body empty.\n\n### (29) fish_prompt: Jabba's prompt\n\n[fish_prompt.fish](functions/fish_prompt.fish)\n\nThis function provides the prompt before the cursor.\nEdit it to create your own cool prompt.\n\n### (30) function-descriptions: Functions and their descriptions\n\n[function-descriptions.fish](functions/function-descriptions.fish)\n\n```shell\n    $ function-descriptions\n    * addprefix                     - Add prefix to every line (filter)\n    * addsuffix                     - Add suffix to every line (filter)\n    ...\n```\n\nList functions with their descriptions.\n\nHere I wanted the list of \"real\" functions, without aliases.\nIn Fish, aliases are turned into functions behind the scenes. So I wanted to filter them out.\n\n* A: function names (with aliases)\n* B: aliases\n* Print A\\B (difference)\n\n### (31) get-function-description: Print the description of a function\n\n[get-function-description.fish](functions/get-function-description.fish)\n\n```shell\n    $ get-function-description upper\n    Convert to uppercase (filter)\n```\n\nPrints the description of the given function.\n\n### (32) gitup: Upload local changes to the git repo\n\n[gitup.fish](functions/gitup.fish)\n\n```shell\n    $ gitup\n    # uploads local changes to the git repo\n```\n\nUploads local changes to the git repo.\n\nThe process is broken down into 3 steps: add, commit, push.\nThe process can be terminated at any time.\n\n### (33) good_shape_manjaro: Update the list of mirror servers, find the fastest ones\n\n[good_shape_manjaro.fish](functions/good_shape_manjaro.fish)\n\n```shell\n    $ good_shape_manjaro\n    # updates mirror servers\n```\n\nOn Manjaro Linux, it updates the list of mirror servers and sorts them by response time.\n\nIt only checks mirror servers of your continent.\n\n### (34) gpu-info: GPU info\n\n[gpu-info.fish](functions/gpu-info.fish)\n\n```shell\n    $ gpu-info\n    # inxi -G\n    Graphics:\n      Device-1: Intel CometLake-S GT2 [UHD Graphics 630] driver: i915 v: kernel\n      Display: x11 server: X.Org v: 21.1.16 driver: X: loaded: modesetting\n        dri: iris gpu: i915 resolution: N/A\n      API: Vulkan v: 1.4.313 drivers: intel surfaces: N/A\n      API: OpenGL Message: Unable to show GL data. glxinfo is missing.\n      Info: Tools: api: vulkaninfo de: xfce4-display-settings\n        x11: xdpyinfo, xprop, xrandr\n```\n\nPrints info about your GPU.\n\n### (35) hxd: Start HxD\n\n[hxd.fish](functions/hxd.fish)\n\nHxD is an excellent hex editor. This is a Windows software,\navailable at https://mh-nexus.de/en/hxd/ . If you know a better\nLinux alternative, let me know. We start it with wine.\n\n### (36) isodate: Print date in YYYY-MM-DD format\n\n[isodate.fish](functions/isodate.fish)\n\n```shell\n    $ isodate\n    2025-05-21\n```\n\nPrints date in YYYY-MM-DD format.\n\nFun fact: in Hungary we use this format.\nWe're going from the big picture towards the details, not vice versa.\n\n### (37) isodatetime: Print timestamp in YYYY-MM-DDTHH:MM:SS format\n\n[isodatetime.fish](functions/isodatetime.fish)\n\n```shell\n    $ isodatetime\n    2025-05-21T13:57:28\n```\n\nCan be used as a timestamp.\n\n### (38) jive: Start the JiVE image viewer\n\n[jive.fish](functions/jive.fish)\n\n```shell\n    $ jive\n    # starts my JiVE image viewer\n```\n\nJiVE is an image viewer with some built-in NSFW support...\n\nThe project can be found here: https://github.com/jabbalaci/JiVE-Image-Viewer\n\n### (39) json: Print key/value pairs in a JSON file\n\n[json.fish](functions/json.fish)\n\n```shell\n    $ cat person.json\n    {\n        \"last\": \"Doe\",\n        \"first\": \"John\",\n        \"daughter\": {\n            \"last\": \"Doe\",\n            \"first\": \"Jane\"\n        }\n    }\n\n    $ json person.json\n    root['last'] =\u003e 'Doe'\n    root['first'] =\u003e 'John'\n    root['daughter']['last'] =\u003e 'Doe'\n    root['daughter']['first'] =\u003e 'Jane'\n```\n\nThe project can be found here: https://github.com/jabbalaci/JSON-path\n\n### (40) kpx: Start keepassxc\n\n[kpx.fish](functions/kpx.fish)\n\n```shell\n    $ kpx\n    # starts keepassxc\n```\n\nThis is a launcher for keepassxc.\n\n[KeePassXC](https://keepassxc.org/) is an excellent, cross-platform password manager.\n\n### (41) machine_id: Print the machine ID\n\n[machine_id.fish](functions/machine_id.fish)\n\n```shell\n    $ machine_id\n    i9-uni-office\n```\n\nI store a lot of things in Dropbox, thus I have the same environment on all my machines.\nHowever, sometimes a program should behave differently on a specific machine.\nI came up with the idea to create the file `~/MACHINE_ID`, which contains a unique\nidentifier string. This file is not synced among my computers. A program/script can\nquery the value of this file and set itself accordingly.\n\n### (42) malap: Multi alap, i.e. call my program `alap` with each argument\n\n[malap.fish](functions/malap.fish)\n\n```shell\n    $ malap c d py\n    # `main.c` was created\n    # `main.d` was created\n    # `main.py` was created\n```\n\n`alap` ( https://github.com/jabbalaci/alap ) is a little CLI tool of mine for scaffolding files.\nBy default, it accepts just one argument, but with this function\nI can call it with several ones.\n\n(The word \"alap\" means \"base\" or \"basic\" in Hungarian.)\n\n### (43) mc: Launch Midnight Commander and stay in the folder where you quit\n\n[mc.fish](functions/mc.fish)\n\n```shell\n    $ mc\n    # starts Midnight Commander\n```\n\nUse this function to start Midnight Commander. This way, when you\nnavigate somewhere in MC and quit, you'll find yourself in the\ndirectory where you quit.\n\nWithout this, you'd get back to the folder where you launched MC.\n\n### (44) mdgo: Make directory and cd into it\n\n[mdgo.fish](functions/mdgo.fish)\n\n```shell\n    $ pwd\n    /tmp\n\n    $ mdgo send\n\n    $ pwd\n    /tmp/send\n```\n\nMakes the directory and enters into it. Others like to call it `mdcd`.\n\n### (45) meteo: Weather report\n\n[meteo.fish](functions/meteo.fish)\n\n```shell\n    $ meteo paris,france\n    Weather:\n      Report: temperature: 24.22 C (76 F) conditions: clear sky\n      Locale: Paris, France current time: 2025-05-30 22:49:15\n        Source: OpenWeatherMap.org\n```\n\nThe location's format is `city,country` . It's a string with no space in it.\nIn case of problems, consult OpenWeatherMap.org\n\n### (46) minimal-prompt: A minimal prompt\n\n[minimal-prompt.fish](functions/minimal-prompt.fish)\n\n```shell\n    $ minimal-prompt\n    # you get a simple $ sign for your prompt\n```\n\nMight be useful if you want to do a demo and you want to hide your fancy prompt\nto avoid distraction.\n\n### (47) moodle-link: Put a link on the given URL without embedding it | Moodle\n\n[moodle-link.fish](functions/moodle-link.fish)\n\n```shell\n    $ moodle-link\n    Insert a clickable (YouTube) link without embedding the video | Moodle\n\n    URL: https://www.youtube.com/watch?v=dQw4w9WgXcQ\n    '\u003ca style=\"color: rgb(57, 155, 226);\" href=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ#\" target=\"_blank\"\u003ehttps://www.youtube.com/watch?v=dQw4w9WgXcQ\u003c/a\u003e'\n    # copied to the clipboard\n```\n\nAn interactive script that reads a URL and produces a string\nthat can be pasted in the source code of a Moodle page.\nIt inserts a clickable link and prevents embedding.\n\n### (48) moodle-nolink: Insert a URL as text, without putting a link on it | Moodle\n\n[moodle-nolink.fish](functions/moodle-nolink.fish)\n\n```shell\n    $ moodle-nolink\n    Insert a URL as simple text, not as a hyperlink | Moodle\n\n    URL: https://www.youtube.com/watch?v=2hPOfpI7j_Y\n    '\u003cspan class=\"nolink\"\u003ehttps://www.youtube.com/watch?v=2hPOfpI7j_Y\u003c/span\u003e'\n    # copied to the clipboard\n```\n\nIt produces a string that can be pasted in the source code of a Moodle page.\nThe link (URL) will appear as a normal text, not as a hyperlink.\n\n### (49) myalias: Similar to the alias in bash\n\n[myalias.fish](functions/myalias.fish)\n\n```shell\n    $ myalias rm\n    alias rm 'rm -i'\n\n    $ myalias\n    # list of all my aliases\n```\n\n`myalias` works similarly to `alias` in Bash/ZSH.\n\n### (50) no-autosuggestions: Disable autosuggestions\n\n[no-autosuggestions.fish](functions/no-autosuggestions.fish)\n\n```shell\n    $ no-autosuggestions\n```\n\nDisables autosuggestions. As you type, nothing will appear in gray after the cursor.\n\nMight be useful when you do a demo and others can see your screen and\nyou don't want to reveal what files you downloaded last time with wget...\n\n### (51) no-theme: Select the None theme (no colors)\n\n[no-theme.fish](functions/no-theme.fish)\n\n```shell\n    $ no-theme\n    # no colors as you type\n```\n\nAs you type, everything has the same color.\n\nBy default, fish adds colors to syntactic elements.\nWith `no-theme` you can disable it.\n\n### (52) private-mode: Start private mode, history will not be persisted\n\n[private-mode.fish](functions/private-mode.fish)\n\n```shell\n    $ private-mode\n    # start a private session\n```\n\nIn private mode history will not be persisted.\n\n### (53) pyeval: Evaluate an expression with Python\n\n[pyeval.fish](functions/pyeval.fish)\n\n```shell\n    $ echo 8 - 5 | pyeval\n    3\n\n    $ echo \"2**20\" | pyeval\n    1048576\n\n    $ echo \"'laci'.upper()\" | pyeval\n    LACI\n\n    $ echo \"r.randint(1, 6)\" | pyeval\n    2\n```\n\nThe input is evaluated with Python's `eval()`\nfunction, so BE CAREFUL what you pass to it!\n\n### (54) pyloc: Count Python lines of code (excluding .venv)\n\n[pyloc.fish](functions/pyloc.fish)\n\n```shell\n    $ pyloc\n     143 ./lib.py\n      24 ./02-functions_to_md.py\n     104 ./01-filters_to_md.py\n     271 total\n```\n\nTraverses the current directory recursively (excluding .venv),\nand counts Python lines of code.\n\n### (55) python3clean: Start the Python 3 REPL without the extra info line\n\n[python3clean.fish](functions/python3clean.fish)\n\n```shell\n    $ python3clean\n    Python 3.13.3 (main, Apr  9 2025, 07:44:25) [GCC 14.2.1 20250207] on linux\n    \u003e\u003e\u003e\n```\n\nBy default, the Python 3 REPL starts like this:\n\n```shell\n    $ python3\n    Python 3.13.3 (main, Apr  9 2025, 07:44:25) [GCC 14.2.1 20250207] on linux\n    Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n    \u003e\u003e\u003e\n```\n\nNotice the extra line that starts with \"Type...\". We don't need that line.\nThis function removes it.\n\nTip: this function has a long name so I suggest putting an alias on it.\n\n### (56) qj: QuickJump script\n\n[qj.fish](functions/qj.fish)\n\n```shell\n    $ cd /\n\n    $ pwd\n    /\n\n    $ qj db\n\n    $ pwd\n    /home/jabba/Dropbox\n```\n\nThis is a launcher for my QuickJump script.\nAvailable here: https://github.com/jabbalaci/quickjump\n\n### (57) r: Run a source code (compile and run)\n\n[r.fish](functions/r.fish)\n\n```shell\n    $ r main.c\n    Hello World\n\n    $ r sum.c 2 3\n    5\n```\n\nTakes a source code and runs it. It can be extended to support various languages.\n\n### (58) random-functions: Some random functions (so that you don't forget them)\n\n[random-functions.fish](functions/random-functions.fish)\n\n```shell\n    $ random-functions\n    * unroman                       - Convert Roman numeral to number (filter)\n    * sp                            - Show the current path or show the path of a given file\n    * removesuffix                  - Remove suffix (filter)\n```\n\nIt prints some random functions (real functions and filters, but no aliases).\n\nTip: call it from `fish_greeting`. It's easy to forget about your functions,\nespecially if you have many, so we need constant reminders.\n\nHow it works:\n\n* A: function names (with aliases)\n* B: aliases\n* Print A\\B (difference)\n\n### (59) re: Wake up the Dropbox client\n\n[re.fish](functions/re.fish)\n\n```shell\n    $ re\n    # the Dropbox client starts synchronizing\n```\n\nWhen I wake up a computer from suspend mode, sometimes the Dropbox client\ndoesn't recognize that it should start synchronizing. With this script\nI can force it to start working.\n\n### (60) ren: Rename a file interactively\n\n[ren.fish](functions/ren.fish)\n\n```shell\n    $ ren main.c\n    New name: main.c\n    # you can edit the file's name (move the cursor, delete a char, etc.)\n```\n\nIt allows you to rename a file interactively.\n\n### (61) repo: Open the GitHub URL of the current project\n\n[repo.fish](functions/repo.fish)\n\n```shell\n    $ repo\n    # opens the GitHub URL of the current project\n```\n\nUnder Manjaro, install this package:\n\n```\nyay -S github-cli\n```\n\nUnder Manjaro, after an update, this command dropped some warnings.\nThe solution was to reinstall some packages:\n\n```\nsudo pacman -Syu mesa vulkan-intel ibus\n```\n\n### (62) resolution: Current resolution\n\n[resolution.fish](functions/resolution.fish)\n\n```shell\n    $ resolution\n    1920x1080\n```\n\nShows your current resolution.\n\n### (63) s: CD into /tmp/send\n\n[s.fish](functions/s.fish)\n\n```shell\n    $ pwd\n    /home/jabba\n\n    $ s\n\n    $ pwd\n    /tmp/send\n```\n\nI like to store short-living temporary files in the `/tmp/send` folder.\nIt's in `/tmp`, but still in a separate subfolder. For instance, I need to send\n3 files to a friend that are located in different folders. I copy them to\n`/tmp/send`, send them via email (since they are collected in the same folder,\nit's easy to attach them), then delete them from `/tmp/send`.\n\nThis script called `s` allows me to enter this folder with the speed of light.\n\n### (64) sort-info: Basic usage of the sort command\n\n[sort-info.fish](functions/sort-info.fish)\n\n```shell\n    $ sort-info\n    # print some info about its basic usage\n```\n\n### (65) sp: Show the current path or show the path of a given file\n\n[sp.fish](functions/sp.fish)\n\n```shell\n    $ pwd\n    /tmp/send\n\n    $ sp\n    # copied to the clipboard\n    /tmp/send\n\n    $ sp main.c\n    # copied to the clipboard\n    /tmp/send/main.c\n```\n\n`sp` stands for **s**how **p**ath.\n\n`sp` alone shows the current directory and copies it to the clipboard.\n\n`sp \u003cfilename\u003e` shows the path of the given file and copies the file's\npath to the clipboard.\n\n`sp.py` can be found here: https://github.com/jabbalaci/Bash-Utils/blob/master/sp.py\n\n### (66) subreddit: Number of subscribers of a subreddit\n\n[subreddit.fish](functions/subreddit.fish)\n\n```shell\n    $ subreddit https://old.reddit.com/r/d_language/\n    subscribers: 5,210\n```\n\n### (67) timezones: List of valid timezones\n\n[timezones.fish](functions/timezones.fish)\n\n```shell\n    $ timezones\n    Africa/Abidjan\n    Africa/Accra\n    ...\n```\n\nSee also https://worldtimeapi.org/pages/examples .\n\n### (68) top10dirs: Top 10 largest directories\n\n[top10dirs.fish](functions/top10dirs.fish)\n\n```shell\n    $ top10dirs\n    367G    .\n    107G    ./retroujsag\n    91G     ./youtube\n    39G     ./byte_magazine\n    ...\n```\n\nList the top 10 directories in the current folder in descending order by size.\n\n### (69) top10files: Top 10 largest files\n\n[top10files.fish](functions/top10files.fish)\n\n```shell\n    $ top10files\n    5,8G    ./install/ubuntu/ubuntu-24.04.1-desktop-amd64.iso\n    5,6G    ./install/commodore_os_vision/CommodoreOS-20231213.iso\n    ...\n```\n\nList the top 10 files in the current folder (recursively) in descending order by size.\n\n### (70) tr-info: Basic usage of the tr command\n\n[tr-info.fish](functions/tr-info.fish)\n\n```shell\n    $ tr-info\n    # print some info about its basic usage\n```\n\n### (71) unixtime: Print the Unix epoch time\n\n[unixtime.fish](functions/unixtime.fish)\n\n```shell\n    $ unixtime\n    1747902871\n\n    $ unixtime2date 1747902871\n    2025-05-22 10:34:31\n    2025. máj. 22., csütörtök, 10:34:31 CEST\n```\n\nPrints the Unix epoch time, i.e. the number of seconds\nsince January 1, 1970.\n\n`unixtime2date` is the opposite.\n\n### (72) unixtime2date: Convert Unix epoch time to normal date\n\n[unixtime2date.fish](functions/unixtime2date.fish)\n\n```shell\n    $ unixtime\n    1747902871\n\n    $ unixtime2date 1747902871\n    2025-05-22 10:34:31\n    2025. máj. 22., csütörtök, 10:34:31 CEST\n```\n\nTakes a Unix epoch time (number) and converts it\nback to human-friendly date.\n\n### (73) upgrade_pipx_and_uv: Upgrade packages installed with pipx and uv\n\n[upgrade_pipx_and_uv.fish](functions/upgrade_pipx_and_uv.fish)\n\n```shell\n    $ upgrade_pipx_and_uv\n    # updates packages that were installed with pipx and uv\n    # it also updates uv (which gets a new version almost every week)\n```\n\n`pipx` and `uv` are two popular package managers for Python.\nThey have that nice feature that they can update all the packages\nthat were installed with them. This script triggers this update procedure.\n\n### (74) ups: Updates / upgrades\n\n[ups.fish](functions/ups.fish)\n\n```shell\n    $ ups\n    # brings up a \"menu\" with all the update/upgrade possibilities\n```\n\nThis script brings up a \"menu\" from which I can select the update/upgrade option.\nI regularly need to update the mirror list, upgrade the packages,\nupgrade softwares installed with pipx and uv, etc. I cannot keep\nall the update commands in my head. This script helps me keep\nmy system up-to-date without causing any mental overhead.\n\n### (75) ut: Run unittests on a D source file\n\n[ut.fish](functions/ut.fish)\n\n```shell\n    $ ut file.d\n    # run unittests of `file.d` using rdmd\n    $ ut file.d -main\n    # if `file.d` is a library, then an empty main() function is added\n```\n\nRun unittests on the given D source code using `rdmd`.\n\n### (76) uv_venv: Call the `uv_venv` script\n\n[uv_venv.fish](functions/uv_venv.fish)\n\n```shell\n    $ uv init\n\n    $ uv_venv\n```\n\nSee https://github.com/jabbalaci/uv_venv for a detailed description.\n\nIn short:\n\nThe command uv venv creates `.venv/` in the project folder.\n\nThis script creates the virt. env. in a separate folder (`~/.virtualenvs`), and in the project folder\nit creates a symbolic link called `.venv` that points on the virt. env. located in `~/.virtualenvs`.\n\n### (77) workspace: Identify the current workspace\n\n[workspace.fish](functions/workspace.fish)\n\nI use Manjaro with XFCE and I assigned it to Super+s the following way:\n\nOpen Settings → Keyboard → Application Shortcuts, then add this command:\n\n`fish -c 'workspace'`\n\nAdvantage: it works globally. Unfortunately, the terminal didn't recognize the Super key.\n\n### (78) xfce-info: Current XFCE version\n\n[xfce-info.fish](functions/xfce-info.fish)\n\n```shell\n    $ xfce-info\n    # starts a GUI app.\n```\n\nStarts a GUI application where you can check the version of your XFCE.\n\nTip: the `fastfetch` command can also tell you this information in the command line.\n\n### (79) xrates: Currency rates of HUF, EUR and USD\n\n[xrates.fish](functions/xrates.fish)\n\n```shell\n    $ xrates\n    1 EUR is 404.86 HUF\n    1 USD is 355.87 HUF\n\n    $ xrates 185\n    1 EUR is 404.86 HUF\n    1 USD is 355.87 HUF\n    ---\n    185.00 EUR is 74898.79 HUF\n    185.00 USD is 65836.30 HUF\n```\n\nSee https://frankfurter.dev for more info. It's a free, open-source currency data API\nthat tracks reference exchange rates.\n\nYou can pass an optional value to the function.\n\n### (80) y: Start yazi (and stay in the folder where you quit)\n\n[y.fish](functions/y.fish)\n\n```shell\n    $ y\n    # starts the yazi file manager\n```\n\nUse this function to start yazi. This way, when you\nnavigate somewhere in yazi and quit, you'll find yourself in the\ndirectory where you quit.\n\nWithout this, you'd get back to the folder where you launched yazi.\n\n### (81) zig-info: My abbreviations for zig\n\n[zig-info.fish](functions/zig-info.fish)\n\n```shell\n    $ zig-info\n    # print some info about its basic usage\n```\n\n### (82) zoli: Check my friend's local time\n\n[zoli.fish](functions/zoli.fish)\n\n```shell\n    $ zoli\n    🇭🇺 Debrecen Time:   2025-05-31 21:29:59 (CEST)\n    🇺🇸 US Eastern Time: 2025-05-31 15:29:59 (EDT)\n```\n\nCheck my friend's local time.\n\n\u003c!-- END: functions --\u003e\n\n## Issues\n\nIf you have an idea how to improve something, or\nif you find a bug, feel free to issue a ticket.\n\n## Links\n\n* https://fishshell.com\n* [Reddit announcement](https://old.reddit.com/r/fishshell/comments/1kr3jtp/70_useful_filter_functions/)\n\n## Author\n* Laszlo Szathmary (jabba.laci@gmail.com), 2025\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjabbalaci%2Fmy-fish","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjabbalaci%2Fmy-fish","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjabbalaci%2Fmy-fish/lists"}