vim - làm cách nào tôi có thể thực hiện 'thay đổi từ' bằng cách sử dụng bộ đệm dán hiện tại


86

Tôi có một số văn bản trong bộ đệm dán của mình, ví dụ tôi đã thực hiện một yw(từ yank) và bây giờ tôi có 'foo' trong bộ đệm của mình.

Bây giờ tôi đi đến từ 'bar' và tôi muốn thay thế nó bằng bộ đệm dán của mình.

Để thay thế văn bản bằng tay tôi có thể làm cwvà sau đó nhập từ mới.

Làm cách nào tôi có thể thực hiện 'thay đổi từ' nhưng sử dụng nội dung của bộ đệm dán thay vì nhập thủ công từ thay thế?

Tùy chọn tốt nhất tôi có ngay bây giờ là đi đến đầu từ tôi muốn thay thế và thực hiện dw(xóa từ), sau đó đi đến nơi khác và thực hiện yw(từ yank), sau đó quay lại khu vực thay thế và làm p(dán) đó là một sự vụng về đặc biệt là nếu chúng không ở trên cùng một màn hình.

Câu trả lời:


120

lựa chọn 1

Bạn có thể sử dụng các thanh ghi để làm điều đó và tạo ra một keybinding cho quá trình.

Yank từ bạn muốn thay thế bằng yw.

Từ được đánh dấu là trong 0sổ đăng ký mà bạn có thể thấy bằng cách phát hành :registers.

Đi đến từ bạn muốn thay thế và làm cw. Làm Ctrl+ rtheo sau 0để dán thanh 0ghi.

Bản đồ cho điều đó sẽ trông giống như thế này (giả sử Ctrl+ jlà tổ hợp chính của chúng tôi):

:map <C-j> cw<C-r>0<ESC>

Tùy chọn 2 (đơn giản hơn)

Với từ của bạn được kéo dài, con trỏ qua từ bạn muốn thay thế và làm viwp. Đó là hình ảnh chọn từ bên trong và dán.

Phép lịch sự của @tlo trong các bình luận: bạn cũng có thể làm vep. Một char ngắn hơn. Nhược điểm phải định vị con trỏ ở đầu từ và (như với tôi) thay đổi bộ đệm.

Nhận xét (từ Michael):

Điều này là tốt Lưu ý thêm: phương pháp thứ hai thực sự dễ dàng hơn, nhưng, như vậy, chỉ hoạt động cho MỘT thay thế bởi vì sau mỗi lần thay thế, bộ đệm sẽ được thay đổi thành trường đã được thay thế (văn bản cũ). Phương pháp đầu tiên khó hơn một chút để sử dụng BUT có lợi thế là bộ đệm 0 vẫn giữ nguyên trạng thái 'vì vậy bạn có thể sử dụng phương thức đó để thực hiện nhiều hơn 1 thay thế cùng một văn bản.


14
Tùy chọn 3 (thậm chí đơn giản hơn): Với từ của bạn được kéo dài, con trỏ qua ký tự đầu tiên của từ bạn muốn thay thế và thực hiện vep.
tlo

Tôi thích lựa chọn 3 khi chỉ có 1 từ để thay đổi. Nếu có nhiều hơn một từ để thay đổi, Tùy chọn 1 cho phép tôi sử dụng. toán tử để lặp lại nó ..
typelogic

3
ve"0psẽ làm việc để cho phép bạn lặp lại thay đổi của mình
JKillian

Nếu bạn định ánh xạ nó tới một cái gì đó, có lẽ tốt hơn để sử dụng: map <C-j> ciw<C-r>0<ESC>để nó không thành vấn đề từ đâu trong từ bạn nhấn ^j.
Paul Parker ngày

Bất cứ ai cũng muốn biết tại sao CTRL-R lại làm điều đó kỳ diệu: :help insertsau đó tìm kiếm CTRL-R /CTRL-R. Để biết cách thức ve"0phoạt động, hãy nhìn vào:help registers
Paul Parker

12

ywđể đánh dấu từ của bạn, sau đó di chuyển con trỏ đến từ bạn muốn thay thế và sử dụng "_dwđể xóa từ đó, gửi văn bản đến thanh ghi null (để nó không ghi đè lên nội dung của thanh "ghi, trong đó văn bản được kéo / cắt đi theo mặc định ), và sau đó chỉ cần dán với p.

