2010-11-15 28 views
2

我試圖解決在Vim腳本中使用^ @(即<[email protected]>)字符的問題。我可以將它們插入到腳本中,但腳本運行時似乎該行在^ @所在的位置被截斷。如何在Vim腳本中使用'^ @'?

到目前爲止,我的kludgy解決方案是將一個^ @存儲在一個變量中,然後在腳本中引用該變量,只要我引用一個文字^ @。有人能告訴我這裏發生了什麼事嗎?有沒有更好的解決這個問題的方法?

回答

4

這就是爲什麼我從不在腳本中使用原始特殊字符值的原因之一。雖然^@不起作用,串<[email protected]>在映射正常工作,所以您可以使用的

nnoremap <[email protected]> {rhs} 
nnoremap <Nul> {rhs} 

令人奇怪的是一個,但你不能在這裏使用<Char-0x0>。關於字符串中空字節的一些注意事項:

  1. 將空字節插入字符串會截斷它:vim使用以空字節結尾的舊C風格的strigs,因此它不能出現在字符串中。這些字符串效率非常低,因此如果要生成非常大的文本,請嘗試將其累積到行列表中(使用setline非常快,因爲緩衝區表示爲行列表)。
  2. 返回字符串列表(如readfilegetline(start, end))或採取字符串列表大多數功能(如writefilesetlineappend)治療\n(NL)爲空。這也是緩衝線的內部表示,見:h NL-used-for-Nul
  3. 如果您嘗試在命令行中插入\n字符,將顯示Null(但這實際上是換行符)。如果你想編輯一個文件名爲\n的文件(它可能在* nix上),你需要在前面添加帶反斜槓的換行符。
+0

我試圖抓取使用'redirect = >>'到消息緩衝區的輸出到一個變量。當我捕獲由嵌入式'python'命令生成的輸出時,重定向的文本具有^ @個字符,看起來就像是行尾。我需要一些方法來替換這些字符的實際行尾。我發現的唯一方法是將重定向文本的第一個字符(它似乎總是是^ @)抓到變量中。然後我可以在替代命令中引用該變量。我認爲有一種更可靠的方法將^ @值填入變量中:例如'let myvar = 0x0'? – 2010-11-15 22:25:32

+0

@Herbert Sitz。字符串變量中不能有空。如果你想用null替換文字'^ @'(兩個字符),唯一的方法就是將整個字符串變成一個字節列表(用整數值表示)([Int]),然後執行操縱它。或者把這個字符串傳遞給python腳本,做替換,並且永遠不會傳回給vim。 – ZyX 2010-11-19 17:13:31

+1

@Herbert Sitz如果你想解析vim腳本重新生成的python異常,那麼'throw'命令顯示的'^ @'實際上是一個換行符:'throw'假定異常消息中沒有換行符,並且根據':h NL-used-for-Nul'顯示換行符。所以,像substitute(string,'\^@',「\ n」,'g')'應該就足夠了。 – ZyX 2010-11-19 17:17:17

2

字節[email protected]也被稱爲'\0'。許多語言,程序等將它用作「字符串的結尾」標記,所以vim在那裏變得混亂並不奇怪。如果你必須在腳本字符串中使用這個字節,這聽起來像你的解決方法是一個體面的。