我通常使用 VIM,但必须在 VI 中摆弄文件。我记得 Solaris 2.5 上的 vi 是否有重复使用命令的历史?有时重新输入完整的行是很痛苦的。在 VIM 中我可以按 ESC、ESC、向上箭头。
答案1
不,不幸的是,SVR4 版本中没有历史记录支持vi
。
请注意,它不是vi
版本 4,而是“Version SVR4.0,Solaris 2.5.0”。该版本字符串是硬编码的,即使在最近的版本中也会报告(Solaris 2.5 大约有 18 年历史)。
从 Solaris 11 开始,vim
与操作系统捆绑在一起。
答案2
如果这足以满足您的需要,可以将击键vi
作为宏重播。这可以通过两种方式完成。
在这两种情况下,我都会先介绍相似的内容,vim
然后区分vi
。
1. 注册宏
这些都是以交互方式捕获和重放的。
1.1 vim
回想一下,在 中vim
,宏是通过在记录模式(从命令模式到达)下将一系列击键记录到寄存器来创建的。然后通过执行寄存器的内容来执行宏。
qa # 1. Enter recording mode, will save to register "a.
ihello<esc> # Type key strokes to insert string "hello".
q # Return to command mode.
@a # 2. Execute contents of register "a (insert "hello").
@@ # 3. Repeat last macro execution (insert "hello").
正如所提出的问题,这些步骤不会在 中使用vim
,而是使用应用程序的命令历史记录。
1.2 六
在 中vi
,上面的步骤 1 以不同的方式执行:宏内容必须以插入模式输入到缓冲区中,然后拉入/复制/等到寄存器中。
i # 1a. Enter insert mode.
ihello<ctrl-v><esc> # Type key strokes to insert string "hello", escaping necessary keys.
<esc> # Return to command mode.
"aY # 1b. Yank entire line to register "a (macro text should appear on a line by itself).
@a # 2. Execute contents of register "a (insert "hello").
@@ # 3. Repeat last macro execution (insert "hello").
2. 按键映射
这些可以交互地捕获或在适当的*rc
文件中捕获。
执行映射时,vim
和vi
都会等待 1 秒(默认)以接受构成映射单词的所有击键。
2.1 vim
:cmap lhs rhs<enter> # Map rhs-words to lhs-word for command-mode mappings.
:imap lhs rhs<enter> # for insert-mode mappings.
:map! lhs rhs<enter> # for command- and insert-mode mappings.
:map lhs rhs<enter> # for normal-mode mappings.
:nmap lhs rhs<enter> # for strict normal-mode mappings.
# Escape necessary keys in lhs and rhs.
# lhs "#n" means function key "n"
# Use vim's extensive symbolic key names.
:vmap # Other variants
:xmap
:smap
:omap
:lmap
:unmap lhs # Remove map
:nunmap # Other variants
:vunmap
:xunmap
:sunmap
:ounmap
:unmap!
:iunmap
:lunmap
:cunmap
2.1.1 示例
利用 的符号键名,使q
键写入并退出编辑器。vim
:nmap q :wq<CR><enter> # <CR> is typed as 4 chars, <enter> as 1.
2.2 六
:map lhs rhs<enter> # Map rhs-words to lhs-word for command-mode mappings.
:map! lhs rhs<enter> # for insert-mode mappings.
# Escape necessary keys in lhs and rhs.
# lhs "#n" means function key "n"
:unmap lhs # Remove map
2.2.1 示例
使q
键写入并退出编辑器。
:map q :wq<ctrl-v><enter><enter>