我正在尝试为Windows配置Neovim。这种配置的关键之一是访问终端仿真器(切换和使用Vim终端非常方便)。但我无法让它发挥作用。我使用Neovim二进制文件/ Neovim-qt。我可以使用!
无问题地运行shell命令。
我还试图尝试使用shell和shellquote vars,但它也不能正常工作。
我尝试使用Bash(MSYS2)代替cmd.exe,但仍然没有运气。 (!
仍有效)
问题可能是shell变量或某些权限。
我非常感谢任何帮助!
答案 0 :(得分:1)
我认为在init.vim
中使用/usr/bin/bash command not found
可能足以处理shell问题。
我按照中的建议尝试了vim风格
http://vim.wikia.com/wiki/Use_cygwin_shell。这打破了vim-fugitive和vim-plug的错误提示,例如cannot create leading directory
(通过git push,git log)或$TERM
(通过vim-plug克隆repos时)。在我禁用它们之后,逃犯和插头再次工作。
这个select distinct b.name from product p inner join brand b on p.brand_id=b.id where p.cat=3
选项可能很有用:https://neovim.io/doc/user/term.html# $ TERM
答案 1 :(得分:0)
花了我很多年的时间,但终于有了Git Bash作为缓冲,并且!命令。我只在Windows 7上进行了测试,但这可能对您同样有效。
安装Git for windows,它也提供了一个Git Bash环境,我假设它称为C:\ Program Files(x86)\ Git \ bin \ bash.exe。如果您拥有32位系统或要在Windows上使用64位Git,则需要在以下脚本中将〜2更改为〜1。
您现在应该可以使用以下命令从常规Windows CMD提示符下启动git bash:
cmd.exe /c "C:\Progra~2\Git\bin\bash.exe --login -i"
将以下代码添加到您的vimrc文件中。假设您已使用Windows安装程序安装了NeoVim,则init.vim脚本应位于%APPDATA%/ .. / Local / nvim。有关如何从其他地方获取vimrc文件以配置NeoVim的信息,请参见this answer。
" Terminal settings
:tnoremap <C-[> <C-\><C-n>
if has("win32")
" Note, you need to empty the file Git\etc\motd
" to get rid of the 'Welcome to Git' message
set shell=cmd.exe
set shellcmdflag=/c\ \"C:\\Progra~2\\Git\\bin\\bash.exe\ --login\ -c\"
" Leader c for commandline, Leader e to exit
nmap <Leader>c :term<CR>acmd.exe /c "C:\\Progra~2\Git\bin\bash.exe --login -i"<CR>
:tnoremap <Leader>e exit<CR>exit<CR>
endif
第一个命令重新映射Control- [以退出终端模式,这看起来很自然,但默认情况下并非如此。实际上不需要设置shell = cmd.exe,因为这是在Windows上安装vim时的默认设置,但是如果您以后要调整运行的内容以在此处安装它,将很有帮助。
运行:term
将执行不带shellcmdflag的shell。使用:!ls
会将shellcmdflag
传递给shell
,然后传递命令。这个shellcmdflag值告诉cmd.exe运行bash,bash依次得到类似的-c标志和命令。
接下来的两行映射<Leader>c
以启动bash终端,而<Leader>e
则退出终端进程。之后按Enter键将关闭缓冲区。这种方法的好处是您可以运行:term
来获取Windows命令提示符,并且还可以为Git Bash使用<Leader>c
。默认的领导者键是“ \”,我已将其绑定到空格键。
如脚本中所述,Git Bash附带了一条欢迎消息,您可能希望将其清空,因此:!ls
仅显示ls的输出。它在C:\ Program Files(x86)\ Git \ etc \ motd中。
不幸的是,这确实破坏了:r!ls
。使用默认设置:set shellcmdflag=/s\ /c
,:r!dir
将目录列表放入当前缓冲区。但是,您可以使用system('ls')
来达到相同的效果-对于自定义绑定,此解决方法的额外冗长无关紧要。
不幸的是,在终端创建绑定的末尾添加clear<CR>
无效;因此bash终端始终以显示打开bash的CMD命令开头。