2013-02-01 35 views
19

我們都知道ci"ci'ci(ci[ ...一樣。非常方便,在日常的編輯,我發現了一些奇怪的事情,並檢查了幫助,沒」找不到爲什麼爲什麼詞」和CI(,CI {......不同的表現?

說,我有一個文件:

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

如果我的光標在開始每一行的,(在「f」),然後我鍵入詞」,詞',ci(...

cix只適用於引號(單或雙),不適用於括號。他們爲什麼表現不同?

dixvix相同)

與--noplugin測試,VIM 7.3

謝謝。

更新

感謝@romainl的答案。我至今還不清楚哪些

檢查這個例子中,「在vim對處理」:

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

如果我有像上面一條線,I型ci",不管光標在開頭或引號之間,它完美的作品,似乎vim確實有「配對」的想法?

這可能是你的意思嗎?

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

我具有上述兩行,如果(光標在x)I型ci"ci(,什麼都沒有發生到第二線,但第一行變成:

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

Vim不配對引號。它使用的啓發法非常簡單:向左掃描以找到''''或''',如果沒有命中,則向右重複,然後再向右重複以找到結尾引號。從未考慮到。 – glts

+4

另請參見[我的答案](http://stackoverflow.com/a/7804666/254635)「[在Vim中從括號外選擇文本內部的文本](http://stackoverflow.com/q/7803905/254635)」。 –

+0

@ib。並提供意見的thx。給予好評! – Kent

回答

13

ci(ci[一致, ci{cit和所有其他<action>i<something>。只有ci'ci"像他們一樣工作。異常值是引號,這裏不是括號。

Vim不認爲引號是在括號內成對出現的。它有一個內部邏輯,用於匹配與實際對一起使用的對,但不包含引號,因此不同之處在於行爲。

您不是第一個抱怨這種差異的人:this is one solution,也許您可​​以找到其他人。

編輯

我沒有Vim的內部有深入的瞭解,可惜,所以我只能做假設,在這裏。

如果你問Vim做ci"它盡最大努力找到一對雙引號,但雙引號不能成對:沒有辦法告訴"是閉合的還是開頭的是違背的括號。因此,Vim必須做出一些選擇。國際海事組織認爲,考慮到其他家庭成員的工作原理,最有意義的選擇是假定光標位於引號之間,並且從第一個到第一個到第一個的左側進行選擇。我只能假設這種方法在某種程度上被證明是錯誤的,或者由於某種原因而不起作用,而另一種方法(當前的方法)盛行。

另一種解釋可能是i<something>機制在某種程度上與特定子系統(可能與showmatch?相同)無法正確處理引號。

無論如何,就像你一樣,我發現這種差異很奇怪,我已經以某種方式內化了它,並將我的使用<action>i"與其他人的工作方式對齊。到實際上做2t"ci"或某些變體而不是ci"!我知道,效率低下。

您是否看過:h a'?我完全忘記了自己對這個問題的「有限理解」,但它在那裏!它說:

「只能在一行內工作,當光標開始在報價單上時,Vim將通過從行首搜索來找出哪些報價對形成一個字符串。

我從得到是這樣的:因爲某些原因我們未知的,Vim使用另一種機制比其他對匹配的報價,這就是爲什麼ci"cib和朋友的不同。根本原因根本不清楚,但我相當肯定,大局看起來很像我想象的。

對我來說,它看起來很像一個僞裝成功能的bug或限制。

如果您仍然好奇,我建議您詢問關於vim-dev的任何進一步問題。

+0

感謝您的答案。我仍然有一些疑慮,我更新了這個問題,以獲得更好的格式支持。你能看看嗎?謝謝。 – Kent

+0

@Kent,請參閱我的編輯。 – romainl

+0

謝謝你的解釋!我會在.vimrc中做一些映射,試圖讓它們表現相同。答案接受! – Kent