Thực hiện các hoạt động nhất định mà không xóa sổ đăng ký


30

Thông thường, trong các tệp cấu hình tôi có thể sao chép và dán một khối các dòng, sau đó tôi muốn thực hiện các thay đổi nhỏ cho khối đó. Sau khi dán, tôi sử dụngx để xóa các ký tự mà tôi muốn xóa, sau đó chuyển sang dán khối tiếp theo. Ngoại trừ việc xđặt các ký tự đã xóa vào bảng tạm, vì vậy tôi phải đọc lại khối các dòng một lần nữa.

Có cách nào để làm điều này mà không cần vào chế độ chèn không?


Jasper tìm thấy những câu hỏi tương tự trên Stack Overflow : [Có cách nào để xóa trong vim mà không ghi đè lên lần cuối của bạn không? [trùng lặp]] ( stackoverflow.com/questions/3638542/ trên ) và trong vim có cách nào để xóa mà không đưa văn bản vào sổ đăng ký không?
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


35

Lựa chọn của bạn là:

  1. Sử dụng thanh ghi lỗ đen _. Ví dụ, để xóa một dòng bạn sẽ gõ "_dd. Điều này xóa mà không ảnh hưởng đến clipboard.
  2. Rõ ràng đặt tên cho một đăng ký cho yank ban đầu. Ví dụ, để kéo một dòng vào một thanh ghi có tên, bạn sẽ gõ"ayy sau đó để dán bạn sẽ gõ"ap
  3. Sử dụng các thanh ghi yank để lấy yank ban đầu thay thế. Bạn có thể kéo, sau đó xóa khi cần thiết, sau đó khi bạn đi đến loại dán"0p
  4. Sử dụng một plugin như vim-Easyclip để cung cấp một toán tử cắt khác với toán tử xóa (công bố đầy đủ: Tôi đã viết điều đó)

Chạy :help registersđể biết thêm chi tiết về 3 đầu tiên


4
Vậy cho xtôi sử dụng "_xthì sao?
durron597

1
Đúng rồi.
Steve Vermeulen

2
@ durron597 nếu bạn xóa một ký tự cùng một lúc x, có lẽ bạn nên học cách xóa chuyển động như dt)xóa cho đến khi dấu ngoặc gần tiếp theo d2Wsẽ xóa hai mã thông báo được phân tách khoảng trắng tiếp theo. Sau đó, bạn có thể làm một cái gì đó như "_di{bên trong một khu vực giằng co, đó là điều tôi làm mọi lúc. Trong chế độ bình thường này có nghĩa là " xóa tất cả mọi thứ bên trong này chuẩn bị tinh thần khu vực vào lỗ đen "
OregonTrail

Đã thêm vào nnoremap x "_xcủa tôi ~/.vimrc(giải thích tại đây: stackoverflow.com/questions/54255/ - ).
Victoria Stuart

11

xkhông đặt mọi thứ vào clipboard, nó đặt chúng vào một thanh ghi . Nếu bạn không cho nó biết đăng ký nào để đưa nó vào, nó sẽ đưa nó vào sổ đăng ký không tên, tất nhiên sẽ ghi đè lên nội dung trước đó. Vì vậy, thay vào đó, hãy nói cho nó biết đăng ký nào sẽ sử dụng : " REGISTER x, trong đó ĐĂNG KÝ là bất kỳ chữ cái nào. Sau đó, bạn sử dụng cùng một tiền tố đăng ký trích dẫn pđể dán từ đăng ký đó. (Lưu ý: chữ thường thay thế nội dung của chúng; chữ hoa viết thêm).

Ngoài ra còn có hai thanh ghi đặc biệt "0"1. "0yvăn bản được kéo dài gần đây nhất ( ), sẽ vẫn còn ngay cả khi bạn xóa một số văn bản bằng một lệnh khác (nhưx ). "1là văn bản bị xóa gần đây nhất, miễn là văn bản đó không nhỏ (một dòng). Văn bản nhỏ bị xóa đi vào "-.

