Cách thay thế nhiều hơn một ký tự mà không cần vào chế độ chèn


12

Tôi có một tập tin với một dòng trông như thế này:

foofoo.xy.barbar

Tôi muốn thay đổi xythành gh. Tôi đã cố gắng thực hiện 2r-> gh, nhưng rõ ràng điều đó không hiệu quả, vì nó đã thay thế xybằng ggvà sau đó di chuyển con trỏ của tôi một điểm sang trái.

Có cách nào để làm điều này mà không cần vào chế độ chèn, hoặc không sử dụng nhiều tổ hợp phím hơn (ví dụ :s/xy/gh/) không?


2
Rvào Chế độ thay thế. :help replace-modeđể biết thêm thông tin.
alxndr

Tôi đã thử vt.rgh. Nhưng kết quả giống như của bạn ngoại trừ vị trí con trỏ.
Gonçalo Ribeiro

2
Tại sao bạn không muốn vào chế độ chèn? Một cái gì đó như cwgh<esc>sẽ làm việc tốt.
Doorknob

1
@ durron597 Tôi không chắc liệu đó minimize-keystrokescó phải là một thẻ tốt hay không, nó thường không thực sự là câu hỏi , như vậy. (Tôi đã từ chối các chỉnh sửa được đề xuất của bạn) ... Có lẽ bạn nên thảo luận tại meta?
Martin Tournoij

Câu trả lời:


19

Nếu văn bản mới có cùng độ dài với văn bản cũ, chế độ thay thế của Vim là một tùy chọn. Từ chế độ bình thường, R(đó là chữ "r") đưa bạn vào chế độ thay thế. Điều này tương tự như "ghi đè" trong một số trình soạn thảo văn bản khác: thay vì chèn các ký tự mới như trong chế độ chèn, gõ sẽ thay thế ký tự dưới con trỏ, sau đó chuyển sang con trỏ tiếp theo. (Hãy nghĩ về nó giống như chữ thường r, nhưng không chỉ là một ký tự đơn lẻ.) Tìm tài liệu cho chế độ thay thế bằng :help replace-mode.

Trong trường hợp của bạn: với con trỏ giữa .x, hãy vào để thay thế chế độ bằng cách nhấn R. Bây giờ khi bạn nhập gnó sẽ thay thế "x" và chuyển sang ký tự tiếp theo, vì vậy bạn có thể nhập hđể thay thế "y". Chỉnh sửa của bạn được thực hiện ngay bây giờ, vì vậy Escapeđể trở về chế độ bình thường.

(Điều này hoạt động khi văn bản thay thế của bạn có cùng độ dài với văn bản cũ, nhưng nếu thay thế của bạn dài hơn hoặc ngắn hơn, ccó thể là tất cả những gì bạn cần: nó sẽ thay thế 1 văn bản trong một chuyển động, với văn bản bạn nhập. nhiều cách để thực hiện sử dụng c, ví dụ: với con trỏ giữa .x, ct.ABCEscapenói với c Hange văn bản (up ' t il tiếp theo .) với 'ABC').


1 Nó sẽ kéo văn bản trong chuyển động vào thanh ghi tên / "đăng ký và sau đó chuyển sang chế độ chèn, để bạn có thể nhập một cái gì đó để thay thế nó, và sau đó Escapetrở lại chế độ bình thường.


2
Điều này làm việc cho trường hợp này. Nếu bạn muốn thay thế 2 ký tự đó bằng cách nói 3 ký tự thì sao?
Gonçalo Ribeiro

1
Câu hỏi hay; sửa đổi để bao gồm một cách để xử lý văn bản có độ dài khác nhau.
alxndr

Vâng, tôi biết cách đó. Nhưng theo cách đó bạn vào chế độ Chèn và tôi tò mò muốn xem liệu có cách nào không sử dụng chế độ Chèn trong trường hợp đó không. Không phải tôi nghĩ rằng nó rất hữu ích (nhưng tôi có thể sai).
Gonçalo Ribeiro

1
Tiền tố với một chữ số nđể thay thế cho nlần xuất hiện thứ-thứ của ký tự đích. Điều này rất hữu ích để thay thế các bộ phận của nhãn bằng định dạng w_x_y_za-b-c-d. Sử dụng fthay vì tđể loại bỏ các nhân vật giới hạn là tốt.
pkfm

5

Có một vài cách bạn có thể làm điều này, nhưng cách đơn giản nhất tôi có thể nghĩ là:

TL; DR

fxcw<REPLACEMENT TEXT>

Giải trình

  • fxđưa bạn đến x (xem help *f*)
  • cwnói để thay đổi từ (xem :h *c*, :help *w*:help cwđể biết thêm thông tin), xóa văn bản "xy" và vào chế độ chèn, cho phép bạn đặt bất cứ thứ gì bạn muốn ngay tại đó.
  • <REPLACMENT TEXT> là bất cứ điều gì bạn muốn thay thế nó bằng - "gh" trong ví dụ của bạn.

Một lợi thế của phương pháp này là nó sử dụng các lệnh điều hướng & thao tác văn bản được sử dụng rất phổ biến. Một điều nữa là "xy" có thể có độ dài bất kỳ, và điều này vẫn sẽ hoạt động.

Các cwtác phẩm vì đối tượng văn bản của bạn được bao quanh bởi dấu chấm ( .), đóng vai trò là ranh giới của từ.

Nếu con trỏ của bạn đã có ký tự "y" (hoặc bất kỳ ký tự nào trong văn bản sẽ được thay thế), bạn có thể sử dụng ciw<REPLACEMENT TEXT>. Điều này nói với vim để thay đổi từ bạn đang ở, ngay cả khi bạn không ở đầu từ đó. Xem :help text-objectsđể biết thêm thông tin về ciwvà các đối tượng văn bản nói chung.


Sẽ không nơi này anh ta trong chế độ chèn?
elyashiv

1
À - không nắm bắt được phần nào câu hỏi của anh ấy. Trong trường hợp đó, có - R là giải pháp thích hợp nhất.
Thăm dò ý kiến ​​Cody

3

Chế độ thay thế:

Rgh<Esc>

là giải pháp rõ ràng nhất nếu thay thế có cùng độ dài với bản gốc nhưng bạn cũng có thể làm:

2sgh<Esc>

hoặc là:

cegh<Esc>
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.