view dot_config/nvim/lua/terminal.lua @ 336:7a8b66395d69

Add floating terminal to be toggled via c-z
author zegervdv <zegervdv@me.com>
date Thu, 21 Jan 2021 09:17:28 +0100
parents
children
line wrap: on
line source

-- Copied from: https://github.com/kutsan/dotfiles/blob/b2046a6c0bcc754fc381351119c14c374721fd4d/.config/nvim/lua/kutsan/mappings/normal/terminal.lua

local api = vim.api
local fn = vim.fn

local terminal = {
  buf = nil,
  win = nil,
  pid = nil
}

terminal.open = function ()
  -- Create buffer.
  local buf = nil

  if terminal.buf and api.nvim_buf_is_loaded(terminal.buf) then
    buf = terminal.buf
  else
    buf = api.nvim_create_buf(false, true)
  end

  -- Create window.
  local width = math.ceil(vim.o.columns * 0.8)
  local height = math.ceil(vim.o.lines * 0.9)

  local win = api.nvim_open_win(buf, true, {
    relative = 'editor',
    style = 'minimal',
    width = width,
    height = height,
    col = math.ceil((vim.o.columns - width) / 2),
    row = math.ceil((vim.o.lines - height) / 2 - 1),
  })
  api.nvim_win_set_option(win, 'winhighlight', 'Normal:CursorLine')

  -- Launch terminal.
  if not terminal.buf then
    terminal.pid = fn.termopen(string.format('%s --login', os.getenv('SHELL')))
  end

  vim.cmd('startinsert')
  vim.cmd("autocmd! TermClose <buffer> lua require('terminal').close(true)")

  -- Save current handles.
  terminal.win = win
  terminal.buf = buf
end

terminal.close = function (force)
  if not terminal.win then
    return
  end

  if api.nvim_win_is_valid(terminal.win) then
    api.nvim_win_close(terminal.win, false)
    terminal.win = nil
  end

  -- Force close upon terminal exit.
  if force then
    if api.nvim_buf_is_loaded(terminal.buf) then
      api.nvim_buf_delete(terminal.buf, { force = true })
    end

    fn.jobstop(terminal.pid)

    terminal.buf = nil
    terminal.pid = nil
  end
end

terminal.toggle = function ()
  if not terminal.win then
    terminal.open()
  else
    terminal.close()
  end
end

return terminal