jqfeld / FTerm.nvim

:fire: No-nonsense floating terminal written in lua :fire:

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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 🔥

FTerm

Requirements

  • Neovim Nightly (0.5)

Install

use {
    "numtostr/FTerm.nvim",
    config = function()
        require("FTerm").setup()
    end
}
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 terminal

    Actually 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 and 1

    • 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:

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

gitui

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

bpytop

  • 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

About

:fire: No-nonsense floating terminal written in lua :fire:

License:MIT License


Languages

Language:Lua 100.0%