我正在尝试修复我使用的某个平台上 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
一些替代方案:
删除
\n
使用substitute(string, '\n$', '', '')
查看:h NL-used-for-Nul
技术背景删除所有控制字符:
substitute(string, '[[:cntrl:]]', '', 'g')
使用匹配 (
=~
) 操作而不是相等 (==
)进行比较删除 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'")