Bạn có thể sử dụng ánh xạ sau để làm cho mọi thứ dễ dàng hơn một chút:

nnoremap <leader>d "_d

... vì vậy ở chế độ bình thường, bạn có thể sử dụng \dwđể xóa một từ mà không ảnh hưởng đến "đăng ký.


3

Để làm điều này theo cách VIM, bạn cố ý sử dụng yank, xóa và các thanh ghi khác.

Đăng ký "0là đăng ký yank. Bất cứ điều gì bạn yank sẽ được đặt ở đây, nhưng xóa không bao giờ chạm vào đăng ký "0.

Vì vậy, trong ví dụ của bạn, bạn vừa kéo một từ. Để thay thế một từ bằng những gì bạn vừa kéo, bạn tận dụng việc xóa không bao giờ chạm vào thanh ghi yank. Vì vậy, di chuyển đến từ mục tiêu, xóa nó bằng dw, sau đó dán từ đăng ký yank của bạn với "0p, hoặc tốt hơn, cwsau đó ^R0(có thể lặp lại).

Một đối diện gần với thanh ghi yank là thanh ghi xóa nhỏ "-. Bất kỳ xóa nhỏ hoặc thay đổi loại bỏ được đặt ở đây, nhưng yanks không bao giờ chạm vào "-. Một số xóa được tính là nhỏ nếu nó nhỏ hơn một dòng đầy đủ.

Thanh ghi "1- "9là các thanh ghi lịch sử xóa. Với "1việc xóa xóa lớn nhất hoặc xóa thay đổi, và "9chứa xóa lớn nhất cũ nhất hoặc xóa thay đổi. Chỉ xóa những phần không nhỏ, tức là xóa một dòng hoặc nhiều hơn, được đẩy lên "1- "9.

Đối với bất kỳ hoạt động nào thay đổi một thanh ghi, một bản sao cũng luôn được đặt trong mặc định, còn gọi là thanh ghi không tên "". Đây là thanh ghi được sử dụng khi bạn không đặt tên rõ ràng cho thanh ghi.

Đăng ký "_là thanh ghi lỗ đen, và nó luôn trống. Nếu bạn xóa nó, không có gì trong bất kỳ thanh ghi nào được thay đổi, ngay cả ""thanh ghi mặc định hoặc chính thanh ghi lỗ đen. Văn bản bị xóa hoàn toàn biến mất, ngoài lịch sử hoàn tác của bạn. Yanking, hoặc dán từ thanh ghi lỗ đen về cơ bản không có gì.

Thanh ghi lỗ đen "_cho phép bạn thực hiện những việc như xóa đầu tiên, sau đó xóa một số thao tác xóa khác "_mà không thay đổi thanh ghi xóa nhỏ "-, sau đó dán thao tác xóa nhỏ đầu tiên.

Các thanh ghi khác là thanh ghi được chèn cuối cùng "., các thanh ghi tên tệp "%"#, thanh ghi lệnh ":, thanh ghi tìm kiếm "/và thanh ghi biểu thức "=.

Bạn có thể nhận được một danh sách tất cả các thanh ghi này và nội dung của chúng bằng lệnh :register. Lệnh đó rất hữu ích để thử nghiệm và tìm hiểu xem kết thúc ở đâu.


2

Tôi cần điều này thường xuyên, tôi đã viết một plugin để đơn giản hóa và cho phép tốc độ tối đa: Thay thếWithRegister .

Plugin này cung cấp một lệnh hai trong một grthay thế văn bản được bao phủ bởi một đối tượng văn bản {motion} /, toàn bộ dòng hoặc lựa chọn hiện tại với nội dung của một thanh ghi; văn bản cũ bị xóa vào thanh ghi lỗ đen, tức là nó đã biến mất. Nó xử lý trong suốt nhiều trường hợp góc và cho phép lặp lại nhanh chóng thông qua .lệnh tiêu chuẩn . Nếu bạn không thích nó, trang của nó có các liên kết đến các lựa chọn thay thế.


2

Để lặp lại dán, sử dụng lệnh thay đổi.

cw ^R0ESC (^ R = Control + R; 0 cho đăng ký 0)

sẽ thay thế từ bằng nội dung từ reg. 0 và hãy để bạn lặp lại nó với.

