删除 vim 变量中的空字符?

删除 vim 变量中的空字符?

我正在尝试修复我使用的某个平台上 vim 的 Backspace 行为。我bad_platform从系统get_platform命令中获取了此平台的名称(称之为)。按照中的建议:help fixdelete,并结合如何执行系统命令的知识,我在 .vimrc 中添加了以下内容:

let platform_name = system("get_platform")
if platform_name == "bad_platform"
  set t_kb=^?
  fixdel
endif

这不起作用。为了找出原因,我打开了 Vim 会话并执行了:echom platform_name。结果为bad_platform^@^@我猜是 NULL 字符,而不是输入“shift-6 shift-2”后得到的两个字符。

不幸的是,这带来了一个问题。我无法将其更改为== "bad_platform^@",因为当获取 .vimrc 时,似乎^@将其解释为行尾字符。这意味着let platform_name = substitute(platform_name,"\^@","","")在之前添加if也不起作用。

我该如何处理这个问题?提前致谢。

答案1

一些替代方案:

  1. 删除\n使用substitute(string, '\n$', '', '') 查看:h NL-used-for-Nul技术背景

  2. 删除所有控制字符: substitute(string, '[[:cntrl:]]', '', 'g')

  3. 使用匹配 ( =~) 操作而不是相等 ( ==)进行比较

  4. 删除 system() 命令输出的最后一个字节

    :let a=system('foobar')[:-2]

答案2

Vim 将字符串中的换行符表示为空字符,因此,您的系统命令返回的字符串末尾带有换行符(这是应该的),而 Vim 将其转换为空字符。您只需要在末尾删除该换行符(表示为空字符):

let platform_name = substitute(system('get_platform'), '\n\+$', '', '')

(请注意,如果使用双引号而不是单引号,则必须在现有反斜杠前添加额外的反斜杠来转义它们。)

\n请注意,模式中使用的原因与我上面解释的原因相同;Vim 对字符串中换行符的表示为空。

答案3

就像其他人所说的那样,vim 将换行符表示为空。删除换行符的另一种方法是使用 shell 命令。以下任何一种方法都可以。

let platform_name = system('echo -n "$(get_platform)"')
let platform_name = system('printf "%s" "$(get_platform)"')
let platform_name = system("get_platform | tr -d '\\n'")

相关内容