当我用 Vim 将从电子书中复制的文本粘贴到源代码中时,我遇到了问题,“不可中断空格”在编译时会导致 gcc 出现错误消息。
典型的错误信息是:
filename.c:69:6: error: stray ‘\302’ in program
69 | <U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0><U+00A0>return 1;
我使用过的简单解决方案是运行:%s/\%ua0/ /g
- 使它们成为常规空间。
有没有办法让这种情况在 Vim 中输入时自动发生(即从终端粘贴),例如命令或设置.vimrc
?
我不知道是否有办法自动执行您想要的操作。但是,我的方法就是使用 vim命令将特定的键序列映射到要执行的命令。实际上,这会设置一个新命令,您可以在文本插入模式之外
map
输入该命令。为了说明这个概念,这里有我的 .vimrc 文件中的两个映射(我用来
^M
表示嵌入的换行符。您可以通过键入<Control>+v
后跟 来嵌入它<Enter>
。第一个映射
MM
导致运行两个 shell 命令。第一个命令是clear
,第二个命令是make
。第二个映射
FF
执行搜索以突出显示表单的文本${<something>}
(我使用它来突出显示模板文件中的占位符变量)。根据上面的例子,我认为下面的操作可以实现你想要的效果(选择你想要的任何按键序列;我只是用它
UU
作为例子):如果您使用上述映射,那么无论何时键入
UU
(在文本插入模式之外),都会执行全局搜索和替换。复制粘贴的理念是逐字逐句地插入复制的内容。一旦你决定即时更改它,你就会遇到意想不到的情况。
您首先粘贴,然后在第二遍中删除不间断空格的想法似乎已经是一个好主意。您可以使用Ciaran 的回答中所述的按键绑定来加快该过程。
话虽如此,您可以在离开插入模式时使用自动命令删除不间断空格。但需要注意的是,这将删除所有不间断空格,而不仅仅是您刚刚粘贴的空格。这将导致不必要的行为,例如当您的源代码包含包含不间断空格的 Unicode 字符串时。
要仅为 C 文件启用此功能,请添加一个缓冲区本地自动命令,
~/.vim/after/ftplugin/c.vim
如下所示:请
:help :autocmd
参阅一般参考和:help InsertLeave
特定事件。另请参阅守卫:help :augroup
的解释augroup
。要将您的解决方案推广到其他非 ASCII 字符,另请参阅如何让 Vim 突出显示非 ASCII 字符?