在上一篇文章中,我们熟悉了终端模式,并且配置了终端模式的一些操作。但是它总是有那么一点不符合我们的使用习惯。这篇我们将通过强大的插件来完善终端操作的体验。

在介绍插件之前让我们先回退到上一个版本,我们把上一篇文章中的配置全部从配置文件中剔除。先别着急喷我把各位小伙伴带到沟里去了,动态的调整自己的配置是常有的事,例如我发现了某些好用的插件、某些自己的配置可以淘汰一些插件又或者改变操作习惯等等原因都会导致我们修改配置。所以还是事先习惯的好。

toggleterm 插件介绍

在 packer 中我们使用如下语句来进行安装

use {"akinsho/toggleterm.nvim", tag = 'v2.*'}

如果我们用的是 7.0及以上的neovim,可以使用它的 v2版本,否则版本这里应该写上 v1

接着我们还是按照之前的惯例,新增一个配置文件并且在init.lua中引用

local opt = require("toogleterm").setup({})

之后我们可以使用 :ToggleTerm 来打开一个新终端

相关配置

我们可以对它进行一些简单的配置

local opt = require("toggleterm").setup({
open_mapping = [[]],
-- 打开新终端后自动进入插入模式
start_in_insert = true
-- 在当前buffer的下方打开新终端
direction = 'horizontal'
})

这里我们使用快捷键 来打开或者关闭终端。
我们使用 start_in_insert 配置打开新终端后自动进入插入模式,这样就不需要使用自动命令自己干这个事情了。
另外我这里仍然采用它默认的打开方式,默认在下方打开一个新终端,根据个人习惯可以改为弹出式窗口。根据官方文档,还支持 vertical、float、tab。相信各位小伙伴从名字上就能知道它们分别代表何种样式。

在之前介绍终端的时候说过,可以使用 来退出终端模式,这里我们仍然对它进行快捷键绑定,仍然使用 来退出终端模式

在退出终端模式之后,我们就可以使用相关快捷键来移动光标到指定窗口了,但是这里我们希望在终端模式中能够移动光标,所以这里还是使用快捷键映射的方式来解决这个问题

vim.api.nvim_set_keymap("t", "", "", {noremap = true, silent = true})
vim.api.nvim_set_keymap("t", "l", " wincmd l", {noremap = true, silent = true})
vim.api.nvim_set_keymap("t", "h", " wincmd h", {noremap = true, silent = true})
vim.api.nvim_set_keymap("t", "j", " wincmd j", {noremap = true, silent = true})
vim.api.nvim_set_keymap("t", "k", " wincmd k", {noremap = true, silent = true})

如果我们采取上一节的方案,将 l映射为 的话,会先退出终端模式,后续再回来终端的话,还得重新进入终端模式。这里我们希望不改变它的模式的情况下来进行移动操作,那么就只能使用命令模式了。我们之前介绍的执行命令都是以 :开头,但是它只局限于在普通模式下使用。我们在绑定快捷键时对应的真实按键会原封不同的在vim中进行输入,如果在插入模式中使用 :这种形式,就相当于在当前buffer中输入这些内容,也就是说我们无法在插入模式中使用普通模式那种格式的命令。

这里我们引入一个新的指令 它只能用于快捷键映射的场合,表示执行后面对应的命令。在普通模式下它的作用和使用 :相同,但是在vim会将键盘输入作为字符写入buffer的模式下使用 将会直接将这些作为命令。

另外在命令中我们无法再使用像之前在普通模式下使用的那些诸如 之类的移动光标的快捷键,这里我们使用 wincmd l来代替之前快捷键的功能。

自定义终端类型

使用自定义终端可以让我们在某些时候快速打开一些有特定用途的终端,例如 git 命令、htop 命令或者 python、node 等的交互式窗口。

这里我们以 python 和 htop 为例来介绍如何自定义这些自己的终端窗口。

为了自定义自己的终端我们需要先获取到 toggleterm插件提供的 Terminal 对象,利用这个对象的 new 方法来创建一个自己的终端。最后在需要弹出或者关闭终端的时候,调用 new 出来的终端对象的 toggle 方法。

new方法接受一个 table作为参数,用于定义新终端的各种属性,下面是几个重要的属性

  • cmd: 在新终端中执行的命令
  • direction: 终端打开的方式,与上面介绍的配置终端的 direction参数相同
  • dir: 执行命令的工作目录
  • env: 该命令使用的环境变量,以键值对的形式给出

了解了这些,我们来定义需要的终端。

local Terminal = require('toggleterm.terminal').Terminal
local pyterm = Terminal:new({
cmd = 'python',
direction = 'horizontal'
})
function python_toggle()
pyterm:toggle()
end
vim.api.nvim_set_keymap("n", "py", "lua python_toggle()", {noremap = true, silent = true})

这里我们定义了一个执行 python命令的终端,而且还定义了启动函数,最后定义了一个快捷键在命令行执行这一个启动函数,快速打开这么一个窗口

我们按照这个思路再来定义一个 htop 的窗口

local htopterm = Terminal:new({
cmd = 'htop',
direction = 'float'
})
function htop_toggle()
htopterm:toggle()
end
vim.api.nvim_set_keymap("n", "ht", "lua htop_toggle()", {noremap = true, silent = true})

到此为止,我们已经配置了一个基本可以使用的终端环境了,但是我还不知道该如何使用它同时打开多个窗口,这应该算是它的一个缺陷吧,如果有这个应用场景可以考虑使用 tmux加入工作流中。

本篇就到此为止了。