在 Vim 中,使用 :sus 和 :sh 在不结束 Vim 会话的情况下访问 shell 有什么区别?

在 Vim 中,使用 :sus 和 :sh 在不结束 Vim 会话的情况下访问 shell 有什么区别?

我知道,在 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来防止这种情况。HISTIGNOREfgfg:HISTIGNORE

相关内容