Vim/NeoVim 内置终端调教记

2020-01-11 17:37:22 +08:00
 skywind3000

Vim/NeoVim 的内置终端都发布了差不多两年了,但是大家还是习惯用 vim+tmux 的组合,宁肯在 tmux 里分割 split 也不肯使用 vim 的内置终端?

有没有办法让内嵌终端变得更好用一些呢?让它真的能帮到我们优化自己的工作流,提高操作的效率呢?学习了一圈 emacs / vscode 等编辑器的内嵌终端,我写了个 200 行的小脚本,对 vim/nvim 的内嵌终端进行一些简单的调教:

https://github.com/skywind3000/vim-terminal-help

这个小脚本对三个小地方进行了一些改进:

第一:提供一个 ALT+= 的快捷键可以像 vscode 的 CTRL+backtick 一样用来打开 /关闭终端窗口,不用每次输入 :terminal,同时新终端会把 shell 的工作目录初始化成你上面正在编辑的文件所在的目录,因为你大部分时候临时想搞点什么一般都是针对你当前正在编辑的文件来操作,那么初始化成当前文件的目录就避免了你每次打开终端再 cd 一半天:

(按 ALT+= 在正下方打开终端,路径自动帮你定位到上面文件所在目录)

所以工作流程就是你编辑着当前文档,突然想搞点啥然后 ALT+= 在正下方打开终端,敲几行命令,运行完了就再 ALT+= 把它收起来,整个流程十分顺畅。多次 ALT+= 不会无止境的打开新终端,只会复用已有的,而如果你再终端里输入了 exit 结束了 shell 进程,那么再次按 ALT+= 才会创建一个新的终端。

第二:初始化了一组快捷键 ALT+SHIFT+hjkl 用来在终端窗口和其他窗口之间跳转,很多 vim 用户过去都习惯设置 CTRL+hjkl 来做窗口跳转,普通窗口没问题,但是终端窗口下面,CTRL+hjkl 本身就是各种终端程序高频使用的组合键,你外面 tnoremap 覆盖掉了,里面你想运行个 fzf 都没有办法用 CTRL+j/k 在 fzf 里面上下移动光标了。因此这个小脚本鼓励大家使用新的 ALT+SHIFT+hjkl 来做窗口切换,这几个键在终端内相对用的少一些。

第三:在终端内提供一个名叫 drop 的命令,当你在终端中突然想编辑某个文件,直接 drop xxx 命令就能通知到外层的 vim 来打开该文件了,因为 vim 的当前目录和终端内 shell 的当前目录经常不一致,你在内嵌终端里 cd 到了 xcode 种很深的一层目录,这时想让外层的 vim 打开一个文件有多麻烦?先要切换会终端的 normal 模式去,然后在 vim 种输入常常的::e .... 后面接长长的一串路径名(因为二者当前路径不同)。所以这个 drop 命令(兼容 win/linux, vim/neovim )存在的意义就是让你能在终端内以最快捷的方式让 vim 打开一个文件。

--

我平时会用 vscode 来编辑 markdown,vscode 的 CTRL+backtick 切换内嵌终端的功能确实很顺手,我用的很多,用来运行命令行工具编译 /发布 markdown。而同样终端下的 emacs 的用户也基本都在用内置的各种终端,而很少用外面的 tmux。 所以从道理上来讲 vim/nvim 的内嵌终端应该是可以更好用一点的,不至于像现在这样很少被人用。

就像苹果的 airpod 耳机,其实无线耳机,其实技术上并没有什么新的东西,无线耳机好多年前就有了,但是用的人真的不多,而 airpod 做的其实也很简单,就是持续在不同的细节地方改进用户体验,然后把续航时间大大增长,最终量变积累形程质变,今天 airpod 如此受人欢迎。基于前面的经验,我想,或许,我们可以通过不断的改进内置终端的各处体验,最终真的让他帮助到大家。

我自己用了一段时间后发现,当然不能完替 tmux 操作,但代替了不少之前需要 vim+tmux 协同的工作,的确感觉到比以前的方便。就像以前我在 Windows 下从来不用 GVim 内置终端的,现在也开始用了,比如正在写 python 代码,发现需要安装个包,以前是要打开 windows 菜单,然后运行 cmd,然后再 pip install,打断太多了。现在同样的事情我就倾向于 ALT+= 打开内置终端(我配置的是 powershell ),然后 pip install 一个包,完事就 ALT+= 收起来,比以前顺畅太多,全键盘操作,工作流根本不会中断。

所以用了一段时间,又根据朋友的反馈做了一些调整优化,归纳成个小脚本共享出来,希望大家工作效率得到提升:

https://github.com/skywind3000/vim-terminal-help

--

7654 次点击
所在节点    Vim
10 条回复
ech0x
2020-01-11 18:18:52 +08:00
刚刚在知乎上看完😂
dongqihong
2020-01-11 18:26:14 +08:00
赞!刚使用了下,挺不错的,不过有个问题,我发现这个终端复用貌似只是在同一个 tab 下,如果我在另一个 tab 下运行 alt + = 会打开一个新的 terminal。
jdhao
2020-01-11 18:26:19 +08:00
资瓷!
skywind3000
2020-01-11 18:59:08 +08:00
@dongqihong , 对的,每个 tabpage 一个,故意做成这样的。
yfixx
2020-01-12 18:13:06 +08:00
资瓷一下
ensonmj
2020-01-16 13:14:12 +08:00
最大的问题,是远程使用无法保持会话。tmux 最大的优势是这个
skywind3000
2020-01-16 18:26:11 +08:00
@ensonmj 你说的没错,这玩意儿不是用来代替 tmux 的,是补充不足,我现在为了断线重新和多 window,我也会套一个 tmux,但是启动了 vim 后,大部分活计我用 vim 内嵌终端来完成了。
MrUser
2020-01-25 21:08:12 +08:00
使用 Alt + = 隐藏终端后,在使用 :q 退出 vim 时提示:
E947: Job still running in buffer "!/usr/local/bin/fish"
Press ENTER or type command to continue

按回车后显示的是用 Alt + = 打开的那个内置终端。
----
不能随 vim 一起退出么?
skywind3000
2020-02-02 04:27:56 +08:00
@MrUser Emacs 进程没结束完退出也会有这个提示,提醒你安全退出罢了。你不喜欢可以用:

let g:terminal_kill = "term"

来设置一个信号,退出 vim 时用 term 信号杀死所有后台 terminal 进程。
MrUser
2020-02-03 15:27:40 +08:00
@skywind3000
感谢感谢,让大神见笑了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/637112

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX