22 điểm bởi GN⁺ 2026-05-11 | 1 bình luận | Chia sẻ qua WhatsApp
  • Trình fuzzy finder dòng lệnh fzf là một công cụ mang lại hiệu quả tức thì so với công sức bỏ ra và có giá trị rất riêng, nhưng nhiều lập trình viên chỉ cài xong rồi bỏ cuộc vì không biết cách tận dụng
  • Có thể thay thế tìm kiếm lịch sử Ctrl+R bằng fuzzy matching và nhiều khung xem trước, từ đó giải quyết sự bất tiện của cách khớp chuỗi chính xác truyền thống
  • Với Alt+C, chỉ cần nhớ mang máng tên thư mục là đã có thể fuzzy cd, và có thể xây dựng quy trình mở file ngay lập tức bằng tổ hợp vi $(fzf)
  • Khi nối với ripgrep bằng pipe, có thể tìm kiếm mờ trên mọi dòng của mọi file rồi mở ngay file tương ứng trong editor
  • Đây là công cụ giúp tăng năng suất ngay lập tức đến mức ngay cả heuristic 80/20 là nên học các công cụ Unix cổ điển trước (cat, grep, find...) cũng phải bị phá lệ

Giá trị có được ngay sau khi cài fzf

  • Kỹ sư phần mềm có thể dễ dàng tự tạo công cụ để cải thiện công việc của mình, nhưng nếu cứ chuyển qua lại giữa nhiều công cụ mà không đào sâu thì chi phí sẽ tăng dần theo thời gian
  • Một heuristic 80/20 tốt là trước tiên nên thành thạo các công cụ Unix lâu đời như cat, ls, cd, grep, cut; còn trong vai trò quản trị hệ thống hiện đại thì cả sedawk cũng được tính vào
  • fzf có thể xem là ngoại lệ của heuristic này vì hiệu quả so với công sức đầu tư đến ngay lập tức và giá trị của nó rất độc đáo
  • Trọng tâm là các tính năng có thể dùng ngay sau khi cài bằng script cài đặt fzf trong môi trường Ubuntu tiêu chuẩn

Hiệu quả tức thì từ các phím tắt mặc định

  • Ctrl+R: biến lịch sử lệnh thành tìm kiếm mờ

    • Trên hầu hết terminal Linux và Windows, Ctrl+R cung cấp chức năng tìm kiếm ngược trong lịch sử lệnh
    • Ctrl+R mặc định yêu cầu khớp chính xác để tìm được lệnh mong muốn và mỗi lần chỉ hiển thị một bản xem trước, nên chỉ cần lệch một ký tự là đã khó tìm
    • Khi cài fzf, một số phím tắt bàn phím sẽ được ghi đè bằng hành vi tốt hơn, và Ctrl+R cũng được cải thiện đáng kể so với cách cũ
    • Nếu cài bằng trình quản lý gói như apt, phần tích hợp phím tắt này có thể không có, đó cũng là lý do nên dùng script cài đặt fzf
  • Alt+C: di chuyển nhanh tới thư mục chỉ nhớ lờ mờ

    • fzf biến Alt+C thành phím tắt cd mờ được nâng cấp
    • Khi không nhớ chính xác đường dẫn thư mục mà chỉ nhớ đại khái tên của nó, bạn vẫn có thể di chuyển nhanh tới đó
    • Nó hữu ích khi từ một terminal trống cần tìm một repository hoặc thư mục làm việc đã lâu không ghé tới