Cuối cùng, như Steve Vermeulen chỉ ra, bạn có thể nói với vim không lưu văn bản đã xóa bằng cách chỉ định thanh ghi lỗ đen "_ .

Lệnh trợ giúp có liên quan là :help registers.


3

Các :letlệnh sẽ cho phép bạn xác định lại một thanh ghi được đặt tên. Trong dòng lệnh của vim, nhấn Control+ R hai lần 1 và sau đó tên thanh ghi sẽ dán nội dung của thanh ghi vào lệnh. Sau đó, bạn có thể sửa đổi những gì nó đã dán và lưu đăng ký với các sửa đổi của bạn.

Thí dụ:

  • Trong chế độ bình thường, trên một dòng chứa văn bản "Foo Bar", nhập "fyytoàn bộ dòng ( yy) vào thanh fghi ( "f).
  • Nhập :let @f=', và Control+ r, Control+ rmột lần nữa, sau đó f, và bạn sẽ thấy nó dán vào "Foo Bar", để dòng lệnh của bạn bây giờ đọc :let @f='Foo Bar, với con trỏ ở cuối.
  • Bây giờ bạn có thể sử dụng các mũi tên và xóa các phím để chỉnh sửa những gì bạn vừa dán, chẳng hạn như :let @f='foo bar baz .
  • Kết thúc phần trích dẫn: :let @f='foo bar baz'và nhấn Enter.

Bây giờ bạn đã xác định lại nội dung của thanh fghi là "foo bar baz".

(Điều này cũng hoạt động cho các macro! :help letĐể biết thêm thông tin.)


1 Control + rcho phép bạn chèn một thanh ghi khi bạn đang ở chế độ chèn, như thể bạn đang gõ các ký tự. Sử dụng trình tự này hai lần rất quan trọng vì "văn bản được chèn theo nghĩa đen, không phải như được gõ. Điều này khác khi thanh ghi chứa các ký tự như <BS>." - vimdoc insert.txt,:help i_CTRL-R_CTRL-R


0

Liên quan đến đăng ký lỗ đen "_được đề cập bởi @derobert, bạn có thể tìm thấy bản ghi âm hữu ích trong http://vimcasts.org/episodes/meet-the-yank-register/

Vim sử dụng các thuật ngữ xóa, yank và đặt, thay cho thuật ngữ cắt, sao chép và dán thuật ngữ chuẩn hơn. Bắt đầu với cùng một chữ cái, đặt và dán dễ dàng thay thế cho nhau. Khi bạn đã quen với từ yank, nó trở thành đồng nghĩa với bản sao. Nhưng việc sử dụng từ 'xóa' của Vim là có vấn đề. Trong hầu hết các bối cảnh, từ xóa chỉ có nghĩa là xóa. Nhưng thao tác xóa của Vim sao chép văn bản vào một thanh ghi, sau đó xóa nó khỏi tài liệu. Nói cách khác, thao tác xóa của Vim hoạt động như một vết cắt.


2
Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào .
jamessan

Tôi đã cố gắng bình luận về bài viết gốc nhưng tôi không thể. Sự thay thế duy nhất tôi có là người tôi chọn @jamessan
Marlon León

0

Plugin Thay thếWithRegister

http://www.vim.org/scripts/script.php?script_id=2703 (2009-2014)

Nó cho thấy bản đồ gr.

  1. yank
  2. Trực quan chọn văn bản bạn muốn thay thế và nhấn gr
  3. di chuyển đến khối tiếp theo bạn muốn thay thế

Ngoài ra, sử dụng gr<text object>để làm điều đó mà không có một lựa chọn trực quan. dot-repeat được hỗ trợ khi các plugin repeat.vimcủa Tim Pope và visualrepeat.vimIngo Karkat được cài đặt.

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.