Tôi có thể sử dụng chế độ chỉnh sửa Vim trên dòng lệnh mà không mất tìm kiếm lịch sử đệ quy không?


8

Tôi đang uz zsh và, vì tôi là một người dùng Vim cuồng nhiệt, tôi chỉ chuyển sang sử dụng chỉnh sửa kiểu Vim trên dòng lệnh. (Điều đó có nghĩa là nếu tôi gõ ls foo/barvà quyết định cdthay vào đó, tôi có thể nhấn Esc ^để quay lại từ đầu và cw cdthay đổi lsthành cd.

Đó là tất cả, nhưng vấn đề là tôi không còn có thể sử dụng Ctrl+Rđể tìm kiếm lịch sử đệ quy. Có cách nào khác để làm điều đó không, hoặc bằng cách nào đó tôi có thể ghi đè phím bấm Vim để lấy lại không?


Một lựa chọn khó khăn! garyjohnhiển thị cách Vim để thực hiện và JdeBPhiển thị cách lấy lại liên kết phím cho Ctrl + R! Tôi sẽ chơi với cả hai phương pháp và chấp nhận câu trả lời sau. Tôi sẽ quyết định dựa trên 1) phương pháp nào có vẻ dễ dàng hơn đối với tôi và 2) phương pháp nào được nhiều người ủng hộ hơn. Cám ơn hai bạn!
Nathan Long

Câu trả lời:


6

Tất nhiên bạn không còn có thể sử dụng Ctrl+ R. Nếu bạn tham khảo hướng dẫn sử dụng Z Shell, bạn sẽ thấy rằng chỉ có một ràng buộc chính cho history-incremental-search-backwardtiện ích trong emacssơ đồ bàn phím. Không có ràng buộc chính cho nó trong các keymap vi.

Nhưng như bạn cũng sẽ tìm thấy từ việc đọc hướng dẫn (Đó là chương 18.), thêm ràng buộc chính là một bài tập khá đơn giản trong việc sử dụng bindkeylệnh:

bindkey "^R" history-incremental-search-backward

Bạn thậm chí không phải sử dụng zlelệnh để ánh xạ widget vào hàm shell, vì đây là một widget tiêu chuẩn.

Nếu bạn tham khảo câu trả lời cho cùng một câu hỏi trên wiki Z Shell , bạn sẽ thấy các lệnh để thêm cụ thể vào các phím khóa vi "lệnh" và "chế độ chèn":

bindkey -M viins '^R' history-incremental-search-backward
bindkey -M vicmd '^R' history-incremental-search-backward

Cũng lưu ý rằng, như garyjohn chỉ ra , trong sơ đồ phím "lệnh" vi, /ký tự được liên kết với vi-history-search-backwardwidget. Sự khác biệt giữa widget này và history-incremental-search-backwardwidget là hành vi của widget được áp dụng khi một trong chế độ tìm kiếm lịch sử. Dưới đây là một vài sự khác biệt mà bạn sẽ nhận thấy:

  • Chuyển chế độ vi:
    • Các chế độ tìm kiếm trong history-incremental-search-backwardToggles giữa mainvicmdkeymap khi bạn gọi các vi-cmd-modephụ tùng trong khi vẫn còn ở trong chế độ tìm kiếm. tức là từ emacschế độ presssing các Escchìa khóa hoặc Ctrl+ XCtrl+ Vphím Toggles chế độ tìm kiếm giữa emacsvicmdkeymap. (Gọi history-incremental-search-backwardtừ vicmdsơ đồ bàn phím là rất rắc rối, trừ khi bạn cũng liên kết một cái gì đó vi-cmd-modetrong vicmdsơ đồ bàn phím.)
    • Chế độ tìm kiếm trong vi-history-search-backwardxử lý vi-cmd-modewidget như accept-linevà sẽ kết thúc tìm kiếm, nhập lại chế độ lệnh mà bạn đã nhập tìm kiếm từ đó. tức là (với các ràng buộc mặc định) /vào chế độ tìm kiếm từ chế độ lệnh và Escquay lại chế độ lệnh.
  • Lặp lại tìm kiếm:
    • Trong history-incremental-search-backward, cả history-incremental-search-backwardvà các vi-rev-repeat-searchvật dụng được công nhận. tức là (giả sử rằng bạn đã thay đổi các ràng buộc như trên) cả Ctrl+ RNsẽ tìm kiếm một dòng khớp trước đó.
    • Trong vi-history-search-backward, chỉ có các vi-rev-repeat-searchwidget được công nhận. tức là (giả sử rằng bạn đã thay đổi các ràng buộc như trên) Ctrl+ Rsẽ gây ra tiếng bíp và bị bỏ qua.

Trí nhớ cơ bắp của tôi ban phước cho bạn!
Nathan Long

4

Trong chế độ vi của bash, gõ <Esc>/<string><Enter>sẽ tìm kiếm lịch sử lệnh cho <string>. nsẽ tìm kiếm trở lại trong lịch sử; Nsẽ tìm kiếm về phía trước. zshell có thể giống nhau.


1
Tuy nhiên, điều đó thật thú vị - Tôi thường xuyên sử dụng tìm kiếm như một phong trào trong Vim. Tôi đoán tôi không thể sử dụng nó để di chuyển trong lệnh tôi hiện đang chỉnh sửa, vì nó được gắn vào lịch sử tìm kiếm, eh?
Nathan Long

Đúng. Nhưng bạn có thể (ít nhất là trong bash) sử dụng f, F, t, T, ';' (dấu chấm phẩy) và các lệnh ',' (dấu phẩy) để di chuyển tới và quay lại các ký tự cụ thể trong dòng.
garyjohn

1

Tôi thích sử dụng:

bindkey -M vicmd '/' history-incremental-search-backward

Bằng cách này tôi có thể gõ ESC /textvà xem dòng lệnh. Nếu tôi muốn đi đến trận đấu tiếp theo, tôi gõESC n

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.