2010-07-11 108 views
1

我已经使用了vi几十年了,现在正在练习使用vim,期待 最终完全切换到它。 我有很多问题,但我会从 麻烦最多的问题开始。我在vi中长期完成的工作是在我正在编辑的文件中键入 的底线命令,将其命名为 (例如,使用击键"ayy)并执行该缓冲区(使用 :@a^M)。这允许我编辑复杂的命令,直到它们正常工作,并保留我将多次使用的命令,因为我在文件中工作了 。 (我有 在我的.exrc文件减少这种使劲-和执行的 一个按键的映射;但这是不相关的我的问题。)在vim中执行命名缓冲区时处理特殊字符

我发现,在VIM,我需要很多更多^V s比vi。这个 一方面意味着当我在一个文件 中有一些命令行,我希望这样使用时,我现在需要保留在两个版本中,一个用于vi,一个用于vim。此外, 额外^V的要求似乎不雅:显然当在vim中执行命名缓冲区时解释一次被解释一次的各种特殊字符 在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

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

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

其中<bar>手段“在这里插入竖线”和<CR>手段“在这里插入一个回车”。参见:

:help key-notation 

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

0

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

据我所知,你不仅想要避免这么多的<C-V>字符,你还希望能够在vim和vi中使用相同的命令。不幸的是,这会阻止你使用(首选vim)key-notation。我认为你应该能够使用cmdline模式的按Ctrl - [R按Ctrl - [R寄存器为您排忧解难(:help c_<C-R>_<C-R>)。例如。

map <Leader>e mm^"ay$`m:<C-R><C-R>a<CR> 
  • mm - 标记光标位置,所以我们可以稍后返回
  • ^"ay$ - 抽出当前行到寄存器a(忽略月底开始处的空格和换行)
  • ``M` - 返回游标开始位置
  • : - 进入命令行模式
  • <C-R><C-R>a - 将置于寄存器a的内容放到命令行上,这似乎是vim vs vi的问题发挥的地方。我认为<C-R>a会给你现在看到的与:@a相同的行为。
  • - 执行整件事

使用该映射,我再输入你的map =f :w^V|e foo^M例如到一个文件中,放在我的光标在该行,跑我<Leader>e测绘,确认您的=f映射正确地加载,然后运行它。显然你会想要定制它以适应你的需求,但我认为玩<C-R><C-R>基本上会得到你想要的。

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