Vimscript 字符串

2018-02-24 16:02 更新

接下來我們講字符串類型。鑒于Vim是用來編輯文本的,你將頻繁地跟這一類型打交道。

執(zhí)行下面的代碼:

:echom "Hello"

Vim將輸出Hello。目前為止,依然如此。

連接(Concatenation)

在日常編程中你經(jīng)常需要把字符串連接到一起。執(zhí)行下面的命令:

:echom "Hello, " + "world"

發(fā)生什么了?不知為何,Vim顯示0!

這就是問題所在:Vim的+運算符_僅僅_適用于數(shù)值。當你把一個字符串作為+的參數(shù)時, Vim會在執(zhí)行加法前嘗試把它強制轉(zhuǎn)換成一個Number。(譯注:在21章的練習里你真的喝了啤酒沒) 執(zhí)行下面的命令:

:echom "3 mice" + "2 cats"

這次Vim顯示5,因為字符串被相應地轉(zhuǎn)換成32。

當提到"Number"時,我明確_指的是_Number類型。Vim不會強制轉(zhuǎn)換字符串為Float類型! 為求證我的話,試試下面的命令:

:echom 10 + "10.10"

Vim顯示20,因為在強制轉(zhuǎn)換10.10成一個Number時,小數(shù)點后的內(nèi)容都被丟棄了。

你需要使用連結運算符來連接字符串。執(zhí)行下面命令:

:echom "Hello, " . "world"

這次Vim顯示Hello, world。.是Vim中的"連接字符串"運算符,可以用來連接字符串。 它不會在其間插入空格或別的什么東西。

Vim會在.兩邊進行強制轉(zhuǎn)換。試試這個命令:

:echom 10 . "foo"

Vim將顯示10foo。首先它把10強制轉(zhuǎn)換成字符串,接著把它跟右邊的字符串連接在一起。 不過當涉及到Float類型時,情況有點糟糕。執(zhí)行這個命令:

:echom 10.1 . "foo"

這次Vim拋出一個錯誤,聲稱我們把Float當作String了。Vim樂于讓你在執(zhí)行加法時把String當作Float, 卻_不爽_你在連接字符串時把Float當作String。

故事的最后告訴我們一個道理:Vim酷似Javascript:它有時允許你逍遙自在地馬虎對待類型差異, 但切莫這樣做:因為出來混,遲早都要還的。(because it will come back to bite you at some point)

寫Vimscript的時候,確信你清楚寫下的每一個變量的類型。如果需要改變變量類型,你就得使用一個函數(shù)顯式改變它, 即使那不是必要的。不要依賴Vim的強制轉(zhuǎn)換,畢竟世上_沒有_后悔藥。

特殊字符

就像大多數(shù)編程語言,Vimscript允許你在字符串中使用轉(zhuǎn)義字符串來表示"打不了"的字符。 執(zhí)行下面命令:

:echom "foo \"bar\""

字符串中的\"將如你所愿地被替換成雙引號。轉(zhuǎn)義字符串在大多數(shù)情況下都會如你所愿。 執(zhí)行下面的命令:

:echom "foo\\bar"

Vim顯示foo\bar,因為\\是表示'\'的轉(zhuǎn)義字符串,一如大多數(shù)編程語言。 現(xiàn)在執(zhí)行下面的命令(注意那是echo不是echom):

:echo "foo\nbar"

這次Vim將顯示兩行,foobar,因為\n會被替換為換行?,F(xiàn)在試試下面的命令:

:echom "foo\nbar"

Vim將顯示類似foo^@bar的詭異信息。當你對字符串使用echom而不是echo時, Vim將輸出字符串中_額外的_字符,這意味著有時echom的輸出跟echo的會有所不同。?^@在Vim里表示"換行符"。

字符串字面量

Vim也允許你使用"字符串字面量"(譯注:如Python中的r"")來避免轉(zhuǎn)義字符串的濫用。 執(zhí)行下面命令:

:echom '\n\\'

Vim顯示\n\\。使用單引號將告訴Vim,你希望字符串所見即所得,無視轉(zhuǎn)義字符串。 一個例外是一行中連續(xù)兩個單引號將產(chǎn)生一個單引號。(譯注:相當于某種轉(zhuǎn)義)試試這個命令:

:echom 'That''s enough.'

Vim將顯示That's enough.。兩個單引號是字符串字面量里_唯一_的特殊序列。

在本書稍后的部分,我們將重新審視字符串字面量的更多內(nèi)容。(那時我們會深陷于正則表達式)

真值(Truthiness)

你可能想知道Vim怎么對待用在if語句中的字符串。執(zhí)行下面的命令:

:if "foo"
:  echo "yes"
:else
:  echo "no"
:endif

Vim將顯示no。如果你搞不懂為何如此,你應該重讀關于條件語句的那一章(譯注:第21章), 因為我們在那里已經(jīng)討論過了。

練習

閱讀:help expr-quote。查看在一般的Vim字符串中允許的轉(zhuǎn)義字符串列表。找出如何插入一個tab字符。

嘗試找出一種方法,_不_使用轉(zhuǎn)義字符串來插入一個tab字符。提示:閱讀:help i_CTRL-V

閱讀:help literal-string。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號