b - browse Chrome bookmarks with fzf
#!/usr/bin/env bash | |
# vim: set filetype=ruby: | |
# b - browse Chrome bookmarks with fzf | |
[ $(uname) = Darwin ] || exit 1 | |
which fzf > /dev/null 2>&1 || brew reinstall --HEAD fzf || exit 1 | |
/usr/bin/ruby -x "$0" | | |
fzf-tmux -u 30% --ansi --multi --no-hscroll --tiebreak=begin | | |
awk 'BEGIN { FS = "\t" } { print $2 }' | | |
xargs open | |
exit $? | |
#!ruby | |
# encoding: utf-8 | |
require 'json' | |
FILE = '~/Library/Application Support/Google/Chrome/Default/Bookmarks' | |
CJK = /\p{Han}|\p{Katakana}|\p{Hiragana}|\p{Hangul}/ | |
def build parent, json | |
name = [parent, json['name']].compact.join('/') | |
if json['type'] == 'folder' | |
json['children'].map { |child| build name, child } | |
else | |
{ name: name, url: json['url'] } | |
end | |
end | |
def just str, width | |
str.ljust(width - str.scan(CJK).length) | |
end | |
def trim str, width | |
len = 0 | |
str.each_char.each_with_index do |char, idx| | |
len += char =~ CJK ? 2 : 1 | |
return str[0, idx] if len > width | |
end | |
str | |
end | |
width = `tput cols`.strip.to_i / 2 | |
json = JSON.load File.read File.expand_path FILE | |
items = json['roots'] | |
.values_at(*%w(bookmark_bar synced other)) | |
.compact | |
.map { |e| build nil, e } | |
.flatten | |
items.each do |item| | |
name = trim item[:name], width | |
puts [just(name, width), | |
item[:url]].join("\t\x1b[36m") + "\x1b[m" | |
end | |
This comment has been minimized.
This comment has been minimized.
valdoonicanlives
commented
Nov 16, 2016
Nice and it was very easy to get it to work in linux |
This comment has been minimized.
This comment has been minimized.
jteneycke
commented
Feb 12, 2018
•
Adapted it to work with Linux+Chromium+xdg-open. Thanks! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
krompus commentedMay 4, 2016
•
edited
This is really cool! Is there a way to adapt this to Firefox? I don't use Chrome, but I'd love to have this!
I'll tinker with it and report back if I figure it out.