Khoảng 5 lần một ngày, tôi gõ "vi" khi tôi có nghĩa là "cd", và cuối cùng mở một thư mục trong vi. Nó làm cho tôi NUTS. Có vẻ như nên có một cách để phát hiện khi tôi gõ vào "thư mục vi +" và tự động thay đổi nó thành "thư mục cd +". Suy nghĩ?
Khoảng 5 lần một ngày, tôi gõ "vi" khi tôi có nghĩa là "cd", và cuối cùng mở một thư mục trong vi. Nó làm cho tôi NUTS. Có vẻ như nên có một cách để phát hiện khi tôi gõ vào "thư mục vi +" và tự động thay đổi nó thành "thư mục cd +". Suy nghĩ?
Câu trả lời:
Với giả định rằng bạn gọi vi
với thư mục là đối số cuối cùng:
vi() {
if [[ -d ${!#} ]]; then
cd "$@"
else
command vi "$@"
fi
}
rm
để rm -i
, đó là mặc định trong nhiều bản phân phối. Tôi thường nghĩ rằng cách tốt nhất để giải quyết vấn đề là giải quyết người dùng thay vì làm việc xung quanh họ.
rm
để rm -i
có thể cứu bạn một số rắc rối trong thời gian qua nhưng sức (và có lẽ sẽ) giúp bạn có được trong nhiều rắc rối hơn trong tương lai ...
vi
trong câu hỏi ...
${!#}
gián tiếp tham chiếu đối số cuối cùng và command
chỉ cần thiết để tránh đệ quy hàm trong trường hợp này.
Ngoài câu trả lời @ChrisDown, đây là một cách tiếp cận khác: bỏ qua các thư mục
Với phương pháp này, bạn có thể:
vi ./*
và nó sẽ bắt đầu vi trên tất cả các tệp trong thư mục hiện tại ngay cả khi nó chứa các thư mục con, bỏ qua các thư mục con đó
vi() {
for arg do
[ -d "$arg" ] || set -- "$@" "$arg"
shift
done
[ "$#" -gt 0 ] && command vi "$@"
}
Cái này chỉ làm vi, trên bất kỳ đối số nào không phải là thư mục ... Do đó, nó sẽ không dạy bạn sử dụng "vi" cho "cd";)
Và nó sẽ không gọi vi nếu bạn vừa làm: vi somedirectory (nghĩa là vi nhập sai thay vì cd). Nhưng nó sẽ không tự động cd ở đó, vì vậy bạn vẫn nhớ bạn phải gõ cd ^^
Tôi đã sử dụng một cách "tương thích" để thay đổi danh sách đối số, để nó có thể di động tới nhiều nền tảng.
command something
bắt đầu lệnh "Something" (nghĩa là lần xuất hiện đầu tiên của "thứ gì đó" được tìm thấy bằng $ PATH) thay vì bất kỳ hàm bí danh OR nào có tên là "cái gì đó". \something
sẽ chỉ bỏ qua bí danh, nhưng vẫn là hàm nếu nó tồn tại (và ở đây, điều đó có nghĩa là hàm "vi" sẽ tự gọi và lặp).
Một giải pháp là ngừng sử dụng cd
hoàn toàn. Đặt shopt -s autocd
trong .bashrc
hoặc setopt autocd
trong của bạn .zshrc
. Sau đó, để thay đổi sang một thư mục khác, hãy nhập tên thư mục mà không cần bất kỳ lệnh nào.
Đừng quên gõ vi
nếu bạn muốn chỉnh sửa một tập tin.
Nếu bạn thực sự muốn một lệnh duy nhất thay đổi thành thư mục hoặc chỉnh sửa tệp, bạn có thể biến nó thành hàm:
vi () {
if [ $# -eq 1 ] && [ -d "$1" ]; then
cd -- "$1"
else
command vi "$@"
fi
}
Sử dụng tính năng bí danh trong Unix. Khi bạn đặt bí danh cd thành vi, vấn đề sẽ được giải quyết.
vi
mà không ghi đè thủ công bí danh, điều này dường như rất không mong muốn.
vim
thay thế.
vim
. Nếu nó không có sẵn, hãy sử dụng vi
và mong đợi bộ tính năng hạn chế hơn.