Làm thế nào để đạt được sự lựa chọn chiều dài khác nhau của văn bản trên các dòng khác nhau?


10

giả sử tôi có các văn bản sau:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

Tôi muốn làm lựa chọn như dưới đây:

aaa-dd-e:"aaa",
bb-x:"bb",
c-9:"c"

Tôi đã thử sử dụng cv để tạo khối trực quan, nhưng sau khi tôi tạo vùng chọn trên cột đầu tiên và tôi nhấn "f:" (ý tôi là mở rộng vùng chọn thành dấu hai chấm trên mỗi dòng như trên), điều tôi nhận được là:

aaa-dd-e: "aaa" ,
bb-x: "bb",
c-9:"c"

lựa chọn dừng lại ở dấu hai chấm đầu tiên và tạo một hình chữ nhật.


6
Bạn muốn đạt được điều gì với lựa chọn đó, có thể có một cách khác
Arjen Dijkstra

Nếu nó được phân tách bằng ký tự, bạn có thể thử căn chỉnh lại khối trước và chọn nó sau đó. Xem: Chỉ căn chỉnh văn bản trên dấu phân cách đầu tiên trong VIM
kenorb

Câu trả lời:


6

Lựa chọn nói chung có nghĩa là kết thúc, hơn nữa ở Vim, nơi lựa chọn thường không cần thiết ở nơi đầu tiên.

Giả sử bạn vẫn muốn đặt dấu ngoặc kép quanh tên thuộc tính trong tệp không phải JSON của mình để biến nó thành JSON thích hợp:

  1. chọn các dòng để sửa đổi, thông minh nhân vật hoặc thông minh dòng, không thành vấn đề,
  2. :'<,'>norm I"^[f:i"( '<,'>được tự động chèn cho bạn và ^[được lấy bằng <C-v><Esc>).

Nếu bạn có plugin vòm đẹp, bước 2 trở thành:

:'<,'>norm ^vt:S"

Với sự thay thế, bước 2 có thể trở thành:

:'<,'>s/^\s*\([^:]*\):/"\1"

Các bạn nói đúng, bây giờ tôi thấy rằng lựa chọn trực quan có lẽ không cần thiết. với sự giúp đỡ hoặc :g/regex/norm, tôi có thể đơn giản đạt được bất cứ điều gì tôi muốn làm.
Aaron Shen

Có cách nào để tôi có thể đặt toàn bộ khối được chọn vào bảng tạm hệ thống và dán vào một tệp khác không?
Aaron Shen

Tất nhiên. Giả sử Vim của bạn được biên dịch với hỗ trợ clipboard mà bạn có thể thực hiện "+yhoặc "*y, tùy thuộc vào bảng tạm mà bạn muốn nhắm mục tiêu. Có rất nhiều câu hỏi liên quan xung quanh đây.
romainl

14

Vim chỉ hỗ trợ các lựa chọn khối hình chữ nhật, ngoại trừ đường viền bên phải lởm chởm khi bạn nhấn $.

Có các plugin (như vim nhiều con trỏ ) có thể mô phỏng nhiều lựa chọn, nhưng bạn cũng có thể đạt được mục tiêu thực tế của mình (ví dụ như bạn không đề cập đến) với các lệnh Vim thuần túy :global:substitute(nếu bạn có thể tạo thành một lệnh thông thường biểu thức phù hợp với lựa chọn trong mỗi dòng) hoặc bằng cách lặp lại các macro (nếu có một chuyển động cụ thể bao gồm lựa chọn trong mỗi dòng).


Nếu tôi muốn cắt những dòng đó và dán vào bộ đệm khác thì sao?
Aaron Shen

1

Chỉ cần ném một chiếc mũ khác vào vòng, nếu bạn thực sự muốn sử dụng lựa chọn trực quan, bạn có thể sử dụng plugin Tabular để sắp xếp các dấu hai chấm, sau đó thực hiện lựa chọn hình ảnh của bạn.

Nếu bạn lấy văn bản gốc của mình:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

:Tab /:\zs sẽ sắp xếp mọi thứ sau dấu hai chấm, như dưới đây

aaa-dd-e:  "aaa",
bb-x:      "bb",
c-9:       "c"

Và sau đó bạn có thể thực hiện lựa chọn khối hình ảnh của bạn.

Như những người khác đã nói, mặc dù, lựa chọn trực quan có lẽ không cần thiết trong tình huống này. Sử dụng normhoặc thay thế có thể có thể thực hiện những gì bạn muốn mà không phải lo lắng với các lựa chọn trực quan.


1

Tôi đã tìm thấy một giải pháp cho vấn đề này rất đơn giản! Bắt đầu chế độ khối hình ảnh từ dưới cùng của lựa chọn văn bản bạn muốn sao chép và chọn lên trên! Nó sẽ mở rộng khối khi bạn đi lên, trong khi nếu bạn tô sáng xuống dưới, nó sẽ xuất hiện để làm cho vùng chọn nhỏ hơn.


Nhưng theo cách này nó sẽ luôn là một khối hình chữ nhật, phải không? Khi tôi đọc nó, đây không phải là điều OP muốn (họ đề cập đến việc họ đã thử chế độ khối hình ảnh).
Martin Tournoij

Không. Nó sẽ luôn là một khối hình chữ nhật nếu tất cả các dòng có cùng độ dài. Tôi đã thấy rằng bắt đầu từ dưới cùng và tô sáng lên trên và sau đó nhấn $ để đi đến cuối dòng sẽ dẫn đến tất cả các dòng được tô sáng ở cuối dòng.
Arthur Bowers
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.