Sử dụng các phím VI để chỉnh sửa các lệnh shell trong UNIX


28

Tôi đã từng có một đồng nghiệp thực sự giỏi về UNIX.

Anh ấy chỉ cho tôi cách sử dụng các ràng buộc phím Vi để chỉnh sửa các lệnh shell của tôi.

Anh ta đặt lệnh trong một tệp chạy mỗi lần tôi đăng nhập.

Kể từ đó, tôi đã chuyển sang một dự án khác.

Thật không may, tôi không nhớ làm thế nào để thiết lập này.

Có ai ở đây biết cách sử dụng các ràng buộc phím Vi để chỉnh sửa các lệnh trong thiết bị đầu cuối không?

Làm thế nào tôi có thể làm cho thiết lập đó vĩnh viễn?

Câu trả lời:


31

Bạn đang nói về tính năng tuyệt vời nhất từng có!

Bạn có thể sử dụng các lệnh vi để chỉnh sửa các lệnh shell (và lịch sử lệnh) bằng cách thêm lệnh này vào .bashrctệp của bạn :

set -o vi

Bạn cũng có thể chạy lệnh đó từ dòng lệnh để chỉ ảnh hưởng đến phiên hiện tại của bạn.

Nếu bạn không sử dụng bash, hãy thay thế tệp RC thích hợp cho trình bao của bạn.


Điều này cho phép bạn sử dụng các lệnh vi để chỉnh sửa bất kỳ lệnh nào ...

Bạn cũng có thể sử dụng jkđể di chuyển qua lịch sử của mình (sau khi nhấn ESC).

Bạn cũng có thể sử dụng /(sau khi nhấn ESC) để tìm kiếm các lệnh cũ.

Nói cách khác, để tìm ra cplệnh siêu dài mà bạn đã thực hiện mười phút trước:

ESC/cpENTER

Sau đó, bạn có thể chuyển qua tất cả các lệnh khớp trong lịch sử của mình với nN.

Tất cả điều này làm cho tôi năng suất hơn 10 nghìn tỷ lần ở dòng lệnh!


4
Chà, nó không thực sự sử dụng vi, nó sử dụng các lệnh bàn phím kiểu vi để chỉnh sửa dòng.

4
Chắc chắn ... tôi đoán thuật ngữ thích hợp là vi bindings in the shelltính năng tuyệt vời nhất từng được phát minh!
jahroy

Tôi sẽ chuyển từ liên kết emacs sang liên kết vi nếu có cách để hiển thị chế độ. Bạn có biết một cách để làm điều đó?
iconoclast

Họ, là có một cách để ràng buộc jjvới ESCnhư chúng ta thường làm trong vim?
steveyang

@yangchenyun - Có lẽ câu hỏi này sẽ giúp ích cho điều đó: stackoverflow.com/questions/844862/ nam Tôi không đích thân ràng buộc / thay đổi bất kỳ lệnh nào, vì vậy tôi không chắc chắn những gì bạn đang hỏi.
jahroy

12

Nếu bạn đang sử dụng bash, vì jahroy và ác quỷ đã trả lời, bạn có thể sử dụng

set -o vi

để gây ra bash để sử dụng các lệnh chỉnh sửa kiểu vi.

Khi bạn đã hoàn thành việc này, bạn có thể nhập Esc vđể khởi chạy trình soạn thảo vi với một tệp tạm thời chứa bản sao của dòng lệnh hiện tại. Bạn có thể chỉnh sửa lệnh, thậm chí thay thế nó bằng nhiều dòng; Khi bạn lưu tệp ( :wq), shell sẽ thực thi các lệnh đã chỉnh sửa.

Nếu bạn thích

set -o emacs

bạn có thể sử dụng Ctl-XCtl-Eđể làm điều tương tự. Nó sẽ sử dụng trình soạn thảo ưa thích của bạn $EDITOR, không nhất thiết phải là emacs.

(Cá nhân, tôi sử dụng vi (thực ra là vim) cho hầu hết các chỉnh sửa của mình, nhưng tôi thích set -o emacstrong trình bao; chuyển đổi trong và ngoài chế độ chèn rất tốt để chỉnh sửa các tệp, nhưng lúng túng cho các lệnh tương tác. YMMV.)


Bạn có biết cách quay trở lại chế độ chỉnh sửa thông thường tránh kiểu vi không? Tôi nhớ thành công với Bl Num, nhưng bây giờ không còn nữa; tôi đang thiếu gì
piertoni

