FTerm.nvim
My fork of numToStr's FTerm. I did some small modifications to fit my needs (e.g. allowing to use nnn as file explorer, see below).
🔥 No-nonsense floating terminal plugin for neovim 🔥
Requirements
- Neovim Nightly (0.5)
Install
- With packer.nvim
use {
"numtostr/FTerm.nvim",
config = function()
require("FTerm").setup()
end
}
- With vim-plug
Plug 'numtostr/FTerm.nvim'
" Somewhere after plug#end()
lua require('FTerm').setup()
Functions
-
require('FTerm').setup()
- To configure the terminal window. -
require('FTerm').open()
- To open the terminal -
require('FTerm').close()
- To close the terminalActually this closes the floating window not the actual terminal buffer
-
require('FTerm').toggle()
- To toggle the terminal
Configuration
Options can be provided when calling setup()
.
cmd
: Command to run inside the terminal. (default:os.getenv('SHELL')
)
NOTE: This is not meant for edit in the default terminal. See custom terminal section for use case.
-
dimensions
: Object containing the terminal window dimensions.The value for each field should be between
0
and1
height
- Height of the terminal window (default:0.8
)width
- Width of the terminal window (default:0.8
)x
- X axis of the terminal window (default:0.5
)y
- Y axis of the terminal window (default:0.5
)
-
border
: Neovim's native window border (default:single
). See:h nvim_open_win
for more configuration options.
Setup
require'FTerm'.setup({
dimensions = {
height = 0.8,
width = 0.8,
x = 0.5,
y = 0.5
},
border = 'single' -- or 'double'
})
-- Keybinding
local map = vim.api.nvim_set_keymap
local opts = { noremap = true, silent = true }
map('n', '<A-i>', '<CMD>lua require("FTerm").toggle()<CR>', opts)
map('t', '<A-i>', '<C-\\><C-n><CMD>lua require("FTerm").toggle()<CR>', opts)
Custom Terminal
By default FTerm
only creates and manage one terminal instance but you can create your terminal by using the underlying terminal function and overriding the default command.
Below are some examples:
- Running gitui
local term = require("FTerm.terminal")
local gitui = term:new():setup({
cmd = "gitui",
dimensions = {
height = 0.9,
width = 0.9
}
})
-- Use this to toggle gitui in a floating terminal
function _G.__fterm_gitui()
gitui:toggle()
end
Screenshot
- Running bpytop
local term = require("FTerm.terminal")
local top = term:new():setup({
cmd = "bpytop"
})
-- Use this to toggle bpytop in a floating terminal
function _G.__fterm_top()
top:toggle()
end
Screenshot
- Running nnn to open files
local term = require("FTerm.terminal")
local M = {}
local last_line = "last_line"
-- Return true if file exists and is readable.
function file_exists(path)
local file = io.open(path, "rb")
if file then file:close() end
return file ~= nil
end
local nnn = term:new():setup({
cmd = "nnn -p /tmp/nvim_fterm_nnn_pick",
term_opts = {
on_exit = function(id, data, event)
if file_exists("/tmp/nvim_fterm_nnn_pick") then
vim.cmd("e "..vim.fn.readfile("/tmp/nvim_fterm_nnn_pick")[1])
end
end
}
})
function M.nnn_toggle()
return nnn:toggle()
end
return M
Credits
vim-floaterm for the inspiration