Home

Awesome

fittencode.nvim

Fitten Code AI Programming Assistant for Neovim, helps you to use AI for automatic completion in Neovim, with support for functions like login, logout, shortcut key completion.

fittencode-KMP-demo

✨ Features

⚡️ Requirements

📦 Installation

Install the plugin with your preferred package manager:

For example with lazy.nvim:

{
  'luozhiya/fittencode.nvim',
  config = function()
    require('fittencode').setup()
  end,
}

For example with packer.nvim:

use {
  'luozhiya/fittencode.nvim',
  config = function()
    require('fittencode').setup()
  end,
}

⚙️ Configuration

defaults

fittencode.nvim comes with the following defaults:

{
  action = {
    document_code = {
      -- Show "Fitten Code - Document Code" in the editor context menu, when you right-click on the code.
      show_in_editor_context_menu = true,
    },
    edit_code = {
      -- Show "Fitten Code - Edit Code" in the editor context menu, when you right-click on the code.
      show_in_editor_context_menu = true,
    },
    explain_code = {
      -- Show "Fitten Code - Explain Code" in the editor context menu, when you right-click on the code.
      show_in_editor_context_menu = true,
    },
    find_bugs = {
      -- Show "Fitten Code - Find Bugs" in the editor context menu, when you right-click on the code.
      show_in_editor_context_menu = true,
    },
    generate_unit_test = {
      -- Show "Fitten Code - Generate UnitTest" in the editor context menu, when you right-click on the code.
      show_in_editor_context_menu = true,
    },
    start_chat = {
      -- Show "Fitten Code - Start Chat" in the editor context menu, when you right-click on the code.
      show_in_editor_context_menu = true,
    },
    identify_programming_language = {
      -- Identify programming language of the current buffer
      -- * Unnamed buffer
      -- * Buffer without file extension
      -- * Buffer no filetype detected
      identify_buffer = true,
    }
  },
  disable_specific_inline_completion = {
    -- Disable auto-completion for some specific file suffixes by entering them below
    -- For example, `suffixes = {'lua', 'cpp'}`
    suffixes = {},
  },
  inline_completion = {
    -- Enable inline code completion.
    ---@type boolean
    enable = true,
    -- Disable auto completion when the cursor is within the line.
    ---@type boolean
    disable_completion_within_the_line = false,
    -- Disable auto completion when pressing Backspace or Delete.
    ---@type boolean
    disable_completion_when_delete = false,
    -- Auto triggering completion
    ---@type boolean
    auto_triggering_completion = true,
    -- Accept Mode
    -- Available options:
    -- * `commit` (VSCode style accept, also default)
    --   - `Tab` to Accept all suggestions
    --   - `Ctrl+Right` to Accept word
    --   - `Ctrl+Down` to Accept line
    --   - Interrupt
    --      - Enter a different character than suggested
    --      - Exit insert mode
    --      - Move the cursor
    -- * `stage` (Stage style accept)
    --   - `Tab` to Accept all staged characters
    --   - `Ctrl+Right` to Stage word
    --   - `Ctrl+Left` to Revoke word
    --   - `Ctrl+Down` to Stage line
    --   - `Ctrl+Up` to Revoke line
    --   - Interrupt(Same as `commit`, but with the following changes:)
    --      - Characters that have already been staged will be lost.
    accept_mode = 'commit',
  },
  delay_completion = {
    -- Delay time for inline completion (in milliseconds).
    ---@type integer
    delaytime = 0,
  },
  prompt = {
    -- Maximum number of characters to prompt for completion/chat.
    max_characters = 1000000,
  },
  chat = {
    -- Highlight the conversation in the chat window at the current cursor position.
    highlight_conversation_at_cursor = false,
    -- Style
    -- Available options:
    -- * `sidebar` (Siderbar style, also default)
    -- * `floating` (Floating style)
    style = 'sidebar',
    sidebar = {
      -- Width of the sidebar in characters.
      width = 42,
      -- Position of the sidebar.
      -- Available options:
      -- * `left`
      -- * `right`
      position = 'left',
    },
    floating = {
      -- Border style of the floating window.
      -- Same border values as `nvim_open_win`.
      border = 'rounded',
      -- Size of the floating window.
      -- <= 1: percentage of the screen size
      -- >  1: number of lines/columns
      size = { width = 0.8, height = 0.8 },
    }
  },
  -- Enable/Disable the default keymaps in inline completion.
  use_default_keymaps = true,
  -- Default keymaps
  keymaps = {
    inline = {
      ['<TAB>'] = 'accept_all_suggestions',
      ['<C-Down>'] = 'accept_line',
      ['<C-Right>'] = 'accept_word',
      ['<C-Up>'] = 'revoke_line',
      ['<C-Left>'] = 'revoke_word',
      ['<A-\\>'] = 'triggering_completion',
    },
    chat = {
      ['q'] = 'close',
      ['[c'] = 'goto_previous_conversation',
      [']c'] = 'goto_next_conversation',
      ['c'] = 'copy_conversation',
      ['C'] = 'copy_all_conversations',
      ['d'] = 'delete_conversation',
      ['D'] = 'delete_all_conversations',
    }
  },
  -- Setting for source completion.
  source_completion = {
    -- Enable source completion.
    enable = true,
    -- trigger characters for source completion.
    -- Available options:
    -- * A  list of characters like {'a', 'b', 'c', ...}
    -- * A function that returns a list of characters like `function() return {'a', 'b', 'c', ...}`
    trigger_chars = {},
  },
  -- Set the mode of the completion.
  -- Available options:
  -- * 'inline' (VSCode style inline completion)
  -- * 'source' (integrates into other completion plugins)
  completion_mode = 'inline',
  ---@class LogOptions
  log = {
    -- Log level.
    level = vim.log.levels.WARN,
    -- Max log file size in MB, default is 10MB
    max_size = 10,
  },
}

