Làm thế nào để thay thế văn bản bên trong bằng văn bản kéo dài


17

Một mẫu chỉnh sửa tôi thường gặp phải như sau: Tôi muốn kéo một đoạn văn bản bên trong dấu ngoặc kép hoặc dấu ngoặc và thay thế đoạn văn bản đó bên trong một cặp dấu ngoặc kép / dấu ngoặc khác.

Ví dụ, nếu tôi muốn sao chép tên lớp foo barvà dán tên đó vào một nơi khác:

<span class="foo bar">

<div class="this-should-be-replaced-with-foo-and-bar">

Những gì tôi biết là thế này: Nếu tôi di chuyển bên trong lớp của span, tôi sử dụng yi"để kéo văn bản bên trong dấu ngoặc kép.

Bây giờ tôi có cái này trong sổ đăng ký của mình, vì vậy tôi có thể thay thế nội dung lớp của div bằng nó. Nhưng tôi không thể tìm thấy một cách hữu ích để làm điều này.

Nếu tôi sử dụng, ciwđiều này sẽ ghi đè lên sổ đăng ký của tôi với nội dung để thay đổi, vì vậy tôi sẽ mất văn bản bị mất.

Điều tốt nhất tôi có thể nghĩ ra là chuyển sang trích dẫn đầu tiên của lớp div, nhấn p, sau đó xóa sang trích dẫn tiếp theo dt".

Thông thường tôi làm hỏng vị trí của mình, và tôi dán nó ở đâu đó bên trong dấu ngoặc kép hợp nhất hai chuỗi, và nó đang làm mọi thứ rối tung lên.

Tôi hy vọng có một số cách để thực hiện kết hợp "thay thế văn bản bên trong bằng nội dung được đánh dấu của tôi" để làm cho việc này dễ dàng hơn.

Câu trả lời:


19

Bạn có thể sử dụng vi"pkhi bên trong "". Điều này có thể thay thế văn bản trong đăng ký yank, vì vậy nó quan trọng khi bạn muốn sử dụng văn bản được kéo mạnh ban đầu nhiều lần.

EDIT : Thông tin bổ sung từ bình luận của Octaviour liên quan đến việc làm cho nó có thể tái sử dụng nhiều lần:

Để làm điều đó, tôi sẽ kéo một thanh ghi có tên, thực hiện hai lệnh: "ayi"vi""apnếu bạn sử dụng thanh ghi a.


2
Tôi sẽ giải thích về giải pháp này. Trước tiên, bạn kéo văn bản bạn muốn sao chép. Sau đó, bạn đi đến nơi bạn muốn dán, chọn trực quan bằng cách sử dụng vi ". Một lệnh dán bây giờ sẽ đồng thời đặt nội dung của thanh ghi không tên vào con trỏ và xóa văn bản đã chọn. nó không thay thế nội dung của thanh ghi không tên, không cho phép bạn dán cùng một văn bản hai lần. Để làm điều đó, tôi sẽ kéo một thanh ghi có tên, điều này tạo ra hai lệnh: "ayi" và vi "" ap nếu bạn sử dụng đăng ký a.
Octaviour

Cảm ơn đã xây dựng. Nó giúp đánh vần mọi thứ với chuyển động vim, nó giúp bạn dễ nhớ hơn sau đó. Nó vẫn không dễ như tôi hy vọng, nhưng nó có ý nghĩa theo cách vim. Sử dụng lệnh dot để lặp lại và nhanh chóng thay thế lần thứ hai dường như không hoạt động. Tôi hy vọng đó sẽ là một phím tắt. :)
jurgenb

11

Bạn có thể sử dụng đăng ký đánh số. Đầu tiên "foo-bar" với yi", sẽ điền vào thanh "0ghi, xem :h "0. Sau đó làm ci"<c-r>0để thay thế bằng nội dung của thanh ghi 0.

Xem :h i_CTRL-Rđể mô tả về phần cuối cùng.


2
Tại sao không chỉ đơn giản là kéo nó trong thanh ghi không tên ( yi") và dán nó từ thanh ghi 0nơi nó được lưu trữ sau khi bạn xóa văn bản để thay đổi ( ci"<c-r>0)? Về mặt vimgolf, bạn giành được 2 tổ hợp phím và bạn không gặp rắc rối với các đăng ký của mình.
statox

ngay khi tôi nhấn 'a' tôi kết thúc ở chế độ chỉnh sửa, điều này không sao chép vào một đăng ký
jurgenb

@ n3wjack Điều đó có thể là do bạn chưa nhấn CTRL+rtrước đó a, điều đó <c-r>có nghĩa là gì .
statox

1
@ KarlYngveLervåg Trên thực tế ciwkhông đưa văn bản đã xóa vào thanh ghi không tên nhưng các thanh ghi bị thay đổi, đó là lý do tại sao bạn phải sử dụng <c-r>0thay vì <c-r>". Xem :h quote_number.
statox

1
Tôi sẽ nghĩ, cụ thể hơn, điểm ở đây không phải là về thanh ghi không tên, mà thay vào đó là về thanh ghi được đánh số. Thanh "0ghi chỉ được điền bởi lệnh yank và sẽ không bị làm phiền bởi vd c.
Karl Yngve Lervåg

8

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 bằng 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ế.


Tuyệt quá! Đây nên là vani vim.
Philipp Moers

8

Đây là một giải pháp khác. Nó không phải là tốt nhất trong thuật ngữ của Vimgolf, nhưng nó sử dụng thanh ghi lỗ đen:

Khi bạn đang ở trên foo barchuỗi, bạn có thể kéo nó bình thường bằng cách sử dụng yi".

Sau đó, bên trong ngoặc để thay đổi: "_di"P

Đó là:

"_       We will use the black hole register
di"      Delete the inner brackets and put the deleted text in the black hole register
P        Put the previously yanked text

Ưu điểm của thanh ghi lỗ đen là nó sẽ không gây rối cho các thanh ghi khác của bạn. Xem :h quote_để biết thêm chi tiết.

(Lưu ý rằng câu trả lời này chỉ có ở đây để nói về đăng ký bôi đen. Cá nhân tôi sử dụng lựa chọn trực quan theo đề xuất của @grodzik.)


Tôi nghĩ bạn cần một chữ hoa Pcho cái đó. Khi di"con trỏ của bạn sẽ được để lại trên dấu ngoặc kép cuối cùng và psẽ dán sau, nơi Psẽ dán trước vị trí hiện tại.
jecxjo

@jecxjo Đúng vậy, tôi đã chỉnh sửa câu trả lời của mình, cảm ơn!
statox
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.