Bản thân lệnh fzf và cách kết hợp với shell

  • fzf cơ bản

    • Chạy trực tiếp lệnh fzf sẽ fuzzy search các đường dẫn file tương đối dựa trên thư mục hiện tại
    • Nếu dùng riêng lẻ thì nó chủ yếu chỉ để chọn vị trí file nên mức độ hữu dụng không quá lớn
  • vi $(fzf)

    • Khi kết hợp với command substitution như vi $(fzf), bạn có thể mở ngay file đã chọn bằng fuzzy search trong editor
    • Cách này không hề đặc biệt với vi; bạn có thể dùng cùng editor mình thích như emacs, nano, code...
  • vi $(find . '/' | fzf)

    • Kết hợp find . '/' | fzf với editor cho phép bạn fuzzy search trong danh sách đường dẫn đầy đủ để mở một file cấu hình mà không biết nó nằm ở đâu
    • Khi cần tìm một file như nginx.conf mà không nhớ vị trí, thay vì đoán theo kiến thức FHS hoặc học thuộc, chỉ cần pipe kết quả của find vào fzf
    • Tìm theo kiểu conf$ sẽ lọc chỉ những dòng kết thúc bằng conf
    • Nếu find gặp nhiều lỗi Permission denied thì fzf có thể khựng lại một lúc, nhưng sẽ hồi phục sau vài giây
    • Độ trễ vài giây này là sự đánh đổi để đổi lấy cách tìm file cấu hình rất đơn giản
  • vi **<TAB>

    • Đây là tính năng xuất hiện trong bình luận Hacker News của sigmonsays: nằm đâu đó giữa việc ghi đè phím tắt và chạy trực tiếp fzf, có một kiểu tab completion mờ dùng hai dấu sao
    • vi **<TAB> có thể dùng để chọn file theo cách khá giống vi $(fzf)
    • Sau khi lệnh thực sự được hoàn tất, bạn vẫn phải nhấn Enter thêm một lần nữa
    • Nó hoạt động tốt trên bash và zsh, nhưng có thể không hoạt động trên fish
    • Nếu bạn thấy cách gọi tường minh $(fzf) dễ nhớ hơn thì có thể sẽ không dùng tính năng này thường xuyên

Dùng fzf cả khi di chuyển file

  • mv $(fzf) $(fzf)

    • mv $(fzf) $(fzf) hữu ích khi bạn không nhớ chính xác cần di chuyển cái gì và di chuyển tới đâu, nhưng lại nhớ những manh mối rất cụ thể cho từng bên
    • Cách làm là dùng hai lần chọn fzf: một lần cho đối tượng cần chuyển, một lần cho đích đến
    • Nó có thể đặc biệt tiện khi sắp xếp file, chẳng hạn như thêm GIF vào README trên GitHub
    • Ví dụ liên quan được dẫn tới là README về interactive mode của finstem

Kết hợp với rg để fuzzy search cả nội dung file

  • rg: grep nhanh với tìm kiếm đệ quy mặc định

    • Tổ hợp dưới đây cũng có thể làm bằng grep, nhưng rg hay ripgrep mạnh hơn cho mục đích này vì mặc định đã tìm kiếm đệ quy
    • Nếu muốn làm theo ví dụ, nên cài và dùng rg
  • rg . | fzf

    • rg . xuất từng dòng của các file dưới dạng kết quả tìm kiếm; chuyển nó cho fzf thì bạn có thể fuzzy search mọi dòng trong mọi file
    • Đây là cách tìm theo nội dung dòng bên trong file thay vì theo tên file
  • rg . | fzf | cut -d ":" -f 1

    • Nếu gắn cut -d ":" -f 1 vào kết quả đã chọn từ rg . | fzf, bạn có thể lấy trường đầu tiên theo dấu hai chấm, tức là vị trí file
    • Đây là tổ hợp để fuzzy search theo nội dung dòng rồi chỉ lấy đường dẫn của file chứa dòng đó
  • vim $(rg . | fzf | cut -d ":" -f 1)

    • vim $(rg . | fzf | cut -d ":" -f 1) là tổ hợp fuzzy search mọi dòng trong mọi file rồi mở file chứa dòng đã chọn bằng vim
    • Khi không nhớ tên file mà chỉ nhớ một phần nội dung, cách này cho phép đi thẳng vào editor

