Sao chép và đánh dấu trong Bash như trong Emacs?


16

Tôi muốn có thể sao chép và dán văn bản trong dòng lệnh trong Bash bằng cách sử dụng cùng các ràng buộc bàn phím mà Emacs sử dụng theo mặc định (nghĩa là sử dụng C-spacecho set-mark, M-wđể sao chép văn bản C-y, M-yđể dán nó, v.v.).

Các tài liệu GNU Bash nói rằng Bash đi kèm với một số các tổ hợp phím thiết lập theo mặc định.

Ví dụ, yanking ( C-y) hoạt động theo mặc định trên thiết bị đầu cuối của tôi. Tuy nhiên, tôi không thể làm cho các lệnh set-markcopyhoạt động được và chúng dường như không bị ràng buộc với bất kỳ khóa nào theo mặc định.

Thông thường, cách người dùng có thể xác định các ràng buộc chính của mình là thêm chúng vào .inputrc. Vì vậy, tôi đã xem và tìm thấy các hàm bash sau trong tài liệu mà tôi đoán có thể giúp tôi xác định hành vi giống như Emacs mà tôi muốn (tức là set-markvới C-spacecopyvới M-w).

copy-region-as-kill ()

Sao chép văn bản trong vùng vào bộ đệm kill, vì vậy nó có thể được kéo mạnh ngay lập tức. Theo mặc định, lệnh này không bị ràng buộc.

set-mark (C-@)

Đặt dấu vào điểm. Nếu một đối số số được cung cấp, nhãn hiệu được đặt ở vị trí đó.

Nếu tôi hiểu chính xác, điều trên có nghĩa copy-region-as-killlà không bị ràng buộc với bất kỳ trình tự bàn phím nào theo mặc định, trong khi set-markbị ràng buộc C-@theo mặc định.

Tôi đã thử C-@trên thiết bị đầu cuối của mình, nhưng tôi không nghĩ nó chạy set-markvì tôi không thấy bất kỳ văn bản nào được tô sáng khi tôi di chuyển con trỏ. Trong mọi trường hợp, tôi đã thử thêm các ràng buộc bàn phím ( M-wC-) vào các chức năng copy-region-as-killset-markở trên .inputrcvà sau đó tải lại nó C-x C-r, nhưng điều này không hoạt động. Tôi biết rằng các mục khác của tôi trong .inputrccông việc vì tôi có các tổ hợp phím do người dùng xác định khác được xác định trong đó.

Có điều gì tôi đang làm sai? Tôi có thiếu thứ gì không?


Phiên bản nào bashvà chương trình thiết bị đầu cuối nào bạn đang sử dụng?
Mikel

Tôi đang sử dụng GNU bash, phiên bản 3.1.17 (1) -release (x86_64-redhat-linux-gnu) trên gnome-terminal (cũng trên Terminator)
Amelio Vazquez-Reina

Câu trả lời:


11

Nó không làm nổi bật lựa chọn, nhưng nếu không thì tôi nghĩ nó hoạt động tốt.

Hãy thử chạy

$ bind -p | grep copy-region-as-kill

để đảm bảo rằng C-x C-rthực sự làm việc.

Nó sẽ nói:

"\ew": copy-region-as-kill

Sau đó, nó sẽ hoạt động tốt.

Thí dụ:

$ abc<C-Spc><C-a><M-w> def <C-y>

đưa cho tôi

$ abc def abc

Nếu bạn muốn biết nó ở đâu mark, chỉ cần làm C-x C-x.

Thí dụ:

$ <C-Spc>abc<C-x><C-x>

sẽ đưa con trỏ trở lại nơi bạn đặt dấu (bắt đầu của dòng).

Ngoài ra, tôi không nghĩ bạn cần thêm set-markràng buộc. Tôi đã không.

$ bind -p | grep set-mark
"\C-@": set-mark
"\e ": set-mark
# vi-set-mark (not bound)

(lưu ý rằng hầu hết các thiết bị đầu cuối gửi C-@khi C-Spcđược nhấn. Tôi giả sử bạn cũng vậy.)

Nếu tất cả điều này không thành công:

  • làm Ctrl+ Spacelàm việc tại emacs -nwtrên thiết bị đầu cuối giống nhau không?
  • làm khác Alt/ Metaphím tắt làm việc trong bash?

1
Cảm ơn! Tôi đã có "Mw" thay vì "\ ew" trong .inputrc. Việc thiếu làm nổi bật cũng làm tôi bối rối. Cảm ơn con trỏ đến lệnh bind bằng cách này. Bây giờ nó hoạt động như một nét duyên dáng!
Amelio Vazquez-Reina

2
Chào mừng bạn Vâng, bạn phải viết \ehoặc \M-. Xem cú pháp tập tin initline .
Mikel

Thật là một câu trả lời tuyệt vời! Cảm ơn. Điều này đã làm sáng tỏ những vấn đề tương tự đối với tôi: D
ephsmith

set-mark và copy-area-as-kill hoạt động âm thầm, tôi có thể làm nổi bật vùng đó (như trong emacs) không?
mosh

4

Tôi cũng ràng buộc Cw cho khu vực giết . Đây .inputrc của tôi:

# Xem http://lists.gnu.org/archive/html/orms-bash/2009-03/msg00033.html
tắt liên kết-tty-đặc biệt-ký tự

# Xác định các ràng buộc chính Emacs yêu thích của tôi.
"\ C- @": đánh dấu thiết lập
"\ Cw": vùng giết
"\ Mw": copy-area-as-kill
"\ M- /" dabenamev-bung rộng
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.