Hoàn thành zsh: nhận tên tệp từ một thư mục cụ thể


10

OK, một chút nền tảng: Tôi sử dụng máy Mac và tôi làm nhiều nhất có thể trong CLI.

Cụ thể, tôi thường xuyên bật một thanh USB cphoặc mvtập tin qua, sau đó ngay lập tức muốn đẩy ra (ngắt kết nối và ngắt kết nối) nó. Điều này thường có thể được thực hiện trong một số lần nhấn phím, ngoại trừ việc ngắt kết nối, yêu cầu (trong 10.7) đi đến một không gian để bàn trống (thường là ít nhất hai khoảng cách), chọn đĩa và nhấn "lệnh-e". Thành thật mà nói, thủ tục không đếm được này, theo một số đơn đặt hàng lớn, là phần tốn thời gian và tẻ nhạt nhất của quy trình.

Nó sẽ là tự nhiên và hiệu quả hơn nhiều chỉ đơn giản là có thể gõ, nói:

ej<tab> J<tab>

Nói thanh USB của tôi gắn kết tại / Tập / Jefferson. Những gì tôi mong đợi nhận được từ 6 lần nhấn phím của mình là như sau:

eject /Volumes/Jefferson

Điều này sẽ chạy lệnh:

diskutil unmount /Volumes/Jefferson

Vì vậy, tôi đã viết một chức năng nhỏ đẹp:

eject() {
    diskutil unmount /Volumes/$1
}

Và một chức năng hoàn thành đi kèm với nó:

compdef '_files -g "/Volumes/*"' eject  

Có một vấn đề với điều này, tuy nhiên. Các _fileschức năng tạo ra đường dẫn đầy đủ. Bây giờ, tôi có thể thay đổi dòng trong chức năng "đẩy" của mình thành diskutil unmount $1và mọi thứ sẽ hoạt động, nhưng sau đó tôi không có khả năng nhập chữ cái đầu tiên của tên điểm gắn kết, vì đường dẫn bắt đầu bằng / Tập /. Chẳng hạn, nếu tôi gõ J<tab, tôi sẽ tự động hoàn thành các tệp trong PWD. Tôi sẽ phải gõ /Volumes/J<tab>để có được sự hoàn thành mong muốn.

Vì vậy, có chức năng hoàn thành nào lấy tên tệp từ một vị trí cụ thể, được xác định trước, thay vì tạo đường dẫn hoàn chỉnh không?

Tôi thực sự muốn giảm xuống còn 6 lần nhấn phím.

Câu trả lời:


12
_files -W /Volumes

Xem tài liệu của _path_files.


Hoàn hảo! Tôi biết rằng phải được xây dựng. Cảm ơn rất nhiều!
Marshall Eubanks

Vì vậy, làm thế nào để tôi có được nó để tự động tải chức năng hoàn thành này? Tôi đã cố gắng đặt compdefdòng trong tập tin _ejectnằm trong fpath của tôi. Tôi đã thử nó với và không có dòng tự động tải. Tôi đã xem xét một số hướng dẫn về các hàm hoàn thành và không ai đề cập đến cách làm một ví dụ đơn giản thực sự như thế này, và không có gì tôi đã thử dựa trên bất kỳ ví dụ nào của chúng hoạt động.
Marshall Eubanks

@marshaul Bạn cần phải có #compdef ejectdòng đầu tiên của tệp, sau đó là mã thực. Xem dưới các tập tin tự động tải trong hướng dẫn. Nếu ban đầu bạn không thêm dòng, bạn có thể cần xóa bộ đệm trong ~/.zcompdumpvà khởi động lại zsh.
Gilles 'SO- ngừng trở nên xấu xa'

AH! Xóa ~/.zcompdumpđã làm các mẹo. Cảm ơn một lần nữa!
Marshall Eubanks
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.