/tabnine-nvim

Tabnine Client for Neovim

Primary LanguageHTML

Tabnine Chat Support

tabnine-nvim

Tabnine client for Neovim

Tabnine Neovim client

Table of Contents

Install

Note this plugin requires having Neovim version >= v0.7

The Unix build script requires curl and unzip to be available in your $PATH

Unix (Linux, MacOS)

Using vim-plug

  1. Add the following in your init.vim
call plug#begin()
Plug 'codota/tabnine-nvim', { 'do': './dl_binaries.sh' }
call plug#end()
  1. Restart Neovim and run :PlugInstall

Using packer

  1. Add the following in your init.lua:
require("packer").startup(function(use)
  use { 'codota/tabnine-nvim', run = "./dl_binaries.sh" }
end)
  1. Restart Neovim and run :PackerInstall

Using lazy.nvim

  1. Add the following in your init.lua:
require("lazy").setup({
  { 'codota/tabnine-nvim', build = "./dl_binaries.sh" },
})
  1. Restart Neovim and run :Lazy

Windows

The build script needs a set execution policy. Here is an example on how to set it

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

For more information visit the official documentation

Windows installations need to be adjusted to utilize PowerShell. This can be accomplished by changing the do/run/build parameter in your plugin manager's configuration from ./dl_binaries.sh to pwsh.exe -file .\\dl_binaries.ps1

-- Example using lazy.nvim
-- pwsh.exe for PowerShell Core
-- powershell.exe for Windows PowerShell

require("lazy").setup({
  { 'codota/tabnine-nvim', build = "pwsh.exe -file .\\dl_binaries.ps1" },
})

If you need to use Tabnine on Windows and Unix you can change the config as follows

-- Get platform dependant build script
local function tabnine_build_path()
  -- Replace vim.uv with vim.loop if using NVIM 0.9.0 or below
  if vim.uv.os_uname().sysname == "Windows_NT" then
    return "pwsh.exe -file .\\dl_binaries.ps1"
  else
    return "./dl_binaries.sh"
  end
end
require("lazy").setup({
  { 'codota/tabnine-nvim', build = tabnine_build_path()},
})

Activate (mandatory)

Add this later in your init.lua:

require('tabnine').setup({
  disable_auto_comment=true,
  accept_keymap="<Tab>",
  dismiss_keymap = "<C-]>",
  debounce_ms = 800,
  suggestion_color = {gui = "#808080", cterm = 244},
  exclude_filetypes = {"TelescopePrompt", "NvimTree"},
  log_file_path = nil, -- absolute path to Tabnine log file
  ignore_certificate_errors = false,
})

init.vim users - the activation script is lua code. Make sure to have it inside lua block:

lua <<EOF
" activate tabnine here
EOF

Advanced use cases:

You can set accept_keymap and dismiss_keymap to false to disable them, then you can create mappings using require('tabnine.keymaps')

--- Example integration with Tabnine and LuaSnip; falling back to inserting tab if neither has a completion
vim.keymap.set("i", "<tab>", function()
  if require("tabnine.keymaps").has_suggestion() then
    return require("tabnine.keymaps").accept_suggestion()
  elseif require("luasnip").jumpable(1) then
    return require("luasnip").jump(1)
  else
    return "<tab>"
  end
end, { expr = true })

Activate Tabnine Pro

  • :TabnineHub - to open Tabnine Hub and log in to your account
  • :TabnineLoginWithAuthToken - to log in using auth token (for headless environments, where no browser is available)

Sometimes Tabnine may fail to open the browser on Tabnine Hub, in this case use :TabnineHubUrl to get Tabnine Hub URL

Tabnine Chat - BETA

Tabnine Neovim chat Tabnine Chat is still in BETA and is available only for Tabnine Pro users. To make it work:

  • You will need to build the chat from source, by executing: cargo build --release inside chat/ directory.
  • You may be missing some dependencies to build the chat. To fix this, run the following command:
$ # Debian/Ubuntu
$ sudo apt-get install -y libgtk-3-dev libglib2.0-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libwebkit2gtk-4.1-dev
$ # Arch
$ pacman -S --needed gtk3 glib2 webkit2gtk-4.1 libsoup3

Commands

  • :TabnineStatus - to print Tabnine status
  • :TabnineDisable - to disable Tabnine
  • :TabnineEnable - to enable Tabnine
  • :TabnineToggle - to toggle enable/disable
  • :TabnineChat - to launch Tabnine chat
  • :TabnineLoginWithAuthToken - to log in using auth token (for headless environments, where no browser is available)

Tabnine Chat commands

  • :TabnineChat - to open Tabnine Chat
  • :TabnineFix - to fix the function in scope
  • :TabnineTest - to generate tests for function in scope
  • :TabnineExplain - to explain the function in scope

<Tab> and nvim-cmp

nvim-cmp maps <Tab> to navigating through pop menu items (see here) This conflicts with Tabnine <Tab> for inline completion. To get this sorted you can either:

  • Bind Tabnine inline completion to a different key using accept_keymap
  • Bind cmp.select_next_item() & cmp.select_prev_item() to different keys, e.g: <C-k> & <C-j>

lualine integration

This plugin exposes a lualine tabnine component. e.g:

require('lualine').setup({
    tabline = {
        lualine_a = {},
        lualine_b = {'branch'},
        lualine_c = {'filename'},
        lualine_x = {},
        lualine_y = {},
        lualine_z = {}
    },
    sections = {lualine_c = {'lsp_progress'}, lualine_x = {'tabnine'}}
})

Other statusline integrations

To render tabnine status widget use:

require('tabnine.status').status()

Tabnine Enterprise customers (self hosted only)

In your init.lua:

these instructions are made for packer, but are pretty much the same with all package managers

local tabnine_enterprise_host = "https://tabnine.customer.com"

require("packer").startup(function(use)
  use { 'codota/tabnine-nvim', run = "./dl_binaries.sh " .. tabnine_enterprise_host .. "/update" }
end)

require('tabnine').setup({
  disable_auto_comment=true,
  accept_keymap="<Tab>",
  dismiss_keymap = "<C-]>",
  debounce_ms = 800,
  suggestion_color = {gui = "#808080", cterm = 244},
  codelens_color = { gui = "#808080", cterm = 244 },
  codelens_enabled = true,
  exclude_filetypes = {"TelescopePrompt", "NvimTree"},
  log_file_path = nil, -- absolute path to Tabnine log file,
  tabnine_enterprise_host = tabnine_enterprise_host,
  ignore_certificate_errors = false,
})

Keymaps examples

api.nvim_set_keymap("x", "<leader>q", "", { noremap = true, callback = require("tabnine.chat").open })
api.nvim_set_keymap("i", "<leader>q", "", { noremap = true, callback = require("tabnine.chat").open })
api.nvim_set_keymap("n", "<leader>q", "", { noremap = true, callback = require("tabnine.chat").open })