强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 安装点击图标保存/搜索
fzfapt install fzfbuku -p | fzf
rofiapt install rofi自定义脚本
dmenuapt install dmenu自定义脚本
Vim 插件vim-plug 安装:BukuSearch
Emacs 包use-packageC-c b s
Tmux配置快捷键prefix + b

10.10 本章小结

要点说明
浏览器扩展Firefox / Chrome 支持
fzf 集成模糊搜索书签
Rofi/dmenu图形化选择器
Vim/Emacs编辑器内管理
Shell 集成别名和函数

扩展阅读


下一章第 11 章:Docker 部署 — 学习在 Docker 中部署 Buku Web 服务。