inline mode

Set updatetime to a lower value to improve performance:

-- Neovim default updatetime is 4000
vim.opt.updatetime = 200

source mode

require('fittencode').setup({
  completion_mode ='source',
})
require('cmp').setup({
  sources = { name = 'fittencode', group_index = 1 },
  mapping = {
    -- Accept multi-line completion
    ['<c-y>'] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Insert, select = false }),
  }
})

Highlighting & Icon

FittenCode's cmp source now has a builtin highlight group CmpItemKindFittencode. To add an icon to FittenCode for lspkind, simply add FittenCode to your lspkind symbol map.

-- lspkind.lua
local lspkind = require("lspkind")
lspkind.init({
  symbol_map = {
    FittenCode = "",
  },
})

vim.api.nvim_set_hl(0, "CmpItemKindFittenCode", {fg ="#6CC644"})

Alternatively, you can add FittemCode to the lspkind symbol_map within the cmp format function.

-- cmp.lua
cmp.setup {
  ...
  formatting = {
    format = lspkind.cmp_format({
      mode = "symbol",
      max_width = 50,
      symbol_map = { FittenCode = "" }
    })
  }
  ...
}

If you do not use lspkind, simply add the custom icon however you normally handle kind formatting and it will integrate as if it was any other normal lsp completion kind.

🚀 Usage

Account Commands

CommandDescription
Fitten registerIf you haven't registered yet, please run the command to register.
Fitten loginTry the command Fitten login to login.
Fitten logoutLogout account

Completions Commands

CommandDescription
Fitten enable_completions [filetypes]Enable global/filetypes completions.
Fitten disable_completions [filetypes]Disable global/filetypes completions.

Actions Commands

CommandDescription
Fitten document_codeDocument code
Fitten edit_codeEdit code
Fitten explain_codeExplain code
Fitten find_bugsFind bugs
Fitten generate_unit_test [test_framework] [language]Generate unit test
Fitten implement_featuresImplement features
Fitten optimize_codeOptimize code
Fitten refactor_codeRefactor code
Fitten identify_programming_languageIdentify programming language
Fitten analyze_dataAnalyze data
Fitten translate_textTranslate text
Fitten translate_text_into_chineseTranslate text into Chinese
Fitten translate_text_into_englishTranslate text into English
Fitten start_chatStart chat
Fitten show_chatShow chat window
Fitten toggle_chatToggle chat window

Completions Mappings

MappingsAction
TabAccept all suggestions
Ctrl + 🡫Accept line
Ctrl + 🡪Accept word
Ctrl + 🡩Revoke line
Ctrl + 🡨Revoke word
Alt + \Manually triggering completion

Chat Mappings

MappingsAction
qClose chat
[cGo to previous conversation
]cGo to next conversation
cCopy conversation
CCopy all conversations
dDelete conversation
DDelete all conversations

✏️ APIs

fittencode.nvim provides a set of APIs to help you integrate it with other plugins or scripts.

Parameters/Return Types

-- Log levels
vim.log = {
  levels = {
    TRACE = 0,
    DEBUG = 1,
    INFO = 2,
    WARN = 3,
    ERROR = 4,
    OFF = 5,
  },
}

---@class ActionOptions
---@field prompt? string
---@field content? string
---@field language? string

---@class GenerateUnitTestOptions : ActionOptions
---@field test_framework string

---@class ImplementFeaturesOptions : ActionOptions
---@field feature_type string

---@class TranslateTextOptions : ActionOptions
---@field target_language string

---@class EnableCompletionsOptions
---@field enable? boolean
---@field mode? 'inline' | 'source'
---@field global? boolean
---@field suffixes? string[]

---@type StatusCodes
local StatusCodes = {
  DISABLED = 1,
  IDLE = 2,
  GENERATING = 3,
  ERROR = 4,
  NO_MORE_SUGGESTIONS = 5,
  SUGGESTIONS_READY = 6,
}

List of APIs

API PrototypeDescription
login(username, password)Login to Fitten Code AI
logout()Logout from Fitten Code AI
register()Register to Fitten Code AI
set_log_level(level)Set the log level
get_current_status()Get the StatusCodes of the InlineEngine and ActionEngine
triggering_completion()Manually triggering completion
has_suggestions()Check if there are suggestions
dismiss_suggestions()Dismiss suggestions
accept_all_suggestions()Accept all suggestions
accept_line()Accept line
accept_word()Accept word
accept_char()Accept character
revoke_line()Revoke line
revoke_word()Revoke word
revoke_char()Revoke character
document_code(ActionOptions)Document code
edit_code(ActionOptions)Edit code
explain_code(ActionOptions)Explain code
find_bugs(ActionOptions)Find bugs
generate_unit_test(GenerateUnitTestOptions)Generate unit test
implement_features(ImplementFeaturesOptions)Implement features
optimize_code(ActionOptions)Optimize code
refactor_code(ActionOptions)Refactor code
identify_programming_language(ActionOptions)Identify programming language
analyze_data(ActionOptions)Analyze data
translate_text(TranslateTextOptions)Translate text
translate_text_into_chinese(TranslateTextOptions)Translate text into Chinese
translate_text_into_english(TranslateTextOptions)Translate text into English
start_chat(ActionOptions)Start chat
enable_completions(EnableCompletionsOptions)Enable completions
show_chat()Show chat window
toggle_chat()Toggle chat window

🎉 Special Thanks