Câu hỏi Lệnh tab hoàn thành các đối số từ thư mục


Có thể tạo danh sách các lần hoàn thành cho một lệnh dựa trên một số tệp của thư mục không?

Nói rằng tôi muốn chạy Sublime Text 2 trên một trong các dự án của tôi, được lưu dưới dạng ~/sublime_projects/*.sublime-project. Hành vi mong muốn:

 subl<tab><tab>
   foo bar project2

trong trường hợp có foo.sublime-project, bar.sublime-project, project2.sublime-project tệp trong ~/sublime_projects.


4
2017-08-24 09:06


gốc




Các câu trả lời:


Bạn có thể sử dụng hàm bash sau, thêm nó vào bạn .bashrc

Lưu ý đường dẫn thư mục cho biến PROJECTS_DIR

# bash completion for sublime projects in ~/projects
_subl()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    PROJECTS_DIR="/home/mreq/projects/"
    LOOK_FOR="*.sublime-project"
    cd ${PROJECTS_DIR}
    PROJECTS=$(ls ${LOOK_FOR})
    COMPREPLY=( $(compgen -W "${PROJECTS}" -- $cur) )
}
complete -F _subl subl

Những gì nó làm:

  • khi bạn nhập subl TAB TAB TAB nó liệt kê tất cả các dự án tại thư mục dự án

  • khi bạn nhập subl ANY_LETTER TAB nó tự động hoàn thành tên dự án nếu ANY_LETTER_TAB phù hợp với nhân vật đầu tiên của dự án.

Ví dụ nếu bạn có bên trong ~/projects những điều sau đây: test.sublime-project và foo.sublime-project và loại subl t TAB trong nhà ga bạn sẽ nhận được subl test.sublime-project

CẬP NHẬT kịch bản dưới đây không thay đổi PWD tôi sẽ rời khỏi cả hai để tham khảo trong tương lai.

# bash completion for sublime projects in ~/projects
_subl()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    PROJECTS_DIR="/home/mreq/projects/"
    LOOK_FOR=".sublime-project"
    # cd ${PROJECTS_DIR}
    PROJECTS=$(ls ${PROJECTS_DIR} | grep "^${cur}.*${LOOK_FOR}")
    COMPREPLY=${PROJECTS_DIR}${PROJECTS}
}
complete -F _subl subl

Tập lệnh thứ hai tìm kiếm ký tự đã nhập sau subl và thay thế nó bằng đường dẫn đầy đủ của tên tệp phù hợp. Ví dụ: nếu có test.sublime-project trong ~/projects bằng cách gõ subl t sẽ được thay thế bằng subl /home/USERNAME/projects/test.sublime-project


4
2017-08-24 11:32



Tuyệt vời, chính xác những gì tôi đang tìm kiếm. Cảm ơn. - mreq
Một điều: Điều này thay đổi $PWD đến $PROJECTS_DIR. Có cách nào để giữ cái hiện tại không? Tôi đã thử lưu và khôi phục sau COMPREPLY bài tập, nhưng điều đó không hiệu quả. - mreq
Cảm ơn bạn đã chỉnh sửa! Thật không may, tập lệnh thứ hai không hoạt động với ô trống <tab> hoàn thành các dự án. Sử dụng cái đầu tiên - thật lạ lùng, đó là cách gõ cd - sau $PWD thay đổi đã được thực hiện không giúp bạn quay lại nơi bạn đang ở. - mreq
Nó sẽ không giúp bạn quay lại vì kịch bản trả về. Đối với tập lệnh thứ hai, bạn có thể chuyển tới ký tự đại diện phụ * và TAB để liệt kê các dự án nhưng không theo cách tốt. Cá nhân tôi thích kịch bản đầu tiên. - Stef K