Điều này thật tuyệt vời cho cgn(VIM 7.4) để thay thế các mẫu tìm kiếm:

  • Tìm kiếm đầu tiên với /hoặc*
  • cgn ^R0ESC
  • .lặp lại ở trận đấu tiếp theo hoặc nbỏ qua

1

Vì nó chưa được bao gồm, bạn thường thay thế các chuỗi bằng :%s/.../.../và bạn cũng có thể làm điều này với từ dưới con trỏ của bạn.

  1. Bạn nhập phần đầu tiên của lệnh, thứ bạn đang tìm kiếm: :s/find/
  2. Sau đó, bạn bấm <ctrl-r>và chọn với con trỏ từ bạn muốn thay thế nó.
  3. Sau đó, bạn nhấp <ctrl-w>(từ "nhỏ") hoặc <ctrl-a>(từ lớn) để dán từ dưới con trỏ vào dòng lệnh
  4. Sau đó, bạn hoàn thành lệnh.

Xem liên kết về cách sử dụng công cụ con trỏ trong dòng lệnh .


1

Tôi thường sử dụng cái này: ywđể kéo foo, sau đó xóa barbằng dwvà là bước cuối cùng, đặt footừ thanh ghi 0chứa văn bản được sử dụng "0p. Lặp lại đặt với dấu chấm ( .) khi cần thiết.

Ngoài ra, thay vì ywdw, bạn có thể sử dụng yiwdiw(chú ý thêm i- có nghĩa là bên trong ). Với điều đó, bạn có thể kéo hoặc xóa từ bất kỳ vị trí nào bên trong nó, không chỉ ở đầu từ.


0

Tôi sử dụng plugin này để mở rộng vùng chọn: https://github.com/terryma/vim-Exand-region

Vì vậy, sự kết hợp của tôi để thay đổi một từ sẽ là: vvpở bất kỳ nơi nào của một từ.

Tôi cũng có một hack để lưu nội dung đăng ký không tên sau khi dán để tôi có thể lặp lại điều này.

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>

(clipboard của tôi là autoselect)


0

Tôi đang sử dụng ánh xạ khóa bên dưới để thay thế từ hiện tại bằng từ đã sao chép.
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiwsao chép một từ. Điều hướng đến một từ. ,rrthay thế từ.
Khóa trưởng là ánh xạ tới ,.


,rwsẽ có ý nghĩa hơn, và trên QWERTY có lẽ là một smidgen dễ dàng hơn và nhanh hơn để đưa ra. Trên DVORAK, tôi đã chọn ,rc, mặc dù nó hoàn toàn không có ý nghĩa gì, nó dễ dàng và nhanh hơn tất cả chúng. Trên DVORAK, ,rwlà một chương trình kinh dị;)
Paul Parker

0

Đầu tiên, điều hướng đến đầu của từ bạn muốn kéo dài. Nếu bạn đang ở giữa từ, chỉ cần làm bđể quay lại từ đầu của nó. Sau đó làm yeđể kéo toàn bộ từ, mà không có bất kỳ dấu cách nào ( yank to end). Cuối cùng, đi đến từ bạn muốn thay thế - có thể bằng cách thực hiện wmột vài lần - và thực hiện vepđể vào vchế độ lựa chọn thông thường, chọn đến từ ethứ hai và paste nội dung được kéo dài cuối cùng.

(Nếu bất cứ ai muốn biết lý do tại sao tôi không bình luận đơn giản về câu trả lời được chấp nhận, vì sửa đổi nhỏ yehơn là sử dụng yw, đó là vì danh tiếng của tôi trên ngăn xếp này vẫn còn quá thấp.)


0
  1. sử dụng ywđể kéo thế giới, đi đến thế giới mà bạn muốn thay đổi.
  2. sử dụng vđể chọn thế giới, vehoặc vwtùy thuộc vào tình huống của bạn.
  3. nhập pđể paster thế giới bạn đã sao chép để thay thế khối đã chọn

0

Thêm vào các câu trả lời khác tốt hơn. Một chút quá rõ ràng nhưng bạn có thể chỉ cần dán trước khi xóa. 'yw' sau đó chuyển từ bạn muốn thay thế, 'pldw' (dán, di chuyển đúng một ký tự, xóa 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.