Cách thay thế văn bản giữa các dấu ngoặc kép trong vi


106

Giả sử tôi có dòng mã này:

$query = "SELECT * FROM table";

Có lệnh nào trong vi / vim có thể xóa ngay lập tức mọi thứ giữa các dấu ngoặc kép và định vị con trỏ giữa chúng để tôi có thể bắt đầu nhập không?

Câu trả lời:


182

Sử dụng ci", có nghĩa là: thay đổi những gì bên trong dấu ngoặc kép.

Bạn cũng có thể thao tác các đối tượng văn bản khác theo cách tương tự, ví dụ:

  • ci' - thay đổi bên trong các dấu nháy đơn
  • ciw - thay đổi bên trong một từ
  • ci( - thay đổi bên trong dấu ngoặc đơn
  • dit - xóa bên trong thẻ HTML, v.v.

Tìm hiểu thêm về các đối tượng văn bản vim khác nhau tại đây .


2
Có vẻ như chỉ làm việc với vim, nhưng KHÔNG vi. (Không chắc chắn)
Ivan Chau

Đối với tôi, điều này chỉ hoạt động trên dòng hiện tại, không phải ở bất kỳ đâu trong tài liệu.
Và cuối cùng

lệnh nào sau đó sẽ làm điều này ngược lại? Đó là nếu bạn muốn thay thế văn bản bên trong dấu ngoặc kép đằng sau con trỏ.
dtburgess

1
@dtburgess: Một cách là F"ci".
Eugene Yarmash

ci' và ci" hoạt động tốt, nhưng ci (không làm việc cho Bất cứ ai cho tôi bất kỳ ý tưởng tại sao.?
VRAM Vardanian

24

Bạn có thể chọn giữa các dấu ngoặc kép và sau đó xóa ( d), thay đổi ( c), v.v. bằng cách sử dụng

vi"

Tương tự, bạn có thể thay thế các dấu ngoặc nhọn, dấu ngoặc nhọn, các phần tử XML, v.v. do đó:

vi(
vi{
vit

hoặc đơn giản là thay đổi / xóa, thực hiện tương ứng di", ci"v.v. Việc thay thế acho isẽ bao gồm các phần tử xung quanh ( ví dụ: bạn đánh dấu hoặc thay đổi dấu ngoặc nội dung)


5

Tôi đã tạo một plugin vim-textobj-quotes: https://github.com/beloglazov/vim-textobj-quotes

Nó cung cấp các đối tượng văn bản cho các cặp dấu ngoặc kép gần nhất của bất kỳ loại nào và hỗ trợ các dấu ngoặc kép kéo dài nhiều dòng. Chỉ sử dụng iqhoặc aqnó cho phép bạn thao tác trên nội dung của dấu nháy đơn ('), kép (") hoặc dấu ngoặc kép (`) hiện đang bao quanh con trỏ, ở phía trước con trỏ hoặc phía sau (theo thứ tự ưu tiên đó) Nói cách khác, nó nhảy về phía trước hoặc phía sau khi cần thiết để đạt được dấu ngoặc kép.

Dễ hiểu hơn bằng cách xem các ví dụ (con trỏ được hiển thị với |):

  1. Trước: foo '1, |2, 3' bar; sau khi nhấn diq:foo '|' bar
  2. Trước: foo| '1, 2, 3' bar; sau khi nhấn diq:foo '|' bar
  3. Trước: foo '1, 2, 3' |bar; sau khi nhấn diq:foo '|' bar
  4. Trước: foo '1, |2, 3' bar; sau khi nhấn daq:foo | bar
  5. Trước: foo| '1, 2, 3' bar; sau khi nhấn daq:foo | bar
  6. Trước: foo '1, 2, 3' |bar; sau khi nhấn daq:foo | bar

Các ví dụ trên được đưa ra cho dấu ngoặc kép đơn, plugin hoạt động giống hệt như cách đối với dấu ngoặc kép (") và dấu ngoặc kép (`).

Bạn cũng có thể sử dụng bất kỳ nhà khai thác khác: ciq, diq, yiq, viq,, vv

Vui lòng xem trang github được liên kết ở trên để biết thêm chi tiết.


3

Từ bên trong các dấu ngoặc kép, bạn có thể làm

di"

Đọc nó như xóa bên trong "


6
Con trỏ không cần phải nằm trong chuỗi dụng dấu ngoặc kép, như giá trị mặc định lệnh để thay đổi chuỗi ví dụ đầu tiên trong dòng
Eugene Yarmash

1
Cảm ơn rất tốt để biết! Chỉ là đi xem tôi nên đọc mọi thứ cẩn thận hơn một chút. :)
Sam Peacey

3

Ngoài câu trả lời của Brian, bạn cũng có thể p(dán) và y(kéo) giá trị mới, vì vậy nếu bạn muốn thay thế giá trị bên trong dấu ngoặc kép bằng một giá trị khác, bạn có thể thực hiện yi"trên lựa chọn mà bạn muốn sao chép, vi"để chọn khu vực mà bạn muốn thay thế và sau đó chỉ cần pthay thế đúng giá trị.


0

Câu trả lời đã chọn CHỈ phù hợp với ViM nhưng KHÔNG phù hợp với vi. Câu hỏi này cũng không chính xác vì tác giả đã không đề cập đến vị trí ban đầu của con trỏ là gì. Nếu chúng ta giả sử rằng con trỏ nằm trong dấu ngoặc kép thì đối với vi câu trả lời sẽ là:

T"ct"

Ở đâu:

T "- lùi lại ngay sau ký tự"

c - lệnh thay đổi

t "- cung cấp vị trí kết thúc cho lệnh c, nơi nó sẽ ngừng xóa ký tự, nói cách khác là phạm vi thay đổi

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.