Skip to main content

Create an interactive bookmarks menu in your terminal

ยท 3 min read
Carlos Angulo Mascarell

In this post, I am going to implement an interactive bookmarks menu using fzf in bash Terminal.

Requirements

  • Linux (I'm using Elementary OS, a Ubuntu-based distro, try it!)
  • fzf command-line fuzzy finder
  • Remember to add execution permissions to the scripts through chmod +x

Demo

goal

As you see, every time I call listBookmarks the following paths are listed interactively:

  • /home/cangulo/repos/cangulo-tf
  • /home/cangulo/repos/cangulo-nuke

I can move through them using the up/down keys, and navigate into by pressing Enter.

On the other hand, in case similar paths are listed, I can filter by typing keywords.

goal

Implementation

#!/bin/bash

listBookmarks() {
local bookmarksFile=./bookmarks.json

local pathSelected=$(cat $bookmarksFile |
jq -r '.[]' |
fzf)

if [[ -n "$pathSelected" ]]; then
cd $pathSelected
else
echo "no bookmark selected"
fi
}

listBookmarks function

Let me define the basic structure:

  1. Read the paths (i.e. bookmarks)
  2. List them in an interactive way
  3. Once a bookmark is selected, navigate to it

Now let's dive into the details:

1. Read the bookmarks

First, in order to make this extensible, the paths are listed in a JSON file:

[
"/home/cangulo/repos/cangulo-tf",
"/home/cangulo/repos/cangulo-nuke"
]

bookmarks

We can print the file content using cat, and then use jq to query the array items.

cat $bookmarksFile | jq -r '.[]'

Why I'm using a JSON file instead of a simple text file. Click here for the answer:

It is because in the article Interactive bookmarks menu v2 I will add new features with more advanced bookmarks ๐Ÿ˜

2. List the bookmarks

Here is where fzf comes up. Anything that fzf receives is listed interactively. In this case, we pipe the jq result to fzf, so the bookmarks are listed as shown in the demo section.

cat $bookmarksFile | jq -r '.[]' | fzf

3. Once a bookmark is selected, navigate to it

fzf returns the path selected, we save it to a variable.

local pathSelected=$(cat $bookmarksFile | jq -r '.[]' | fzf)

Last, we check if it is not empty (-n) before moving into:

if [[ -n "$pathSelected" ]]; then
cd $pathSelected
else
echo "no bookmark selected"
fi

Bonus: execute this every time you open a terminal

You have to add this in your bash or zsh profile (.bashrc, .zshrc ). Just append the listBookmarks implementation at the end, update the bookmarksFile variable to be a full path, and call the function.

listBookmarks() {
local bookmarksFile='YOUR_PATH/bookmarks.json'
local pathSelected=$(cat $bookmarksFile |
jq -r '.[]' |
fzf)

if [[ -n "$pathSelected" ]]; then
cd $pathSelected
else
echo "no bookmark selected"
fi
}

listBookmarks

And that is all! I hope this saves you some time using the terminal. Do you find this useful? Do you have similar functions? Let me know in the comments below.

About me

I'm a Software Engineer with experience as Developer and DevOps. The technologies I have worked with are DotNet, Terraform and AWS. For the last one, I have the Developer Associate certification. I define myself as a challenge-seeker person and team player. I simply give it all to deliver high-quality solutions. On the other hand, I like to analyze and improve processes, promote productivity and document implementations (yes, I'm a developer that likes to document ๐Ÿง‘โ€๐Ÿ’ป).

You can check my experience here.

Personal Blog - cangulo.github.io
GitHub - Carlos Angulo Mascarell - cangulo
LinkedIn - Carlos Angulo Mascarell
Twitter - @AnguloMascarell

Did you like it? Share It!


Comments