Đã cài `fzf`. Giờ nên làm gì tiếp? (2023)
(andrew-quinn.me)- Trình fuzzy finder dòng lệnh
fzflà 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+Rbằ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ợpvi $(fzf) - Khi nối với
ripgrepbằ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ảsedvàawkcũng được tính vào fzfcó 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
fzftrong 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+Rcung cấp chức năng tìm kiếm ngược trong lịch sử lệnh Ctrl+Rmặ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+Rcũ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 đặtfzf
- Trên hầu hết terminal Linux và Windows,
-
Alt+C: di chuyển nhanh tới thư mục chỉ nhớ lờ mờfzfbiếnAlt+Cthành phím tắtcdmờ đượ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
-
fzfcơ bản- Chạy trực tiếp lệnh
fzfsẽ 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
- Chạy trực tiếp lệnh
-
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...
- Khi kết hợp với command substitution như
-
vi $(find . '/' | fzf)- Kết hợp
find . '/' | fzfvớ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.confmà 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ủafindvàofzf - Tìm theo kiểu
conf$sẽ lọc chỉ những dòng kết thúc bằngconf - Nếu
findgặp nhiều lỗiPermission deniedthìfzfcó 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
- Kết hợp
-
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ếpfzf, 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ốngvi $(fzf)- Sau khi lệnh thực sự được hoàn tất, bạn vẫn phải nhấn
Enterthê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
- Đây là tính năng xuất hiện trong bình luận Hacker News của
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:grepnhanh 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ưngrghayripgrepmạ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
- Tổ hợp dưới đây cũng có thể làm bằng
-
rg . | fzfrg .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ó chofzfthì 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 1và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 đó
- Nếu gắn
-
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ằngvim- 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
Ý 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
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 đã
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ớigitđể 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 ragrepnhằm thu hẹp phạm vi tìm kiếmNgoài việc cải thiện tìm kiếm lịch sử shell, tôi còn dùng
fzfvới hai alias saualias 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 namespaceNế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ư sauTô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