Có shell nào hỗ trợ hoàn thành mờ như trong Sublime Text không?


14

Tôi đang sử dụng bash và tôi đã tự hỏi liệu có bất kỳ plugin nào trong bash hoặc shell khác cho phép tôi làm điều này cat tfnislong.txt+ [tab]hoàn thành cat ThisFileNameIsSoLong.txtgiống như hoàn thành tab trong Sublime Text.


Tại sao không chỉ làm cat Th+ tab?
daviewales

1
@daviewales Hiển thị tất cả 269 lý do?
Fax

Câu trả lời:


11

Tôi biết về https://github.com/mgalgs/fuzzy_bash_completion , một nhóm các hàm shell được sử dụng với complete.

Tôi nghĩ rằng chúng ta có thể làm tốt hơn một chút, ngắn gọn hơn. Đã đến lúc để mở .bashrc hoặc .profile của bạn ...

Móc cơ bản chúng tôi sử dụng là:

complete -o nospace -o filenames -F fuzzypath cd ls cat

Tùy chọn -F có nghĩa là sử dụng hàm shell để hoàn thành tab, trong đó các tùy chọn được đặt trong COMPREPLYbiến. Ví dụ:

hàm fuzzypath () {
    nếu [-z $ 2] 
    sau đó
        TƯƠNG THÍCH = (`ls`)
    khác
        TRỰC TIẾP = `echo" $ 2 "| gsed 's | [^ /] * $ ||' `
        BASENAME = `tiếng vang" $ 2 "| gsed 's |. * / ||' `
        LỌC = `echo" $ BASENAME "| gsed 's |. | \ 0. * | g'`
        COMPREPLY = (`ls $ TRỰC TIẾP | grep -i" $ LỌC "| gsed" s | ^ | $ TRỰC TIẾP | g "`)
    fi
}

nơi DIRPATHlà tất cả mọi thứ trước cuối cùng / trên con đường bạn đang nhập và BASENAMElà nơi con trỏ của bạn hiện đang ở.

FILTERlà nơi mà tính năng mờ xuất hiện. Về cơ bản, hãy lấy BASENAMEvà chèn một .*khoảng giữa mỗi char để tạo ra biểu thức fuzz của chúng ta.

Phần còn lại chỉ là kết hợp regex với ls để sản xuất COMPREPLY. Bạn có thể tìm thấy những điều thông minh hơn để làm ở đây, có thể với find.

Tôi cũng thấy http://fahdshariff.blogspot.com/2011/04/writer-your-own-bash-completion.html là hữu ích.


6

Bạn có thể thấy fzf hữu ích. Đây là một công cụ tìm mờ mục đích chung được viết bằng Ruby có thể được sử dụng với bất kỳ danh sách nào: tệp, quy trình, lịch sử lệnh, nhánh git, v.v.

Kịch bản cài đặt của nó sẽ thiết lập CTRL-Tkeybinding cho shell của bạn. GIF sau đây cho thấy cách nó hoạt động.


FZF thật tuyệt! Cảm ơn rất nhiều vì đã đóng góp. Điều này đã tiết kiệm cho tôi nhiều tuần làm việc..Tôi bắt đầu viết hoàn thành mờ cho Bash khi tôi may mắn tìm thấy FZF. Nó hoạt động hoàn hảo, tôi chỉ cần nhớ lưu vị trí con trỏ trước khi gọi fzf.. (tput sc) và sau đó khôi phục lại bằng tput rc..
Håkon Hægland

3

Để đi cùng với câu trả lời khác của bạn, bạn có thể muốn xem xét zsh. Nó tương thích ngược với bash để bạn có thể sử dụng nó như một sự thay thế, nhưng nó hỗ trợ các tính năng được mở rộng đáng kể và một trong số đó là tăng cường hoàn thành tab nhận biết ngữ cảnh.

Câu hỏi thường gặp về hoàn thành zsh mở rộng về các trường hợp sử dụng, nhưng tôi tin rằng theo ví dụ của bạn, bạn sẽ quan tâm nhất đến COMPLETE_IN_WORDchức năng này. Nó không hoàn toàn là hành vi mong muốn, nhưng nó gần. Điểm chính là có rất nhiều cách để mở rộng chức năng cơ bản theo cách có thể dễ tiếp cận hơn so với sử dụng bash.

Đây là một phần mở rộng kết hợp mờ sẽ gần đúng những gì bạn muốn cụ thể hơn; trận đấu mờ

Đối với một số ý tưởng, bạn có thể xem qua khung oh-my-zsh phổ biến có một số chức năng để quản lý zsh và mở rộng nó. Đó là nhiều hơn bạn muốn, rất có thể, nhưng trong các plugin, bạn sẽ lưu ý các tập lệnh hoàn thành tự động cho nhiều vai trò khác nhau. Để có được một ý tưởng về các khả năng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.