我已经使用了几十年的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。)
答案 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
(忽略开头的空格和结尾处的换行符):
- 输入命令行模式<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功能。 : - )