@piertoni: Không set -o emacslàm những gì bạn muốn?
Keith Thompson

Vâng, nó hoạt động, tôi đã bỏ lỡ điểm, cảm ơn
piertoni

10

Bạn có thể sử dụng set -o viđể thay đổi các lệnh chỉnh sửa dòng của mình như @jahroy đã đăng, nhưng bạn có thể đang nghĩ về fclệnh (có sẵn trong bash và tôi nghĩ là ksh, nhưng có lẽ không phải là tcsh), sẽ đưa lệnh trước đó vào trình soạn thảo (FCEDIT hoặc EDITOR , mà bạn có thể đã đặt thành vi) và sau đó thực thi lệnh khi bạn thoát trình chỉnh sửa. Xem trang chủ hoặc help fcđể biết chi tiết, hoặc chỉ cần thử.


5
alias r='fc -e -'là một bí danh có giá trị để chạy lại các lệnh trước đó. fcTôi tự tin rằng nó có nguồn gốc từ vỏ Korn. Bạn có thể chỉ định các lệnh theo số (fc 123 129 để chỉnh sửa số lệnh 123 thành 129 trong lịch sử). Bạn có thể chỉ định số tương đối ( fc -10 -1để chỉnh sửa 10 lệnh cuối cùng được nhập). Bạn có thể liệt kê các lệnh trước với fc -l. Bạn có thể chỉ định một lệnh bằng tiền tố với rbí danh ( r makechạy lệnh gọi cuối cùng make; r mnếu bạn không chạy mvlệnh kể từ lần chạy cuối cùng make, v.v.).
Jonathan Leffler

6

Để chỉnh sửa lệnh được sử dụng gần đây nhất trong vim và gọi một phiên bản đã chỉnh sửa sau khi trình chỉnh sửa lưu và thoát, hãy sử dụng fcshell tích hợp. Nếu không có bất kỳ đối số, nó sẽ làm như sau:

  1. Tạo một tệp tạm thời /tmpvà điền vào đó bằng lệnh được gõ gần đây nhất
  2. Sau khi trình soạn thảo thoát bình thường (với mã thoát 0), nó sẽ thực thi lệnh được tìm thấy trong tệp tạm thời đó và xóa tệp này. Phiên bản chỉnh sửa được lưu trong lịch sử như một lệnh thông thường (ít nhất là trong zsh). Nó thực thi không có gì nếu trình soạn thảo thoát với mã khác 0 (trong vim điều này có thể đạt được bằng cách giết hoặc sử dụng nó :cquit).

Lệnh hoạt động cả trong bash và zsh.


5

Thật vậy, đây thực sự là tính năng tuyệt vời nhất. Có nhiều hơn mặc dù:

Tạo một tập tin có tên

.editrc

chứa dòng

bind -v

Editline , là thư viện phiên bản được cấp phép BSD cung cấp các dịch vụ giống như đường đọc. Mà .editrc sẽ đặt chế độ khóa của bạn thành chế độ vi trong trình vỏ dòng lệnh của MySQL hoặc bất kỳ ứng dụng nào không sử dụng đường dẫn.

Tôi đã trở nên hơi lãng quên với những năm tháng trôi qua, vì vậy .zshrc của tôi cung cấp một số hàm bao cho chế độ vi, để cho tôi biết tôi đang ở chế độ nào trên dòng lệnh. Nó đẹp.

Tôi biết trong zsh bạn có thể gõ

bindkey -L

và có được danh sách các keybindings. Tôi chắc chắn bash phải có một cái gì đó tương tự. Không phải tất cả các phím vi đều bị ràng buộc theo mặc định. Liên kết với họ như thế nào bạn thấy phù hợp và bạn đang đi đến các chủng tộc.


Ước gì tôi có thể nâng cấp điều này 5 lần cho các ràng buộc vi trong MySQL!
jahroy

1

trong thiết bị đầu cuối của bạn, gõ export EDITOR=vi .

Để lưu cài đặt này. đặt dòng này trong tệp ~ / .profile


5
Điều đó đặt trình soạn thảo mặc định của bạn (cho các lệnh chú ý đến $EDITOR) vi. Nó không cho phép bạn chỉnh sửa các lệnh shell với vi(ít nhất là không trực tiếp).
Keith Thompson

2
@KeithThndry Zsh mặc định ở chế độ chỉnh sửa vi nếu $EDITORvi. Tôi nghĩ rằng đó là vỏ duy nhất làm điều này.
Gilles 'SO- đừng trở nên xấu xa'
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.