我已经习惯了Emacs,但是我正在试用Vim,看看我更喜欢哪个。

我喜欢Emacs的一点是能够在Emacs内部运行终端。这在Vim内部可能吗?我知道您可以从Vim执行命令,但我希望能够在选项卡中运行终端。


当前回答

有人已经建议https://github.com/Shougo/vimshell.vim,但他们没有提到原因。因此,当我离开这个问题时,我浪费了很多时间去尝试其他(排名更高的)选项。

Shougo/vimshell就是答案。原因如下:

除了作为终端模拟器外,VimShell还允许您以正常和可视模式在终端输出中导航。因此,如果您运行的命令导致您只想使用键盘复制和粘贴输出…VimShell涵盖了这一点。

上面提到的其他选项,包括NeoVim中的:terminal命令,都不能做到这一点。截至2017年2月18日,Neovim的终端已经接近,但至少在以下方面还不够:

将光标移动到缓冲区的末尾,而不是像VimShell那样将光标保持在最后一个位置。太浪费时间了。 不支持modifiable = 1参见Github上的讨论,所以像vim-easymotion这样的有用插件不能使用。 不像Vimshell那样支持显示行号。

不要在其他选择上浪费时间,包括Neovim的:终端。用VimShell吧。

其他回答

最终,一个原生的:terminal命令于2017年添加到vim中。

下面是:terminal自述的节选:

此特性用于在Vim窗口中运行终端模拟器。一个 作业可以连接到终端模拟器启动。例如, 运行一个shell: :任期bash 或者运行build命令: :term make myprogram 作业从Vim异步运行,窗口将更新为 在另一个窗口中编辑时显示作业的输出。

到目前为止,我已经尝试了很多这里提到的解决方案,我真正想要的是保持终端开放,同时在VsCode中编码类似的体验。然后我发现了一个对我非常有效的解决方法。

在安装之前:

我正在使用Nvim 0.5,但我认为它可以用于任何版本,并在vim上进行检查 我使用的是macOS卡特琳娜10.15.7版

设置集成终端

步骤1 -

创建名为myQuickTerminal的脚本。Vim或者任何你想要的名字。 输入以下脚本

"==============================================================================
"
" ▒█▀▀█ █░░█ ░▀░ █▀▀ █░█   ▀▀█▀▀ █▀▀ █▀▀█ █▀▄▀█ ░▀░ █▀▀▄ █▀▀█ █░░
" ▒█░▒█ █░░█ ▀█▀ █░░ █▀▄   ░▒█░░ █▀▀ █▄▄▀ █░▀░█ ▀█▀ █░░█ █▄▄█ █░░
" ░▀▀█▄ ░▀▀▀ ▀▀▀ ▀▀▀ ▀░▀   ░▒█░░ ▀▀▀ ▀░▀▀ ▀░░░▀ ▀▀▀ ▀░░▀ ▀░░▀ ▀▀▀
"
"==============================================================================
" " This is a script that will trigger a terminal quickly than the FloatTerminal
" open new split panes to right and below
"link: https://betterprogramming.pub/setting-up-neovim-for-web-development-in-2020-d800de3efacd
"==============================================================================
set splitright
set splitbelow
" turn terminal to normal mode with escape
tnoremap <Esc> <C-\><C-n>
" start terminal in insert mode
au BufEnter * if &buftype == 'terminal' | :startinsert | endif
" open terminal on ctrl+n
function! OpenTerminal()
  split term://zsh
  resize 10
endfunction
nnoremap <leader> n :call OpenTerminal()<CR>

注意:如果你因为特定的原因想运行bash而不是zsh,那么用bash替换zsh。

步骤2 -

我们来源它,把它放到init中。Vim代表neovim或'。Vimrc '表示vim

source $HOME/.config/nvim/modules/mySpecialScripts/myQuickTerminal.vim

这将在您保存和资源它之前预加载,您可以使用源$MYVIMRC快速重新加载初始化。vim文件。

步骤3 -

我映射,你可以看到在脚本n打开一个终端在一个新的窗格,我是(空格键),一旦我点击(空格+ n)终端将被触发,我将享受写我的代码,而终端是打开的。

按“Esc”键退出终端插入模式。 现在,要切换到代码编辑器窗格,使用CTRL+w w。一旦打开了两个以上的面板,这个快捷键就会变得很烦人,所以我也添加了以下快捷键。 我也映射了这些,以便在打开的窗格中快速跳转,使用这些

" Better window navigation
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

可选

如果你想让你的终端用键退出当前缓冲区。你可以使用

tnoremap <Esc> <C-\><C-n>:q!<CR>

但是因为我想在我使用的几个缓冲区之间切换而不关闭我使用的终端:

tnoremap <Leader><Esc> <C-\><C-n>:q!<CR>

最终结果


参考:

https://betterprogramming.pub/setting-up-neovim-for-web-development-in-2020-d800de3efacd

我解决这个问题的方法是:

用Ctrl + Z暂停Vim, 在终点站玩, 然后只需输入命令fg,就可以返回到您离开Vim时的位置。

我不确定你到底想要实现什么(我从未使用过Emacs),但你可以在Vim中通过键入以下命令来运行命令:

:! somecommand [ENTER]

如果你想输入几个命令,或者在shell中玩一会儿,你总是可以使用:

:! bash (or your favourite shell) [ENTER]

一旦命令或shell终止,您将得到按Enter返回编辑器窗口的选项

Vim是有意轻量级的,并且缺乏执行非编辑类型事情的能力,就像在Vim窗格/选项卡中运行一个完整的shell一样,但正如上面提到的,有第三方插件,如Vim -shell,允许您执行这类事情。

通常情况下,如果我想在Vim和shell (Bash)之间切换,我只需按CTRL+Z暂停Vim进程,在我的shell中玩,然后当我想返回Vim时键入'fg' -保持我的编辑器和shell良好且独立。

假设你的vim版本首先支持+term命令,将shell设置为vim在一个命令中使用(例如set=/usr/bin/zsh),然后运行命令+term(即bo 15vs +term)。你可能需要对你的Windows做一些额外的操作(例如删除一个并旋转),但你会有你的终端。