1 điểm bởi GN⁺ 3 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • fzf ngay sau khi cài đặt sẽ cải thiện tìm kiếm lịch sử lệnh bằng Ctrl+R với fuzzy search
  • Có thể nhanh chóng chuyển tới thư mục làm việc cũ mà không cần biết chính xác đường dẫn bằng Alt+C
  • Lệnh fzf có thể kết hợp với command substitution để mở ngay tệp đã chọn bằng vi, emacs, code
  • Khi đưa kết quả find vào fzf, sẽ dễ tìm các tệp cấu hình mà không biết vị trí như nginx.conf
  • rg . | fzf cho phép mở tệp mong muốn dựa trên manh mối là các dòng nội dung trong tệp thay vì tên tệp

Giá trị có thể nhận được ngay sau khi cài fzf

  • Kỹ sư phần mềm có thể dễ dàng 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 học thật 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; trong vai trò quản trị hệ thống hiện đại thì còn bao gồm cả sedawk
  • fzf có thể xem là ngoại lệ của heuristic này vì hiệu quả trên công sức đầu tư đến ngay lập tức và giá trị của nó rất đặc biệt
  • Điểm cốt lõi là những 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 fuzzy search

    • Trên hầu hết terminal Linux và Windows, Ctrl+R cung cấp tính năng tìm kiếm ngược trong lịch sử lệnh
    • Ctrl+R mặc định đòi hỏi 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ự cũng khó tìm
    • Khi cài fzf, nhiều 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 cung cấp; đó là lý do nên dùng script cài đặt fzf
  • Alt+C: nhanh chóng chuyển tới thư mục mà ký ức đã mờ nhạt

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

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

  • fzf cơ bản

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

    • Nếu kết hợp với command substitution như vi $(fzf), bạn có thể mở ngay tệp đã chọn bằng fuzzy search trong trình soạn thảo
    • Cách này không có gì đặc biệt chỉ dành cho vi; bạn có thể dùng với trình soạn thảo mình muốn như emacs, nano, code v.v.
  • vi $(find . '/' | fzf)

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

    • Đây là một tính năng được nhắc tới trong bình luận Hacker News của sigmonsays: một dạng fuzzy tab completion bằng hai dấu sao nằm ở khoảng giữa giữa việc ghi đè phím tắt và chạy trực tiếp fzf
    • vi **<TAB> cũng có thể dùng để chọn tệp theo cách tương tự vi $(fzf)
    • Sau khi lệnh thực tế được hoàn thành, bạn vẫn cần nhấn thêm Enter
    • Nó hoạt động tốt trong bash và zsh, nhưng trong fish có thể không hoạt động
    • 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ả cho việc di chuyển tệp

  • 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à chọn đối tượng cần di chuyển và đích đến thông qua hai lần chọn bằng fzf
    • Nó có thể đặc biệt hay dùng trong các tác vụ như sắp xếp, di chuyển tệp để đưa GIF vào README trên GitHub
    • Một ví dụ liên quan là README interactive mode của finstem

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

  • rg: grep nhanh với tìm kiếm đệ quy là 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 ở chỗ tìm kiếm đệ quy theo mặc định nên rất phù hợp cho mục đích này
    • Nếu muốn làm theo ví dụ thì nên cài và dùng rg
  • rg . | fzf

    • rg . xuất từng dòng trong các tệp ra dưới dạng kết quả tìm kiếm, rồi khi đưa vào fzf, bạn có thể fuzzy search mọi dòng trong mọi tệp
    • Đây là cách tìm dựa trên nội dung dòng bên trong tệp thay vì tên tệp
  • rg . | fzf | cut -d ":" -f 1

    • Nếu nối thêm 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 phân tách bởi dấu hai chấm, tức là vị trí tệp
    • Đây là tổ hợp để fuzzy search theo nội dung dòng rồi chỉ lấy lại đường dẫn tệp 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 tệp, rồi mở bằng vim tệp chứa dòng đã chọn
    • Khi bạn không nhớ tên tệp mà chỉ nhớ một phần nội dung, cách này cho phép đi thẳng sang trình soạn thảo

1 bình luận

 
Ý 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