Tại sao ci "có thể nằm ngoài vùng được trích dẫn và ci (chỉ hoạt động bên trong dấu ngoặc đơn?


27

Khi sử dụng ci"con trỏ không phải nằm trong khu vực được trích dẫn kép.

|String somestring = "some text";

Giả sử đường ống là vị trí con trỏ, ci"sẽ làm cho nó nhảy đến khu vực được trích dẫn.

Mặt khác, khi sử dụng ci(, con trỏ phải nằm trong dấu ngoặc đơn để hoạt động và sẽ không di chuyển con trỏ bên trong chúng.

Lý do cho sự khác biệt trong hành vi này là gì? Tôi giả sử có một cách để ánh xạ các khóa để hành vi này có mặt. Có bất kỳ nhược điểm để làm điều này?


Câu trả lời:


25

Sự khác biệt chính ở đây là các câu lệnh gốc (được nhắm mục tiêu ci() có thể được lồng nhau, trong khi các chuỗi được trích dẫn (được nhắm mục tiêu ci") không thể.

Nếu con trỏ của bạn nằm ngoài một số câu lệnh gốc, nó vẫn có thể nằm trong một câu lệnh khác. Ví dụ: ( *đánh dấu vị trí con trỏ):

$foo = array(
    'x' => ar*ray(1, 2, 3),
);

Dòng con trỏ đang chứa (1, 2, 3), nhưng con trỏ cũng nằm trong array(...)khối lớn hơn . Trong trường hợp này, cái lớn hơn là mục tiêu thích hợp cho ci(.

Nếu con trỏ của bạn nằm ngoài một số chuỗi được trích dẫn, vì chúng không thể được lồng vào nhau, thì không có điều gì hoàn toàn hợp lý để làm. Vì vậy, Vim tận dụng lợi thế và tìm chuỗi trích dẫn đầu tiên trên dòng.


10

Gia đình quote của các đối tượng văn bản ( i', i", a', và a") là khác nhau hơn so với phần còn lại của các đối tượng văn bản ở chỗ chúng chỉ nhìn vào dòng hiện tại. Do đó, sự lựa chọn đã được đưa ra không yêu cầu con trỏ phải nằm trong dấu ngoặc kép. Thay vào đó, Vim sẽ tìm kiếm phía trước trong dòng để tìm một chuỗi được trích dẫn khi con trỏ chưa ở trong một chuỗi.

Có một cuộc thảo luận xung quanh một số bản vá cho phép thực hiện hành vi tìm kiếm chuyển tiếp này cho các đối tượng văn bản dựa trên khối.


8

Các câu trả lời khác bao gồm tại sao điều này xảy ra. Đây là một cách hay để làm việc xung quanh nó.

giếng / mục tiêu.vim . Tôi mới tìm thấy plugin này và tôi nghĩ nó cực kỳ bị đánh giá thấp. Nó cung cấp một đối tượng văn bản mới: din(Mnemonic:. (D) elete (i) nside (n) ext "(" Đây là tương thích với các nhà khai thác khác và các đối tượng khác nhau, chẳng hạn như an(, in", il((bên trong ngoặc trước)

Nó cũng ghi đè hành vi mặc định của i(nó để lần đầu tiên nhìn xem con trỏ có nằm trong ngoặc đơn hay không, và nếu nó không hoạt động giống như in(. Hành vi này có thể được bật hoặc tắt. Ví dụ:

def foo(bar):
^cursor here

ci(hoạt động giống như cin(, vì con trỏ không nằm trong ngoặc đơn.

def foo( ):
        ^Cursor here, and in insert mode

Điều này cũng chấp nhận một số lượng:

def foo(bar):           #Define function foo(bar)
^cursor here

Đánh máy c2in(:

def foo(bar):           #Define function foo( )
                                             ^cursor here

Điều này cũng cung cấp một đối tượng mới, "đối số". Ví dụ: danacó nghĩa là "Xóa xung quanh đối số tiếp theo". Điều này cũng chấp nhận một tính. Ví dụ:

def foo(arg1, arg2, BADarg3):
^ cursor here

Đánh máy d3ana:

def foo(arg1, arg2):
                  ^ cursor here

nhiều tính năng khác mà plugin này có, nhưng đây là những tính năng cơ bản.


1
Tốt đẹp! Đây là một bổ sung tốt. Tôi có thể phải kiểm tra xem.
Reaver

Câu trả lời tuyệt vời 10/10 nhưng tôi phải cho điểm 9/10 vì các ví dụ là con trăn
Downgoat
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.