在vim中执行命名缓冲区时处理特殊字符

时间:2010-07-11 03:14:42

标签: vim

我已经使用了几十年的vi,现在正在练习使用vim,期待 最终完全切换到它。 我有很多问题,但我会从那个问题开始 我最烦恼。我在vi中做的一件事就是打字 在我正在编辑的文件中的底线命令,将其拉到命名缓冲区 (例如,使用击键"ayy)并执行该缓冲区(使用 :@a^M)。这允许我编辑复杂的命令直到它们 工作正确,并保持我将多次使用的命令 在文件中工作。 (我有 在我的.exrc文件中有一个映射,可以将此yank-and-execute减少为a 单键击;但这与我的问题无关。)

我发现在vim中,我需要比vi更多^V s。这个 一方面,当我在文件中有一些命令行时 我希望用这种方式,我现在需要把它保持在两个 版本,一个用于vi,一个用于vim。另外,要求了 额外的^V似乎是不优雅的:显然是各种特殊字符 在vi中执行命名缓冲区时解释一次 当它在vim中执行时会被解释两次 - 但为什么呢?

例如,表格

的命令

map =f :w^V|e foo^M

(映射击键序列=f以写入当前文件 并转到文件foo)在vi中以这种方式工作,但必须具有

形式

map =f :w^V^V|e foo^V^M

在vim中。 (在这两个命令中,^ V是通过输入^ V ^ V得到的, 通过输入^ V ^ M得到^ M;所以输入第一个版本 涉及键入三个^V s,第二个,七个。)成为 确切:第一个版本确实在vim中工作 将其键入底线(带有指示的额外^V s); 但后者在执行的命名缓冲区中是必需的。

任何解释?我能解决这个问题吗? (“兼容” 似乎没有这样做。)任何希望它将来会被修复 发布? (我使用的系统使用7.0版。)

(我应该承认我不是程序员;只是有用户 精通vi。)

2 个答案:

答案 0 :(得分:2)

就个人而言,我完全停止使用^ V.在Vim(我不知道Vi)中,有各种关键符号可以解决你遇到的问题。对于您的具体示例,我建议:

map =f :w<bar>e foo<CR>

其中<bar>表示'在此处插入竖线',<CR>表示'在此处插入回车'。参见:

:help key-notation

了解更多信息。我发现<CR>^V^M更容易理解。

答案 1 :(得分:0)

这是一种使用:@的有趣方式,这是我之前没有想到的。当我需要编辑复杂的命令时,我通常只使用命令行历史记录,而且我倾向于将常见或复杂的命令保存为我的.vimrc中的映射或命令(当然,我有一个映射可以在我的.vimrc中弹出我的.vimrc新标签)。但是使用vim的普通模式而不是命令行模式来编辑复杂的命令肯定有好处。

据我了解,您不仅要避免这么多<C-V>个字符,还希望能够在vim和vi中使用相同的命令。不幸的是,这将阻止您使用(vim中的首选)key-notation。我认为您应该可以使用cmdline模式的 Ctrl - R Ctrl - R 注册 帮助您(:help c_<C-R>_<C-R>)。 E.g。

map <Leader>e mm^"ay$`m:<C-R><C-R>a<CR>
  • mm - 标记光标位置,以便稍后返回
  • ^"ay$ - 将当前行放入注册a(忽略开头的空格和结尾处的换行符)
  • ``m` - 将光标返回到起始位置
  • : - 输入命令行模式
  • <C-R><C-R>a - 将寄存器a literal 内容放在命令行上,这似乎是vim与vi的问题发挥作用的地方。我认为<C-R>a会为您提供与:@a
  • 相同的行为
  • - 执行整个事情

使用该映射,然后我将map =f :w^V|e foo^M的示例键入文件,将光标放在该行上,运行<Leader>e映射,验证您的=f映射已正确加载,然后运行它。显然你会想要自定义它以满足你的需求,但我认为用<C-R><C-R>来玩你基本上可以得到你想要的东西。

所有这些都说,如果可以的话,我强烈建议大胆尝试并忘记与vi的兼容性。然后,您可以使用更简单的key-notation和许多其他vim功能。 : - )