Làm cách nào để thay thế một phần văn bản trong một khối văn bản đã chọn?


14

Không dễ để tìm một tiêu đề đẹp cho vấn đề của tôi.

Tôi biết về việc chèn trước một khối văn bản:

Ctrl- v chọn dòng I văn bản ESC

Bây giờ tôi muốn làm điều này nhưng cũng bằng cách thay thế một phần trong lựa chọn khối của tôi. Hiện tại tôi đang thực hiện hai thao tác

Ctrl- v chọn khối x quay lại để bắt đầu

Tiếp theo là trình tự tôi đã đề cập ở trên.

Có cách nào để kết hợp hai thao tác này bằng cách chọn ( Ctrl- v) khối chỉ một lần không?

Đây là một ví dụ nhỏ:

Tôi muốn chuyển đổi khối sau

1  text
2  text
3  text
4  text
5  text

vào

new text 
new text 
new text 
new text 
new text

chỉ thực hiện một "thao tác".


1
Tôi không chắc chắn 100% những gì bạn muốn, có thể một ví dụ thực tế sẽ giúp ích (những gì bạn có so với những gì bạn muốn). Bạn có biết về gv? Nó chọn lại lựa chọn hình ảnh cuối cùng và có thể giúp đỡ ở đây.
PhilippFrank

Câu trả lời:


21

Nhập csau khi chọn khối của bạn thay vì xsẽ xóa văn bản trong khối chọn và sẽ vào chế độ chèn. Khi bạn nhập một cái gì đó và thoát chế độ chèn, bạn sẽ có cùng một thay đổi trên mỗi dòng.

Thử

Ctrl- v- chọn khối - c- chèn bất cứ thứ gì -Esc


1
    1
   1 1
  1   1
 1111111
 1     1
 1     1
 1     1

Hình ảnh một hàng gồm ba chữ cái khối khác nhau như ở trên. ^Vchọn ở trên, tôi không thể thay đổi tất cả những cái Atrong chữ cái cuối cùng trong hàng do các dòng có độ dài không bằng nhau. Các chữ cái khối trước hoạt động tốt với :s/\%V1/T/g "Chữ cái khối trước là chữ T được tạo từ '1. Thay đổi /T/thành bất cứ thứ gì.

Nhưng việc chọn chữ cái khối cuối cùng được hiển thị ở trên, nó chỉ thay đổi tất cả '1' thành 'A' thành điểm A *, và phần còn lại vẫn là các chữ cái.

* Dòng ngắn nhất.

Để làm cho tất cả các dòng có cùng độ dài, tôi đệm chúng bằng khoảng trắng. (Tôi chưa quen với vim, vì vậy tôi chắc chắn một kịch bản tốt hơn có thể được viết.)

Lưu ý: Đỉnh của A bắt đầu trên dòng 2.

let Maxlen = 0
" Find longest line
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a > Maxlen
        Maxlen = a
    endif
endfor

" Append spaces 'til all lines are the same length.
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a < Maxlen
        let b = Maxlen - a
        execute "normal!" . i . "gg0" . b . "A "
    endif
endfor

Sau này, :s/\%V1/T/g làm việc như được quảng cáo trên chữ cái khối cuối cùng trong hàng.

PS Tôi đọc rằng executedòng trên nên hoạt động mà không có dấu chấm, nhưng nó không hoạt động với tôi.


Dòng thực thi, đi đến đầu hàng i của chữ cái khối và nối các khoảng trắng b vào cuối dòng. 'b' là sự khác biệt về độ dài giữa dòng hiện tại và dòng dài nhất.
Ron
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.