Tự động phát hiện khi tôi gõ vào vi vi nhưng có nghĩa là cd cd?


21

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ĩ?


1
Tôi đã đưa ra một giải pháp thay thế mà bạn cũng có thể tìm thấy sự can thiệp ^^ (một cách cho phép bạn khắc phục nguồn gốc của vấn đề, đồng thời tránh bị kích thích cho đến lúc đó ^^)
Olivier Dulac


1
Nó cũng làm tôi thất vọng rất nhiều, cho đến khi tôi phát hiện ra rằng bạn có thể sử dụng Enter và mũi tên để điều hướng đến tệp bên trong thư mục. Khi bạn nhấn Enter trong khi đang ở trên nó, nó sẽ mở ra.
nuoritoveri

1
Chỉ với một lượng nhỏ của sự lịch sự: thay đổi thành zsh. Thiết lập nó để khi bạn gõ một tên thư mục, nó sẽ thay đổi thành thư mục đó. Sử dụng các bí danh hậu tố để khi bạn gõ * .sh, * .c, * .config bất cứ điều gì nó sẽ mở tệp có liên quan trong vi. Thông báo trước ở đây tất nhiên là bạn có thể thấy mình bỏ sót "vi" hoặc "cd" trong một vỏ không quen thuộc.
mkingston

3
Làm thế nào điều này xảy ra?
JFA

Câu trả lời:


38

Với giả định rằng bạn gọi vivới thư mục là đối số cuối cùng:

vi() {
    if [[ -d ${!#} ]]; then
        cd "$@"
    else 
        command vi "$@"
    fi
}

2
@Alex Tôi đoán rằng cả hai đều hoàn hảo cho các trường hợp hiếm hoi bạn nhập "vi" không đúng thay vì "cd", đồng thời dạy bạn luôn luôn gõ "vi" ngay bây giờ;) [tức là tôi hy vọng bạn không thường xuyên phải sử dụng máy chủ / máy khác mà chức năng đó sẽ không ở đó để giúp bạn giảm căng thẳng ...] [+1 cho câu trả lời đó, tuy nhiên, đó cũng là điều tôi muốn trả lời, ngoại trừ tôi chỉ kiểm tra "$ { 1} "[và sau đó là cd" $ {1} "] thay vì" $ {! #} "...]
Olivier Dulac

5
@OlivierDulac Đồng ý - nguy hiểm tương tự được răng cưa 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ọ.
Chris Xuống

3
@OlivierDulac răng cưa rmđể rm -icó 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 ...
jlliagre

1
@Alex Vâng, bạn đã nói vitrong câu hỏi ...
Chris Down

2
@crisron: ${!#}gián tiếp tham chiếu đối số cuối cùng và commandchỉ cần thiết để tránh đệ quy hàm trong trường hợp này.
Chris Xuống

4

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.


1
lưu ý :: command somethingbắ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ì đó". \somethingsẽ 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).
Olivier Dulac

@ChrisDown: chúng tôi đang nói về một sự trợ giúp cho người dùng, mà tôi hy vọng sẽ không cố gắng tự hack mình ^^. Và bằng chứng đó là thiết lập một bộ đối số mới (bộ - ...), vì vậy bản thân nó ít nguy hiểm hơn
Olivier Dulac

@StephaneChazelas: cảm ơn bạn đã chỉnh sửa! Tôi đã cố gắng viết nó theo cách đó, nhưng tôi đã lo lắng về việc lặp đi lặp lại vô tận [Tôi tin rằng bạn sẽ không lặp, mặc dù!. 'For arg' đang được đánh giá trước khi bắt đầu điều trị bên trong, và do đó, danh sách "$ @" của nó được 'lưu' và lặp đi lặp lại, và không thay đổi ngay cả khi điều trị bên trong thay đổi "$ @"?]
Olivier Dulac

1

Một giải pháp là ngừng sử dụng cdhoàn toàn. Đặt shopt -s autocdtrong .bashrchoặc setopt autocdtrong 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õ vinế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
}

-6

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.


5
... điều này có nghĩa là người ta không thể sử dụng vimà không ghi đè thủ công bí danh, điều này dường như rất không mong muốn.
Chris Xuống

3
Câu trả lời này đi qua như hơi trollish. Nó không trả lời câu hỏi ban đầu, như OP không nói rõ họ bao giờ cần thiết vi trên một tập tin. Câu trả lời, mặc dù hơi thú vị, chắc chắn không hữu ích.
gerrit

1
@ChrisDown Hoặc điều này sẽ dạy bạn sử dụng đúng cách vimthay thế.
Kevin

@Kevin vim không "phù hợp" hơn vi - trên nhiều hệ thống, vi là tất cả những gì có sẵn.
Chris Xuống

1
@ChrisDown Tôi cho rằng tốt hơn là nên biết những gì mong đợi. Nếu bạn muốn sử dụng các tính năng vim, sử dụng vim. Nếu nó không có sẵn, hãy sử dụng vivà mong đợi bộ tính năng hạn chế hơn.
Kevin
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.