Buku 书签管理完全指南 / 第 10 章:集成与插件
第 10 章:集成与插件
学习将 Buku 集成到浏览器、编辑器和其他工具中,构建完整的书签工作流。
10.1 浏览器扩展
Firefox 扩展
# 安装步骤
# 1. 访问 Firefox Add-ons
# https://addons.mozilla.org/firefox/addon/buku/
# 2. 点击 "Add to Firefox"
# 3. 确认安装
# 或从源码安装开发版
git clone https://github.com/jarun/buku.git
cd buku/buku-firefox
# 在 Firefox 中加载
# 1. 打开 about:debugging#/runtime/this-firefox
# 2. 点击 "Load Temporary Add-on"
# 3. 选择 manifest.json
Chrome 扩展
# 安装步骤
# 1. 访问 Chrome Web Store
# 搜索 "Buku Bookmark Manager"
# 2. 点击 "Add to Chrome"
# 或手动加载开发版
git clone https://github.com/jarun/buku.git
cd buku/buku-chrome
# 在 Chrome 中加载
# 1. 打开 chrome://extensions/
# 2. 启用 "Developer mode"
# 3. 点击 "Load unpacked"
# 4. 选择 buku-chrome 目录
扩展配置
// 扩展设置
{
"server_url": "http://localhost:8080",
"api_token": "your_token_here",
"auto_fetch_title": true,
"default_tags": ",bookmark,"
}
扩展使用
# 使用扩展保存当前页面
# 1. 点击浏览器工具栏中的 Buku 图标
# 2. 填写标签(可选)
# 3. 点击 "Save"
# 使用扩展搜索书签
# 1. 点击 Buku 图标
# 2. 输入搜索关键词
# 3. 点击结果在新标签页打开
10.2 fzf 集成
buku-fzf 脚本
#!/bin/bash
# buku_fzf.sh - 使用 fzf 模糊搜索和选择书签
# 检查依赖
if ! command -v fzf &> /dev/null; then
echo "需要安装 fzf: https://github.com/junegunn/fzf"
exit 1
fi
# 获取所有书签
bookmarks=$(buku -p 2>/dev/null)
if [ -z "$bookmarks" ]; then
echo "没有书签"
exit 1
fi
# 使用 fzf 选择
selected=$(echo "$bookmarks" | fzf \
--prompt="书签搜索: " \
--preview='echo {}' \
--preview-window=right:50% \
--header="选择书签,回车打开" \
--height=80%)
if [ -n "$selected" ]; then
# 提取 URL
id=$(echo "$selected" | grep -oP '^\d+')
url=$(buku --url "$id" 2>/dev/null)
if [ -n "$url" ]; then
echo "打开: $url"
xdg-open "$url" 2>/dev/null || open "$url" 2>/dev/null
fi
fi
fzf 高级配置
# ~/.bashrc 或 ~/.zshrc 中添加
# Buku + fzf 快捷函数
bkf() {
local id url
id=$(buku -p | fzf --prompt="搜索: " | grep -oP '^\d+')
[ -n "$id" ] && buku -o "$id"
}
# 搜索并复制 URL
bkc() {
local id url
id=$(buku -p | fzf --prompt="搜索: " | grep -oP '^\d+')
[ -n "$id" ] && url=$(buku --url "$id") && echo "$url" | xclip -selection clipboard && echo "已复制: $url"
}
# 添加书签并自动获取标题
bka() {
local url="$1"
local tags="$2"
buku -a "$url" "" "$tags"
}
# 绑定快捷键(可选)
bind '"\C-b": "bkf\n"'
10.3 Rofi / dmenu 集成
Rofi 集成
#!/bin/bash
# buku_rofi.sh - 使用 Rofi 选择书签
# 获取书签列表
bookmarks=$(buku -p 2>/dev/null)
if [ -z "$bookmarks" ]; then
rofi -e "没有书签"
exit 1
fi
# 使用 Rofi 选择
selected=$(echo "$bookmarks" | rofi \
-dmenu \
-i \
-p "书签" \
-width 80 \
-lines 20 \
-columns 1)
if [ -n "$selected" ]; then
id=$(echo "$selected" | grep -oP '^\d+')
[ -n "$id" ] && buku -o "$id"
fi
dmenu 集成
#!/bin/bash
# buku_dmenu.sh - 使用 dmenu 选择书签
selected=$(buku -p | dmenu -i -l 20 -p "书签:")
if [ -n "$selected" ]; then
id=$(echo "$selected" | grep -oP '^\d+')
[ -n "$id" ] && buku -o "$id"
fi
10.4 Vim 集成
vim-buku 插件
" 在 .vimrc 中添加(使用 vim-plug)
Plug 'buku-buku/vim-buku'
" 或使用 Vundle
Plugin 'buku-buku/vim-buku'
自定义 Vim 函数
" ~/.vim/plugin/buku.vim
" 搜索书签并打开
function! BukuSearch(query)
let cmd = 'buku -s ' . shellescape(a:query) . ' 2>/dev/null'
let results = systemlist(cmd)
if empty(results)
echo "没有找到书签"
return
endif
" 使用 quickfix 窗口显示结果
cexpr results
copen
endfunction
" 添加当前文件为书签
function! BukuAddCurrent()
let url = expand('%:p')
let title = input('标题: ')
let tags = input('标签 [,tag1,tag2]: ')
if empty(tags)
let tags = ',vim,bookmark,'
endif
execute '!buku -a ' . shellescape(url) . ' ' . shellescape(title) . ' ' . shellescape(tags)
endfunction
" 命令定义
command! -nargs=1 BukuSearch call BukuSearch(<q-args>)
command! BukuAdd call BukuAddCurrent()
" 快捷键映射
nnoremap <leader>bs :BukuSearch<space>
nnoremap <leader>ba :BukuAdd<CR>
Vim 集成示例
" 打开书签列表
:buku -p
" 搜索并打开
:BukuSearch python
" 添加当前 URL
:BukuAdd
" 快捷键使用
" <leader>bs python - 搜索 python
" <leader>ba - 添加当前文件
10.5 Emacs 集成
helm-buku 包
;; 在 init.el 中添加
(use-package helm-buku
:ensure t
:bind ("C-c b" . helm-buku))
counsel-buku 包
;; 使用 counsel-buku(Ivy 用户)
(use-package counsel-buku
:ensure t
:bind ("C-c b" . counsel-buku))
自定义 Emacs 函数
;; ~/.emacs.d/lisp/buku.el
(defun buku-search (query)
"搜索 Buku 书签"
(interactive "s搜索: ")
(let ((results (shell-command-to-string (format "buku -s %s 2>/dev/null" query))))
(if (string-empty-p results)
(message "没有找到书签")
(with-output-to-temp-buffer "*Buku Results*"
(princ results)))))
(defun buku-add-url (url title tags)
"添加书签到 Buku"
(interactive "sURL: \ns标题: \ns标签 [,tag1,tag2]: ")
(shell-command (format "buku -a %s %s %s"
(shell-quote-argument url)
(shell-quote-argument title)
(shell-quote-argument tags)))
(message "书签已添加"))
(defun buku-list ()
"列出所有书签"
(interactive)
(let ((results (shell-command-to-string "buku -p 2>/dev/null")))
(with-output-to-temp-buffer "*Buku Bookmarks*"
(princ results))))
;; 绑定快捷键
(global-set-key (kbd "C-c b s") 'buku-search)
(global-set-key (kbd "C-c b a") 'buku-add-url)
(global-set-key (kbd "C-c b l") 'buku-list)
10.6 Tmux 集成
Tmux 书签面板
# ~/.tmux.conf 中添加
# Buku 书签搜索快捷键
bind-key b run-shell "tmux split-window -l 10 'buku -p | fzf --preview=\"echo {}\" | grep -oP \"^\\d+\" | xargs -I {} buku -o {}'"
# 或使用更完整的脚本
bind-key B run-shell "~/.tmux/scripts/buku.sh"
# ~/.tmux/scripts/buku.sh
#!/bin/bash
selected=$(buku -p | fzf \
--prompt="书签: " \
--height=80% \
--border)
if [ -n "$selected" ]; then
id=$(echo "$selected" | grep -oP '^\d+')
[ -n "$id" ] && buku -o "$id"
fi
10.7 Shell 集成
Bash 集成
# ~/.bashrc 中添加
# Buku 别名
alias bk='buku'
alias bka='buku -a'
alias bks='buku -s'
alias bkp='buku -p'
alias bko='buku -o'
alias bkd='buku -d'
alias bku='buku -u'
# 快速添加当前目录
bkpwd() { buku -a "file://$(pwd)" "$(basename $(pwd))" ,local,directory; }
# 添加剪贴板 URL
bkclip() {
url=$(xclip -selection clipboard -o 2>/dev/null)
if [ -n "$url" ]; then
buku -a "$url"
else
echo "剪贴板为空"
fi
}
# 搜索并打开
bko() {
local id
id=$(buku -s "$@" | head -1 | grep -oP '^\d+')
[ -n "$id" ] && buku -o "$id"
}
# fzf 集成
bkf() {
local id
id=$(buku -p | fzf --prompt="搜索: " | grep -oP '^\d+')
[ -n "$id" ] && buku -o "$id"
}
Zsh 集成
# ~/.zshrc 中添加
# Buku 补全
_buku() {
local commands=(
'add:添加书签'
'search:搜索书签'
'print:列出书签'
'open:打开书签'
'delete:删除书签'
'update:更新书签'
'export:导出书签'
'import:导入书签'
)
_describe 'buku command' commands
}
compdef _buku buku
# 快捷函数
bkf() {
local id
id=$(buku -p | fzf --prompt="搜索: " | grep -oP '^\d+')
[[ -n "$id" ]] && buku -o "$id"
}
Fish 集成
# ~/.config/fish/completions/buku.fish
# Buku 命令补全
complete -c buku -n '__fish_use_subcommand' -a 'add' -d '添加书签'
complete -c buku -n '__fish_use_subcommand' -a 'search' -d '搜索书签'
complete -c buku -n '__fish_use_subcommand' -a 'print' -d '列出书签'
complete -c buku -n '__fish_use_subcommand' -a 'open' -d '打开书签'
complete -c buku -n '__fish_use_subcommand' -a 'delete' -d '删除书签'
# 快捷函数
function bkf
set -l id (buku -p | fzf --prompt="搜索: " | grep -oP '^\d+')
and buku -o $id
end
10.8 Alfred / Raycast 集成
Alfred Workflow
# Alfred Workflow 脚本
#!/bin/bash
query="$1"
if [ -z "$query" ]; then
buku -p | head -20
else
buku -s "$query" | head -20
fi
Raycast 脚本
#!/bin/bash
# Raycast 脚本命令
# @raycast.title Search Buku
# @raycast.mode fullOutput
# @raycast.packageName Buku
# @raycast.argument1 { "type": "text", "placeholder": "搜索关键词" }
query="$1"
if [ -z "$query" ]; then
buku -p
else
buku -s "$query"
fi
10.9 常用集成速查
| 工具 | 安装方式 | 使用方式 |
|---|---|---|
| Firefox 扩展 | Add-ons 安装 | 点击图标保存/搜索 |
| Chrome 扩展 | Web Store 安装 | 点击图标保存/搜索 |
| fzf | apt install fzf | buku -p | fzf |
| rofi | apt install rofi | 自定义脚本 |
| dmenu | apt install dmenu | 自定义脚本 |
| Vim 插件 | vim-plug 安装 | :BukuSearch |
| Emacs 包 | use-package | C-c b s |
| Tmux | 配置快捷键 | prefix + b |
10.10 本章小结
| 要点 | 说明 |
|---|---|
| 浏览器扩展 | Firefox / Chrome 支持 |
| fzf 集成 | 模糊搜索书签 |
| Rofi/dmenu | 图形化选择器 |
| Vim/Emacs | 编辑器内管理 |
| Shell 集成 | 别名和函数 |
扩展阅读
下一章:第 11 章:Docker 部署 — 学习在 Docker 中部署 Buku Web 服务。