2013-02-01 37 views
19

chúng ta đều biết những gì ci"ci'ci(ci[ .... Rất tiện dụng trong chỉnh sửa hàng ngày. Tôi tìm thấy điều gì đó lạ và kiểm tra trợ giúp, đã không ' t tìm hiểu tại saoTại sao ci "và ci (, ci {.... hành xử khác nhau?

nói, tôi có một tập tin:.

foo "target" 
foo 'target' 
foo (target) 
foo {target} 
foo [target] 
foo <target> 

nếu con trỏ của tôi tại bắt đầu của mỗi dòng, (trên 'f'), sau đó tôi gõ ci", ci ', ci (...

cix chỉ hoạt động với dấu ngoặc kép (đơn hoặc đôi), không hoạt động cho dấu ngoặc vuông. tại sao họ cư xử khác nhau?

(dix, vix giống nhau)

thử nghiệm với --noplugin, vim 7.3

cảm ơn bạn.

Cập nhật

nhờ @romainl cho câu trả lời. Tôi vẫn nghi ngờ về việc "xử lý cặp trong vim"

kiểm tra ví dụ này:

foo "targ\"eti\" some\"thing else " 

nếu tôi có một dòng như trên, tôi gõ ci", không có con trỏ vấn đề là ngay từ đầu hoặc giữa dấu ngoặc kép, nó hoạt động hoàn hảo, có vẻ như vim không có ý tưởng về "cặp"?

và điều này có thể là ý của bạn về ghép nối?

foo "target x some"thing else " 
foo (target x some(thing else) 

tôi đã ở trên hai dòng, if (con trỏ tại x) Tôi gõ ci"ci(, không có gì xảy ra với dòng thứ 2, nhưng dòng đầu tiên thay đổi thành:

foo "I"thing else " (I is cursor) 
+3

Vim không ghép nối dấu ngoặc kép. Các heuristic nó sử dụng thực sự là rất đơn giản: Quét trái để tìm một '' 'hoặc' '' Lặp lại ngay nếu không có hit. Sau đó lặp lại ngay lập tức một lần nữa để tìm báo giá đóng cửa. không bao giờ được tính đến. – glts

+4

Xem thêm [câu trả lời của tôi] (http://stackoverflow.com/a/7804666/254635) cho câu hỏi "[Chọn văn bản bên trong dấu ngoặc đơn từ bên ngoài dấu ngoặc đơn trong Vim] (http://stackoverflow.com/q/7803905/254635) ". –

+0

@ib. và glts, thx cho các ý kiến. upvote! – Kent

Trả lời

13

ci( là phù hợp với ci[, ci{cit và tất cả các số khác <action>i<something>. Chỉ ci'ci" hoạt động giống như vậy. Các ngoại lệ là các dấu ngoặc kép, ở đây, không phải là dấu ngoặc đơn.

Vim không xem xét các dấu ngoặc kép sẽ theo cặp trong khi dấu ngoặc đơn thực hiện. Nó có một logic nội bộ cho các cặp phù hợp với các cặp thực tế nhưng không phải với dấu ngoặc kép do đó sự khác biệt về hành vi.

Bạn không phải là người đầu tiên khiếu nại về sự khác biệt đó: this is one solution, có thể bạn có thể tìm thấy những người khác.

chỉnh sửa

Tôi không có một kiến ​​thức sâu sắc về internals của Vim, không may, vì vậy tôi chỉ có thể đưa ra giả định, ở đây.

Nếu bạn yêu cầu Vim làm ci", tốt nhất là nên tìm một cặp dấu ngoặc kép nhưng dấu nháy kép không theo cặp: không có cách nào để biết liệu một số " có đóng hay không dấu ngoặc đơn. Do đó, Vim phải thực hiện một số lựa chọn. IMO, lựa chọn có ý nghĩa nhất khi xem xét các thành viên khác trong gia đình làm việc như thế nào, giả định rằng con trỏ nằm giữa dấu ngoặc kép và chọn từ dấu ngoặc đơn đầu tiên sang phải sang trái đầu tiên. Tôi chỉ có thể giả định rằng phương pháp này đã chứng minh sai một cách nào đó hoặc không hoạt động vì một lý do nào đó và phương thức khác (phương thức hiện tại) chiếm ưu thế.

Một giải thích khác có thể là cơ chế i<something> bằng cách nào đó được liên kết với một hệ thống phụ cụ thể (có thể giống như showmatch?) Không thể xử lý chính xác với dấu ngoặc kép.

Dù sao, cũng giống như bạn, tôi thấy sự khác biệt này lạ và tôi đã bằng cách nào đó nội bộ hóa nó và liên kết việc sử dụng của tôi là <action>i" để những người khác hoạt động như thế nào. Để thực sự thực hiện 2t"ci" hoặc một số biến thể thay vì ci" !! Không hiệu quả, tôi biết.

Bạn đã đọc :h a'? Tôi hoàn toàn quên mất nơi tôi có "sự hiểu biết hạn chế" của tôi về vấn đề này nhưng nó đã ở đó! Nó nói:

"Chỉ hoạt động trong một dòng. Khi con trỏ bắt đầu một dấu ngoặc kép, Vim sẽ tìm ra cặp ngoặc kép nào bằng cách tìm kiếm từ đầu dòng."

Những gì tôi nhận được từ rằng đây là: đối với một số lý do không rõ cho chúng tôi, Vim sử dụng một cơ chế cho phù hợp với dấu ngoặc kép so với các cặp khác và đó là lý do tại sao ci" là khác nhau từ cib và bạn bè. Nguyên nhân cơ bản không rõ ràng nhưng tôi khá chắc chắn rằng bức tranh lớn trông rất giống với những gì tôi tưởng tượng.

Với tôi, nó trông rất giống một lỗi hoặc giới hạn được cải trang thành một đối tượng địa lý.

Nếu bạn vẫn còn tò mò, tôi khuyên bạn nên hỏi thêm bất kỳ câu hỏi nào trên vim-dev.

+0

cảm ơn câu trả lời. Tôi vẫn còn một số nghi ngờ, tôi cập nhật câu hỏi, để có được hỗ trợ định dạng tốt hơn. bạn có thể lấy một cái nhìn? cám ơn. – Kent

+0

@Kent, vui lòng xem chỉnh sửa của tôi. – romainl

+0

cảm ơn bạn đã giải thích! Tôi sẽ thực hiện một số ánh xạ trong .vimrc của tôi để cố gắng làm cho chúng hoạt động giống nhau. câu trả lời được chấp nhận! – Kent

Các vấn đề liên quan