Tham số cuối cùng của lệnh cuối cùng trong bash ở chế độ vi


19

Tôi đã bị thuyết phục (qua tại Stack Overflow) để sử dụng bash yêu quý của tôi trong chế độ vi. Cho đến nay tôi đã quen với nó khá tốt và tôi thích nó.

Tuy nhiên tôi thực sự bỏ lỡ một tính năng: Trong chế độ emacs, bạn có thể nhập tham số cuối cùng của lệnh trước bằng cách nhấn "ESC." (Đó là, nhấn thoát theo sau.)

Có ràng buộc mặc định để chèn tham số cuối cùng trong chế độ vi không? Tôi đã không thể tìm thấy một và tôi thực sự nhớ lệnh này ...

Câu trả lời:


9

Không có mặc định. Ràng buộc cho 'yank-last-arg' (như được liệt kê bởi 'bind -p') sẽ biến mất khi bạn chuyển sang chế độ vi.

bind '"\e."':yank-last-arg

sẽ cung cấp cho bạn cùng ràng buộc trở lại (hoặc chọn một cái gì đó khác)


1
nhân bản cho zshbindkey "\e." insert-last-word
jhvaras

Tôi đã có nó trong nhiều năm trên zsh và mỗi lần tôi buộc phải sử dụng bash (ví dụ như trên máy chủ tại nơi làm việc) Tôi cứ quên tôi không bao giờ tìm ra cách thiết lập nó trên bash. Không còn nữa! Điều này kết hợp với history-search-backwardslà vô giá cho người dùng dòng lệnh nghiêm trọng.
Sridhar Sarnobat

11

Có (vi-yank-arg), theo mặc định được ánh xạ thành "_". Điều đó sẽ làm những gì bạn muốn (trong chế độ lệnh).


+1. Tôi không chắc tại sao câu trả lời này không được chấp nhận.
Sathyam

7

Không hoàn toàn giống nhau, nhưng trong một trong hai chế độ bạn có thể nhập !$và nó sẽ được thay thế bằng từ cuối cùng của lệnh trước đó. Tìm thêm những thứ như vậy trong hướng dẫn .


Đủ gần để có được một upvote nhưng không hoàn toàn giống nhau ... Tôi bỏ lỡ khả năng chỉnh sửa dòng trước khi thực hiện nó. Nhưng dù sao cũng cảm ơn rất nhiều!

5

Tệp ~ / .inputrc có thể định cấu hình bản đồ khóa (Bạn có thể tạo tệp đó bằng tay nếu không thể tìm thấy). Thêm lệnh sau vào ~ / .inputrc :

"\e.": yank-last-arg
"\e_": yank-last-arg

~ / .Inputrc của tôi là:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

set editing-mode vi
set keymap vi-insert

"\C-p": previous-history
"\C-n": next-history
"\C-a.":beginning-of-line
"\C-e.":end-of-line

"\e.": yank-last-arg
"\e_": yank-last-arg

Bạn có thể tìm thấy các chi tiết về readlinebind -ptại đây: http://linux.about.com/l Library / cmd / blcmdl3_readline.htmlm

Và một số thông tin về Vi keyblindings trong bashReadline VI Chỉnh sửa Chế độ Cheat Sheet


3

Trong .bashrc của bạn, thêm các mục sau:

set -o vi
bind -m vi-command ".":insert-last-argument
bind -m vi-insert "\C-l.":clear-screen
bind -m vi-insert "\C-a.":beginning-of-line
bind -m vi-insert "\C-e.":end-of-line
bind -m vi-insert "\C-w.":backward-kill-word

Những thứ này sẽ khôi phục hành vi mặc định của không chỉ ESC-dot - mà còn cả Ctrl-A, Ctrl-E, Ctrl-W và Ctrl-L. Do đó, bạn có thể thưởng thức chế độ bash vi bình thường và vẫn sử dụng các phím tắt bạn biết và yêu thích. Nếu bạn cần thêm hành động, chỉ cần kiểm tra "man bash" để tìm tên của hành động đọc mà bạn cần (như "xóa màn hình", "cuối dòng", v.v.).


0

Bạn có thể sử dụng $_để tham khảo đối số cuối cùng của lệnh trước đó.

Những nhược điểm là:

  1. Bạn không thể xác minh trước khi nhấn Enter rằng thứ được chèn là thứ bạn định chèn.

  2. Nếu bạn sử dụng PROMPT_COMMAND hoặc bẫy DEBUG (tôi không chắc chính xác là nguyên nhân gây ra sự cố; tôi có cả trong .bashrc của mình) để thực hiện các công việc ưa thích như đặt lệnh đang chạy vào tiêu đề xterm, nó sẽ bị ghi đè $_.

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.