我知道,在 Vim 中(我想 Vi 也是如此),如果我想暂时访问 shell,我可以执行以下其中一项操作:
- 使用
:sh
(又名:shell
),然后从 shell 注销并返回 Vim - 使用
:sus
(又名:suspend
、:st
或:stop
),然后使用fg
返回 Vim - 用于
:! <command>
通过 Vim 向 shell 传递命令 - 使用
:mksession <filename>
保存会话,退出 Vim,然后在:source <filename>
返回 Vim 后使用 恢复会话(不可否认,这对于大多数“临时” shell 访问需求来说可能太麻烦了) - 使用窗口软件,如screen,tmux等。
:sh
我的问题是,前两个选项(使用和使用 )在技术和实际方面有什么区别:sus
?在 Vim 帮助页面中,似乎唯一的区别是使用:sus
,您要么自动写出缓冲区(如果设置了 'autowrite'),要么如果您不返回 Vim,则可能会丢失已编辑的缓冲区,而使用 ,:sh
您别无选择,只能在退出 shell 时返回 Vim 会话。
是否存在其他差异,无论是技术上的(例如内存和处理器的使用)还是与生产力相关的原因,为什么 Vim 用户在不同情况下可能会选择一种方法而不是另一种方法?
答案1
:suspend
对我来说,和之间最大的区别:shell
在于,前者,你回到了原装外壳,而后者则开始新的子壳。这意味着(非导出的)环境变量在前者中可用,但在后者中不可用。从性能角度来看,根据您的自定义(例如在~/.bashrc
),新 shell 的启动可能会带来明显的延迟。
一般来说,你的问题没有正确或错误的答案。Vim(因为它是Unix 哲学) 允许您查找和选择自己的风格。就我个人而言,我总是在 GVIM 中进行重大编辑,只使用控制台 Vim 进行简短的战术编辑(例如快速更改配置文件)。我还总是打开多个终端,所以我宁愿使用Alt+切换到另一个终端Tab,也不愿从 Vim 中退出。
答案2
使用:sh
创建一个新进程(该进程的子进程vi
)并运行一个新的 shell。 :sus
将编辑器置于挂起状态,并允许父母进程(通常是您的登录 shell 或窗口中的主 shell)重新获得控制权。因此会:sh
使用更多资源。但更大的区别是,如果您运行:sh
然后执行cd
(更改目录)、设置 shell 变量/环境变量、更改进程限制(ulimit
)或任何其他直接影响 shell 的操作,那么当您返回编辑器(通过退出 shell)时,这些效果将消失。相反,如果您返回主 shell,那么当您退出编辑器时效果仍然存在。
并且 Ingo 关于父 shell 中的(非导出)shell 变量在子 shell 中不可用的回答也是正确的。
哦,还有一件事::sh
可能会给你一个以 命名的 shell 实例$SHELL
。如果你的父 shell 是不同的,那么显然,这将是另一个区别。
编辑:
哦,我刚刚想到了其他一些事情:根据您使用的 shell(bash、C shell、zsh 等)以及您启用的设置,子 shell 可能无法访问主 shell 的命令历史记录(例如,或!-2
)↑↑。您可能已经注意到,在执行完fg
命令后,您必须键入才能返回编辑器。:sus
做添加到主 shell 的命令历史记录中。我经常保存并退出编辑器,然后立即对自己说:“哦!我忘了将“Humpty”改为“Dumpty”。然后键入!!
Enter以返回编辑器,结果却被!!
弹出命令的事实打了个措手不及。在 bash 中,您可以通过设置为(或将,用, 分隔的添加到现有列表(如果有))fg
来防止这种情况。HISTIGNORE
fg
fg
:
HISTIGNORE