{"id":15228653,"url":"https://github.com/monkoose/neocodeium","last_synced_at":"2026-05-10T12:15:12.595Z","repository":{"id":231091048,"uuid":"780474104","full_name":"monkoose/neocodeium","owner":"monkoose","description":"free AI completion plugin for neovim","archived":false,"fork":false,"pushed_at":"2025-02-19T11:54:21.000Z","size":165,"stargazers_count":318,"open_issues_count":3,"forks_count":14,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-04-12T06:17:33.372Z","etag":null,"topics":["codeium","neovim-plugin"],"latest_commit_sha":null,"homepage":"","language":"Lua","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/monkoose.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-01T15:01:46.000Z","updated_at":"2025-04-11T20:05:02.000Z","dependencies_parsed_at":"2024-05-04T08:24:01.316Z","dependency_job_id":"effe44db-8af0-4e49-bcc1-5e2926af4754","html_url":"https://github.com/monkoose/neocodeium","commit_stats":{"total_commits":121,"total_committers":5,"mean_commits":24.2,"dds":0.05785123966942152,"last_synced_commit":"4da81528468b33585c411f31eb390dce573ccb14"},"previous_names":["monkoose/neocodeium"],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monkoose%2Fneocodeium","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monkoose%2Fneocodeium/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monkoose%2Fneocodeium/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monkoose%2Fneocodeium/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/monkoose","download_url":"https://codeload.github.com/monkoose/neocodeium/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248525141,"owners_count":21118620,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["codeium","neovim-plugin"],"created_at":"2024-09-29T00:01:31.089Z","updated_at":"2026-05-10T12:15:12.581Z","avatar_url":"https://github.com/monkoose.png","language":"Lua","funding_links":[],"categories":["Lua"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003cimg width=\"450\" alt=\"NeoCodeium\" src=\"https://github.com/user-attachments/assets/f31d5035-ca1c-43f1-b309-fb523ecdfe48\"/\u003e\n    \u003cp\u003e⚡ Free AI completion plugin powered by \u003ca href=\"https://windsurf.com\"\u003ewindsurf\u003c/a\u003e (formerly codeium) ⚡\u003c/p\u003e\n\u003c/div\u003e\n\n---\n\nNeoCodeium is a plugin that provides AI completion powered by [Windsurf]. The\nprimary reason for creating NeoCodeium was to address the issue of flickering\nsuggestions in the official plugin which was particularly annoying when dealing\nwith multi-line virtual text. Additionally, I desired a feature that would\nallow accepting suggestions to be repeatable using the `.` command,\nbecause I use it as my main completion plugin and only manually invoke\nnvim-cmp.\n\n\u003cdetails\u003e\n\u003csummary\u003eDifferences with \u003ca href=\"https://github.com/Exafunction/windsurf.vim\"\u003ewindsurf.vim\u003c/a\u003e\u003c/summary\u003e\n\n- Supports only Neovim (written in Lua)\n- Flickering has been removed in most scenarios, resulting in a snappier experience\n- Completions on the current line can now be repeated using the `.` key\n- Performance improvements have been achieved through cache techniques\n- The suggestion count label is displayed in the number column, making it closer to the context\n- Default keymaps have been removed\n- ~~Possibility to complete only word/line of the suggestion~~ (windsurf.vim added this feature in [9fa0dee](https://github.com/Exafunction/windsurf.vim/commit/9fa0dee67051d8e5d334f7f607e6bab1d6a46d1a))\n- No debounce by default, allowing suggestions to appear while typing (this behavior can be disabled with `debounce = true` in the setup)\n\n\u003c/details\u003e\n\n\u003e [!Warning]\n\u003e While using this plugin, your code is constantly being sent to\n\u003e Windsurf servers by their own language server in order to evaluate and return\n\u003e completions. Before using make sure you have read and accept the [Windsurf\n\u003e Privacy Policy](https://windsurf.com/privacy-policy). NeoCodeium has the\n\u003e ability to disable the server globally or for individual buffers. This plugin\n\u003e does not send any data to the server from disabled buffers, but the Windsurf\n\u003e server is still running behind the scenes and we cannot guarantee that it\n\u003e doesn't send information while running.\n\n### ⚡️ Requirements\n\n- Neovim \u003e= **0.10.0**\n\n---\n\n### 📦 Installation\n\nHere’s an example for 💤[lazy](https://github.com/folke/lazy.nvim) plugin manager. If you're using\na different plugin manager, please refer to its documentation for installation instructions.\n\n```lua\n-- add this to the file where you setup your other plugins:\n{\n  \"monkoose/neocodeium\",\n  event = \"VeryLazy\",\n  config = function()\n    local neocodeium = require(\"neocodeium\")\n    neocodeium.setup()\n    vim.keymap.set(\"i\", \"\u003cA-f\u003e\", neocodeium.accept)\n  end,\n}\n\n```\n\nNow you can use `Alt-f` in insert mode to accept suggestions.\n\nEnterprise users: you should receive portal and API URLs for Windsurf from your company.\nOnce you get them, add them to your config. This way `:NeoCodeium auth` will authenticate you on the right portal. For example,\n\n```lua\n{\n  \"monkoose/neocodeium\",\n  event = \"VeryLazy\",\n  opts = {\n    server = {\n      api_url = 'https://codeium.company.net/_route/api_server',\n      portal_url = 'https://codeium.company.net',\n    },\n  }\n}\n```\n\n**Note:** To obtain an API token, you’ll need to run `:NeoCodeium auth`.\nOn Windows WSL `wslview` `(sudo apt install wslu)` should be installed to properly open the browser.\n\n---\n\n### ⚒️ Setup\n\nNeoCodeium comes with the following default options:\n\n```lua\n-- NeoCodeium Configuration\nrequire(\"neocodeium\").setup({\n  -- If `false`, then would not start windsurf server (disabled state)\n  -- You can manually enable it at runtime with `:NeoCodeium enable`\n  enabled = true,\n  -- Path to a custom windsurf server binary (you can download one from:\n  -- https://github.com/Exafunction/codeium/releases)\n  bin = nil,\n  -- When set to `true`, autosuggestions are disabled.\n  -- Use `require'neodecodeium'.cycle_or_complete()` to show suggestions manually\n  manual = false,\n  -- Information about the API server to use\n  server = {\n    -- API URL to use (for Enterprise mode)\n    api_url = nil,\n    -- Portal URL to use (for registering a user and downloading the binary)\n    portal_url = nil,\n  },\n  -- Set to `false` to disable showing the number of suggestions label in the line number column\n  show_label = true,\n  -- Set to `true` to enable suggestions debounce\n  debounce = false,\n  -- Maximum number of lines parsed from loaded buffers (current buffer always fully parsed)\n  -- Set to `0` to disable parsing non-current buffers (may lower suggestion quality)\n  -- Set it to `-1` to parse all lines\n  max_lines = 10000,\n  -- Set to `true` to disable some non-important messages, like \"NeoCodeium: server started...\"\n  silent = false,\n  -- Set to `false` to enable suggestions in special buftypes, like `nofile` etc.\n  disable_in_special_buftypes = true,\n  -- Sets default log level. One of \"trace\", \"debug\", \"info\", \"warn\", \"error\"\n  log_level = \"warn\",\n  -- Set `enabled` to `true` to enable single line mode.\n  -- In this mode, multi-line suggestions would collapse into a single line and only\n  -- shows full lines when on the end of the suggested (accepted) line.\n  -- So it is less distracting and works better with other completion plugins.\n  single_line = {\n    enabled = false,\n    label = \"...\", -- Label indicating that there is multi-line suggestion.\n  },\n  -- Set to a function that returns `true` if a buffer should be enabled\n  -- and `false` if the buffer should be disabled\n  -- You can still enable disabled by this option buffer with `:NeoCodeium enable_buffer`\n  filter = function(bufnr) return true end,\n  -- Set to `false` to disable suggestions in buffers with specific filetypes\n  -- You can still enable disabled by this option buffer with `:NeoCodeium enable_buffer`\n  filetypes = {\n    help = false,\n    gitcommit = false,\n    gitrebase = false,\n    [\".\"] = false,\n  },\n  -- List of directories and files to detect workspace root directory for Windsurf Chat\n  root_dir = { \".bzr\", \".git\", \".hg\", \".svn\", \"_FOSSIL_\", \"package.json\" }\n})\n```\n\n---\n\n### 🚀 Usage\n\n#### 📒 API\n\nIn addition to the already mentioned `accept()` function, the plugin also provides a few others:\n\n```lua\nlocal neocodeium = require(\"neocodeium\")\n\n-- Accepts the suggestion\nneocodeium.accept()\n\n-- Accepts only part of the suggestion if the full suggestion doesn't make sense\nneocodeium.accept_word()\nneocodeium.accept_line()\n\n-- Clears the current suggestion\nneocodeium.clear()\n\n-- Cycles through suggestions by `n` (1 by default) items.\n-- Use a negative value to cycle in reverse order\nneocodeium.cycle(n)\n\n-- Same as `cycle()`, but also tries to show a suggestion if none is visible.\n-- Mostly useful with the enabled `manual` option\nneocodeium.cycle_or_complete(n)\n\n-- Checks if a suggestion's virtual text is visible or not (useful for some complex mappings)\nneocodeium.visible()\n```\n\n\u003cbr\u003e\n\n#### 🪄 Tips\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eUsing alongside nvim-cmp\u003c/b\u003e\u003c/summary\u003e\n\nIf you are using NeoCodeium with `manual = false` (the default), it is\nrecommended to set nvim-cmp to manual completion and clear NeoCodeium\nsuggestions on opening of the nvim-cmp pop-up menu. You can achieve this with\nfollowing code in the place where nvim-cmp is configured:\n\n```lua\nlocal cmp = require(\"cmp\")\nlocal neocodeium = require(\"neocodeium\")\nlocal commands = require(\"neocodeium.commands\")\n\ncmp.event:on(\"menu_opened\", function()\n    neocodeium.clear()\nend)\n\nneocodeium.setup({\n    filter = function()\n        return not cmp.visible()\n    end,\n})\n\ncmp.setup({\n    completion = {\n        autocomplete = false,\n    },\n})\n```\n\nIf you want to use autocompletion with nvim-cmp, then it is recommended to use\nNeoCodeium with `manual = true`, add a binding for triggering NeoCodeium\ncompletion, and make sure to close the nvim-cmp window when completions are\nrendered. You can achieve this with the following code where you setup\nNeoCodeium:\n\n```lua\nlocal neocodeium = require(\"neocodeium\")\n\nneocodeium.setup({\n  manual = true, -- recommended to not conflict with nvim-cmp\n})\n\n-- create an autocommand which closes cmp when ai completions are displayed\nvim.api.nvim_create_autocmd(\"User\", {\n  pattern = \"NeoCodeiumCompletionDisplayed\",\n  callback = function() require(\"cmp\").abort() end\n})\n\n-- set up some sort of keymap to cycle and complete to trigger completion\nvim.keymap.set(\"i\", \"\u003cA-e\u003e\", function() neocodeium.cycle_or_complete() end)\n-- make sure to have a mapping to accept a completion\nvim.keymap.set(\"i\", \"\u003cA-f\u003e\", function() neocodeium.accept() end)\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eUsing alongside blink.cmp\u003c/b\u003e\u003c/summary\u003e\n\nIf you are using NeoCodeium with `manual = false` (the default), you can configure blink.cmp to act in a similar fashion as the tip above for nvim-cmp. In the plugin configuration, set `auto-show` to be disabled in default mode (it will stay on in `cmdline` mode for convenience):\n\n```lua\ncompletion = {\n    menu = {\n        auto_show = function(ctx)\n            return ctx.mode ~= 'default'\n        end,\n    }\n}\n```\n\nThen adjust blink.cmp to clear suggestions when the menu is opened and ensure to get suggestions only when the menu is not visible:\n\n```lua\nlocal neocodeium = require('neocodeium')\nlocal blink = require('blink.cmp')\n\nvim.api.nvim_create_autocmd('User', {\n  pattern = 'BlinkCmpMenuOpen',\n  callback = function()\n    neocodeium.clear()\n  end,\n})\n\nneocodeium.setup({\n  filter = function()\n    return not blink.is_visible()\n  end,\n})\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDisable in Telescope prompt and DAP REPL\u003c/b\u003e\u003c/summary\u003e\n\n```lua\nrequire(\"neocodeium\").setup({\n    filetypes = {\n        ...\n        TelescopePrompt = false,\n        [\"dap-repl\"] = false,\n    },\n})\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eEnable NeoCodeium only in specified filetypes\u003c/b\u003e\u003c/summary\u003e\n\n```lua\nlocal filetypes = { 'lua', 'python' }\nneocodeium.setup({\n  -- function accepts one argument `bufnr`\n  filter = function(bufnr)\n    if vim.tbl_contains(filetypes, vim.api.nvim_get_option_value('filetype',  { buf = bufnr})) then\n        return true\n    end\n    return false\n  end\n})\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDisable NeoCodeium in .env files\u003c/b\u003e\u003c/summary\u003e\n\n```lua\nfilter = function(bufnr)\n    if vim.endswith(vim.api.nvim_buf_get_name(bufnr), \".env\") then\n        return false\n    end\n    return true\nend\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eUsing NeoCodeiumLabelUpdated to get suggestions label text\u003c/b\u003e\u003c/summary\u003e\n\nIf you have disabled suggestions label with `show_label = false`, but still want to know number of suggestions,\nyou can use `NeoCodeiumLabelUpdated` event to get label text, for example using it as statusline component.\nLabel text is always 3 characters long string.\n\n`\"   \"` - Not in insert mode (neocodeium disabled)\n`\" * \"` - pending response from the windsurf server\n`\" 0 \"` - no suggestions\n`\" 1 \"` - only one suggestion\n`\"1/6\"` - 1 of 6 suggestions, etc\n\n```lua\nvim.api.nvim_create_autocmd(\"User\", {\n    pattern = \"NeoCodeiumLabelUpdated\",\n    -- Don't forget to add some `group`\n    callback = function(ev)\n       -- Use ev.data to update your statusline\n       -- As example just print to cmdline\n       vim.print(ev.data)\n    end,\n})\n```\n\u003c/details\u003e\n\n\u003cbr\u003e\n\n#### ⌨️ Keymaps\n\nNeoCodeium doesn’t provide any keymaps, which means you’ll need to add them\nyourself. While [windsurf.vim] and\n[copilot.vim](https://github.com/github/copilot.vim) set the `\u003cTab\u003e` key as the\ndefault key for accepting a suggestion, we recommend avoiding it as it has some\ndownsides to consider (although nothing is stopping you from using it):\n- **Risk of Interference:** There’s a high chance of it conflicting with other\n  plugins (such as snippets, nvim-cmp, etc.).\n- **Not Consistent:** It doesn’t work in the `:h command-line-window`.\n- **Indentation Challenges:** It is harder to indent with the tab at the start\n  of a line.\n\nSuggested keymaps:\n\n```lua\nvim.keymap.set(\"i\", \"\u003cA-f\u003e\", function()\n    require(\"neocodeium\").accept()\nend)\nvim.keymap.set(\"i\", \"\u003cA-w\u003e\", function()\n    require(\"neocodeium\").accept_word()\nend)\nvim.keymap.set(\"i\", \"\u003cA-a\u003e\", function()\n    require(\"neocodeium\").accept_line()\nend)\nvim.keymap.set(\"i\", \"\u003cA-e\u003e\", function()\n    require(\"neocodeium\").cycle_or_complete()\nend)\nvim.keymap.set(\"i\", \"\u003cA-r\u003e\", function()\n    require(\"neocodeium\").cycle_or_complete(-1)\nend)\nvim.keymap.set(\"i\", \"\u003cA-c\u003e\", function()\n    require(\"neocodeium\").clear()\nend)\n```\n\n\u003cbr\u003e\n\n#### 🔤 Commands\n\nNeoCodeium provides `:NeoCodeium` user command, which has some useful actions:\n- `:NeoCodeium auth` - authenticates the user and saves the API token.\n- `:NeoCodeium[!] disable` - disables completions. With the bang also stops the windsurf server.\n- `:NeoCodeium enable` - enables NeoCodeium completion.\n- `:NeoCodeium[!] toggle` - toggles NeoCodeium completion. Convey the bang to disable command.\n- `:NeoCodeium disable_buffer` - disables NeoCodeium completion in the current buffer.\n- `:NeoCodeium enable_buffer` - enables NeoCodeium completion in the current buffer.\n- `:NeoCodeium toggle_buffer` - toggles NeoCodeium completion in the current buffer.\n- `:NeoCodeium open_log` - opens new tab with the log output. More information is in the [logging] section.\n- `:NeoCodeium chat` - opens browser with the Windsurf Chat.\n- `:NeoCodeium restart` - restarts the server (useful if the server stops responding for any reason).\n\nYou can also use the same commands in your Lua scripts by calling:\n\n```lua\nrequire(\"neocodeium.commands\").\u003ccommand_name\u003e()`\n-- Examples\n-- disable completions\nrequire(\"neocodeium.commands\").disable()\n-- disable completions and stop the server\nrequire(\"neocodeium.commands\").disable(true)\n```\n\n\u003cbr\u003e\n\n#### 📆 User Events\n\nNeoCodeium triggers several user events which can be used to trigger code. These can be used to optimize when statusline elements are updated, creating mappings only when the server is available, or modifying completion engine settings when AI completion is started or displaying hints.\n\n- `NeoCodeiumServerConnecting` - triggers when a connection to the windsurf server is starting\n- `NeoCodeiumServerConnected` - triggers when a successful connection to the windsurf server is made\n- `NeoCodeiumServerStopped` - triggers when the windsurf server is stopped\n- `NeoCodeiumEnabled` - triggers when the NeoCodeium plugin is enabled globally\n- `NeoCodeiumDisabled` - triggers when the NeoCodeium plugin is disabled globally\n- `NeoCodeiumBufEnabled` - triggers when the NeoCodeium plugin is enabled for a buffer\n- `NeoCodeiumBufDisabled` - triggers when the NeoCodeium plugin is disabled for a buffer\n- `NeoCodeiumCompletionDisplayed` - triggers when NeoCodeium successfully displays a completion item as virtual text\n- `NeoCodeiumCompletionCleared` - triggers when NeoCodeium clears virtual text and completions\n- `NeoCodeiumLabelUpdated` - triggers when number of suggestions has changed (suggestions label is updated)\nThis event sends label text as it's data. You can access it in autocmd callback with `ev.data` - see example in the Tips secsion.\n\n\u003cbr\u003e\n\n#### 🚃 Statusline\n\n`require(\"neocodeium\").get_status()` can be used to get the some useful information about the current state.\nThe best use case for this output is to implement custom statusline component.\nThis function returns two numbers:\n\n1. Status of the plugin\n\n        0 - Enabled\n        1 - Globally disabled with `:NeoCodeium disable`, `:NeoCodeium toggle` or with `setup.enabled = false`\n        2 - Buffer is disabled with `:NeoCodeium disable_buffer`\n        3 - Buffer is disableld when it's filetype is matching `setup.filetypes = { some_filetyps = false }`\n        4 - Buffer is disabled when `setup.filter` returns `false` for the current buffer\n        5 - Buffer has wrong encoding (windsurf can accept only UTF-8 and LATIN-1 encodings)\n        6 - Buffer is of special type `:help 'buftype'`\n\n2. Server status\n\n        0 - Server is on (running)\n        1 - Connecting to the server (not working status)\n        2 - Server is off (stopped)\n\nTo use output from `get_status()` for in-time update it is required to invoke this function\nfrom [events].\n\n**Statusline Examples**\n\n\u003cdetails\u003e\n\u003csummary\u003eWithout statusline plugins\u003c/summary\u003e\n\n```lua\n-- function to process get_status() and set buffer variable to that data.\nlocal neocodeium = require(\"neocodeium\")\nlocal function get_neocodeium_status(ev)\n    local status, server_status = neocodeium.get_status()\n    -- process this data, convert it to custom string/icon etc and set buffer variable\n    if status == 0 then\n        vim.api.nvim_buf_set_var(ev.buf, \"neocodeium_status\", \"OK\")\n    else\n        vim.api.nvim_buf_set_var(ev.buf, \"neocodeium_status\", \"OFF\")\n    end\n    vim.cmd.redrawstatus()\nend\n\n-- Then only some of event fired we invoked this function\nvim.api.nvim_create_autocmd(\"User\", {\n    -- group = ..., -- set some augroup here\n    pattern = {\n        \"NeoCodeiumServer*\",\n        \"NeoCodeium*Enabled\",\n        \"NeoCodeium*Disabled\",\n    }\n    callback = get_neocodeium_status,\n})\n\n-- add neocodeium_status to your statusline\nvim.opt.statusline:append(\"%{get(b:, 'neocodeium_status', '')%}\")\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eHeirline.nvim\u003c/summary\u003e\n\n```lua\nlocal NeoCodeium = {\n  static = {\n    symbols = {\n      status = {\n        [0] = \"󰚩 \", -- Enabled\n        [1] = \"󱚧 \", -- Disabled Globally\n        [2] = \"󱙻 \", -- Disabled for Buffer\n        [3] = \"󱙺 \", -- Disabled for Buffer filetype\n        [4] = \"󱙺 \", -- Disabled for Buffer with enabled function\n        [5] = \"󱚠 \", -- Disabled for Buffer encoding\n        [6] = \"󱚠 \", -- Buffer is special type\n      },\n      server_status = {\n        [0] = \"󰣺 \", -- Connected\n        [1] = \"󰣻 \", -- Connecting\n        [2] = \"󰣽 \", -- Disconnected\n      },\n    },\n  },\n  update = {\n    \"User\",\n    pattern = { \"NeoCodeiumServer*\", \"NeoCodeium*{En,Dis}abled\" },\n    callback = function() vim.cmd.redrawstatus() end,\n  },\n  provider = function(self)\n    local symbols = self.symbols\n    local status, server_status = require(\"neocodeium\").get_status()\n    return symbols.status[status] .. symbols.server_status[server_status]\n  end,\n  hl = { fg = \"yellow\" },\n}\n```\n\u003c/details\u003e\n\n\u003cbr\u003e\n\n#### 🎨 Highlight groups\n\nNeoCodeium offers a couple of highlight groups. Feel free to adjust them to\nyour preference and to match your chosen color scheme:\n- `NeoCodeiumSuggestion` - virtual text color of the plugin suggestions (default: `#808080`)\n- `NeoCodeiumLabel` - color of the label that indicates the number of suggestions (default: inverted DiagnosticInfo)\n- `NeoCodeiumSingleLineLabel` - color of the label of multi-line suggestion in single line mode (default: `bold #808080`)\n\n\u003cbr\u003e\n\n#### 📄 Logging\n\nWhile running, NeoCodeium logs some messages into a temporary file. It can be\nviewed with the `:NeoCodeium open_log` command. By default only errors and\nwarnings are logged. Can be customized with the `log_level` option in the\n`setup()`.\n\nTemporary logging level can be set by exporting the `NEOCODEIUM_LOG_LEVEL`\nenvironment variable to one of `trace`, `debug`, `info`, `warn` or `error`.\n\nExample:\n```sh\nNEOCODEIUM_LOG_LEVEL=info nvim\n```\n\n\u003cbr\u003e\n\n#### 💬 Chat\n\nYou can chat with AI in the browser with the `:NeoCodeium chat` command. The\nfirst time you open it, it requires the server to restart with some\nchat-specific flags, so be patient (this usually doesn't take more than a few\nseconds). After that, it should open a chat window in the browser with the\ncontext of the current buffer. Here, you can ask some specific questions about\nyour code base. When you switch buffers, this context should be updated\nautomatically (it takes some time). You can see current chat context in the\nleft bottom corner.\n\n---\n\n### 🌟 License\n\nMIT license\n\n[windsurf.vim]: https://github.com/Exafunction/windsurf.vim\n[Windsurf]: https://windsurf.com\n[events]: https://github.com/monkoose/neocodeium?tab=readme-ov-file#-user-events\n[logging]: https://github.com/monkoose/neocodeium?tab=readme-ov-file#-logging\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonkoose%2Fneocodeium","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmonkoose%2Fneocodeium","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonkoose%2Fneocodeium/lists"}