1 bình luận

 
GN⁺ 2026-05-11
Ý kiến trên Lobste.rs
  • Có vẻ độc giả mục tiêu của bài này chính là tôi. Tôi đã cài fzf, nghĩ rằng “đúng là thiên tài”, nhưng rồi lại liên tục quên mất không dùng đến; giờ thì có lẽ tôi sẽ dùng thật

    • Điểm mấu chốt là tích hợp nó vào cấu hình shell hiện có, script cá nhân và alias. Tôi dùng fzf mọi lúc, nhưng hầu như không bao giờ chạy trực tiếp
  • Có thể đây là một bài viết hay, nhưng nếu mục tiêu là trả lời câu hỏi “giờ làm gì tiếp?”, thì bắt đầu từ tích hợp shell cho fzf lại tạo cảm giác chỉ nhắm đến một nhóm độc giả hẹp hơn
    Tôi đã quen dùng ctrl-r trong bash, nên bảo tôi thay nó đi thì yêu cầu hơi cao. Giá như bài viết chỉ cách luyện cùng một thao tác mà không thay thế mặc định trước đã

    • Thực ra nó gần như là một mặc định được tăng cường. Cứ để nó thay ctrl-r là hợp lý, và một nửa sức hấp dẫn cốt lõi nằm ở chỗ vẫn giữ được thao tác quen tay nhưng có trải nghiệm phong phú hơn trong gần như cùng một luồng làm việc
      ctrl-r có lẽ là lệnh tôi dùng nhiều nhất, và fzf là một cải tiến khớp ngay vào đó mà gần như không có đường cong học tập. Vì nó chạy bằng ctrl-r nên tôi cũng không quên dùng fzf. Dù vậy, sau này tôi đã chuyển sang Fish shell, nơi hành vi tương tự đã có sẵn mặc định
  • Tôi bị thuyết phục rồi. Sắp tới tôi sẽ thêm tích hợp shell cho fzf, và hôm nay tôi đã học được một điều

  • Khi cần tìm file để đưa vào lệnh, bạn cũng có thể dùng phím tắt ctrl-t. Tôi hay dùng nó với git để chọn các file cần đưa vào một thay đổi cụ thể, và cũng từng dùng để lọc đầu ra grep nhằm thu hẹp phạm vi tìm kiếm

  • Ngoài việc cải thiện tìm kiếm lịch sử shell, tôi còn dùng fzf với hai alias sau
    alias gbd='git -c color.ui=never branch | fzf | xargs -I {} git branch -D {}'
    Tôi chủ yếu dùng nó để chọn danh sách branch cục bộ cần xóa sau khi merge pull request. Có thể có cách tốt hơn, nhưng đến giờ nó vẫn chưa từng làm tôi thất vọng
    alias awp='export AWS_PROFILE="$(grep -e "\[\(.*\)\]" ~/.aws/config | sed -e "s/\[//g" | sed -e "s/\]//g" | cut -d " " -f 2 | sort -u | fzf)"'
    Nó giúp đổi nhanh AWS_PROFILE theo các giá trị trong ~/.aws/config. Giờ tôi cũng đang nghĩ tới việc tạo một alias tương tự để đổi Kubernetes namespace

  • Nếu dùng plugin fzf.vim, bạn có thể dùng fzf bên trong vim. Không chỉ mở file, mà còn có thể tìm kiếm mờ qua buffer, lịch sử lệnh, nội dung file, v.v.

  • Mục đích chính của tôi với fzf là duyệt và tìm kiếm lịch sử commit Git theo dạng tuyến tính để nắm xem gần đây đã thay đổi những gì
    Trong cấu hình Git mặc định của tôi, git fzf được định nghĩa như sau

    [alias]  
      # Browse commit history with fzf  
      # Inspired by: https://chrismanbrown.gitlab.io/67.html  
      fzf = "!git log --oneline --color=always --decorate=short $@ | \  
          fzf --ansi --reverse --no-sort \  
            --preview 'git show --color=always {1}' \  
            --preview-window '<50(down)' \  
            --bind 'enter:become(git show {1})' #"  
    
  • Tôi có cảm giác mình đang bỏ lỡ điều gì đó. Tôi thắc mắc tại sao lại cài fzf khi còn chưa biết sẽ làm gì với nó

  • Gần đây cũng có một bài liên quan. Có người đang dùng fzf làm bộ chọn file cho jj
    https://lobste.rs/s/exlogg/jjj