从Vim脱壳时,如何使Shell别名可用?


11

在我的中.zshrc,我声明了一些别名。例如,which dbstart显示该别名的内容。

如果我从该shell打开vim,则它是一个子进程。在Vim中,我可以使用运行shell命令:! some_command。如果我确实:! echo $0要查看Vim使用的shell,它将输出'/ bin / zsh'。但是,我的别名在那里不可用。

从Vim剥壳时,如何使我的常规壳别名可用?

两个想法:

  • 以某种方式EXPORT,别名从原始shell到其子进程vim,再到其shell子进程
  • 配置Vim .zshrc在创建其子外壳时读取我的信息

将您的个人资料添加.zshrc到.profile中(似乎由vim
Kiwy 2014年

Answers:


13

古老的问题,但是zsh中vim的最干净的解决方案是将别名添加到~/.zshenv,zsh会为所有shell,登录名,交互名或其他方式加载该文件。这样可以避免用标志启动vim或zsh以及任何可能的问题。

~/.zshenvvs的解释很不错~/.zshrchttp : //tanguy.ortolo.eu/blog/article25/shrc

基本上,zsh始终是source ~/.zshenv。交互式shell源~/.zshrc和登录shell源~/.zprofile~/.zlogin。因此,交互式登录外壳程序源~/.zshenv ~/.zprofile ~/.zlogin ~/.zlogin和非交互式非登录外壳程序(如一个vim)仅用于运行命令source ~/.zshenv


这不是仅链接的答案,但是如果您内联解释与链接的不同之处,则最好。这样,每个人都可以从这里的解释中受益,而我们免受linkrot的伤害。
HalosGhost 2015年

1
使用链接中的要点更新了我的答案。
Kevin Lee

对我来说,这比其他答案好得多。当我添加vim以启动交互式shell时,它立即挂起。当我使用.zshenv文件(以前以前不知道存在)时,我又得到了别名!
卡列布(Caleb)2015年

5

看起来这适用于zsh:

  • 确保$ZDOTDIR=目录.zshrc位于。例如,export ZDOTDIR=$HOME
  • 在中.vimrcset shell=zsh\ -iset shellcmdflag+=i具有相同的效果。

-i是因为,当以交互方式启动时,zshell load $ZDOTDIR/.zshrc。查看man zsh并搜索$ZDOTDIR详细信息。


1
嗯,这给我造成了一个奇怪的问题:像"+y现在这样复制到系统剪贴板会挂起Vim!superuser.com/questions/712245/…–
内森·朗

5
我的vim一打开就被暂停。
卡雷布(Caleb)2015年

0

我相信当您vim使用:!some_command它时,它将使用环境变量定义的任何外壳$SHELL

这是可配置的,因此您可以通过覆盖文件中的$SHELL行为来进行更改$HOME/.vimrczsh代替使用。

:set shell
shell=/bin/bash
:set shell=zsh\ -i

或者在您.vimrc使用这2行中的1行

 set shell=/bin/bash\ -i
 set shell=/bin/zsh\ -i

Vim帮助

:help shell从内部vim获取更多信息。

:!{cmd}                 Execute {cmd} with the shell.  See also the 'shell'
                        and 'shelltype' option.
                        Any '!' in {cmd} is replaced with the previous
                        external command (see also 'cpoptions').  But not when
                        there is a backslash before the '!', then that
                        backslash is removed.  Example: ":!ls" followed by
                        ":!echo ! \! \\!" executes "echo ls ! \!".
                        After the command has been executed, the timestamp of
                        the current file is checked timestamp.

不,就像我说的:“如果我这样做:!echo $ 0以查看Vim使用的shell,它将输出'/ bin / zsh'”
Nathan Long

@NathanLong-不,我认为这会误导您,请参阅我的更新。
slm

@slm vim从中获取值$SHELL。所以你的外壳是/bin/bash。如果我的shell是/bin/zsh,那就使用它。
Patrick

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.