Last active
August 31, 2025 11:48
-
-
Save przepompownia/0690ebe28a24bd10b45118fceb980dfd to your computer and use it in GitHub Desktop.
Nvim 0.11-dev - minimal example for built-in completion/expanding snippets with lua-ls
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # see https://github.com/CppCXY/EmmyLuaCodeStyle/blob/master/lua.template.editorconfig | |
| [*.lua] | |
| indent_style = space | |
| indent_size = 2 | |
| tab_width = 2 | |
| quote_style = single | |
| call_arg_parentheses = keep | |
| continuation_indent = 2 | |
| align_call_args = false | |
| align_function_params = true | |
| align_continuous_assign_statement = false | |
| space_around_table_field_list = false | |
| space_before_function_open_parenthesis = false | |
| space_before_closure_open_parenthesis = true | |
| end_of_line = lf | |
| max_line_length = 120 | |
| insert_final_newline = true | |
| trim_trailing_whitespace = true | |
| # local_name_style = 'camel_case' | |
| call_arg_parentheses = keep |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| --- @type lsp.ClientCapabilities? | |
| local capabilities = nil | |
| local function defaultClientCapabilities() | |
| if capabilities then | |
| return capabilities | |
| end | |
| capabilities = vim.lsp.protocol.make_client_capabilities() | |
| capabilities.textDocument.completion.completionItem.snippetSupport = true | |
| capabilities.workspace.didChangeWatchedFiles.dynamicRegistration = true | |
| return capabilities | |
| end | |
| vim.api.nvim_create_autocmd('FileType', { | |
| pattern = 'lua', | |
| callback = function (args) | |
| -- vim.treesitter.start(args.buf, 'lua') | |
| vim.lsp.start({ | |
| name = 'lua-ls', | |
| cmd = {'lua-language-server'}, | |
| root_dir = vim.fs.root(args.buf, 'init.lua'), | |
| capabilities = defaultClientCapabilities(), | |
| }) | |
| end, | |
| }) | |
| vim.api.nvim_create_autocmd('FileType', { | |
| pattern = 'php', | |
| callback = function (args) | |
| vim.opt_local.iskeyword:remove('$') | |
| vim.opt_local.spell = true | |
| vim.opt_local.wrap = false | |
| vim.opt_local.commentstring = '// %s' | |
| vim.opt_local.comments = 's1:/*,mb:*,ex:*/,://,:#' | |
| vim.b.did_ftplugin = 1 | |
| vim.bo.softtabstop = 4 | |
| vim.bo.shiftwidth = 4 | |
| vim.bo.expandtab = true | |
| vim.keymap.set('i', '<A-.>', '->', {buffer = true}) | |
| vim.keymap.set('i', '<M-S-.>', '=>', {buffer = true}) | |
| vim.keymap.set('i', '<M-S->>', '=>', {buffer = true}) | |
| vim.keymap.set('i', '<A-char-62>', '=>', {buffer = true}) | |
| -- vim.treesitter.start(args.buf, 'php') | |
| vim.lsp.start({ | |
| name = 'phpactor', | |
| cmd = {'phpactor', 'language-server'}, | |
| root_dir = vim.fs.root(args.buf, 'composer.json'), | |
| capabilities = defaultClientCapabilities(), | |
| init_options = { | |
| ['indexer.enabled_watchers'] = { | |
| 'lsp', | |
| }, | |
| ['logging.path'] = '/tmp/phpactor.log', | |
| ['completion_worse.completor.keyword.enabled'] = true, | |
| ['phpunit.enabled'] = true, | |
| ['language_server_worse_reflection.inlay_hints.enable'] = true, | |
| ['language_server_worse_reflection.inlay_hints.types'] = true, | |
| ['language_server_worse_reflection.inlay_hints.params'] = true, | |
| -- ['indexer.searcher_semi_fuzzy'] = true, | |
| }, | |
| }) | |
| end, | |
| }) | |
| vim.api.nvim_create_autocmd('LspAttach', { | |
| callback = function (args) | |
| vim.lsp.completion.enable(true, args.data.client_id, args.buf, {autotrigger = true}) | |
| vim.keymap.set({'i'}, '<C-Space>', function () | |
| vim.lsp.completion.trigger() | |
| end, {buffer = args.buf}) | |
| vim.api.nvim_create_autocmd({'TextChangedI'}, { | |
| buffer = args.buf, | |
| callback = function () | |
| vim.lsp.completion.trigger() | |
| end | |
| }) | |
| vim.api.nvim_create_autocmd('CompleteChanged', { | |
| buffer = args.buf, | |
| callback = function () | |
| local info = vim.fn.complete_info({'selected'}) | |
| local completionItem = vim.tbl_get(vim.v.completed_item, 'user_data', 'nvim', 'lsp', 'completion_item') | |
| if nil == completionItem then | |
| return | |
| end | |
| local resolvedItem = vim.lsp.buf_request_sync( | |
| args.buf, | |
| vim.lsp.protocol.Methods.completionItem_resolve, | |
| completionItem, | |
| 500 | |
| ) | |
| if nil == resolvedItem then | |
| return | |
| end | |
| local docs = vim.tbl_get(resolvedItem[args.data.client_id], 'result', 'documentation', 'value') | |
| if nil == docs then | |
| return | |
| end | |
| local winData = vim.api.nvim__complete_set(info['selected'], {info = docs}) | |
| if not winData.winid or not vim.api.nvim_win_is_valid(winData.winid) then | |
| return | |
| end | |
| vim.api.nvim_win_set_config(winData.winid, {border = 'rounded'}) | |
| vim.treesitter.start(winData.bufnr, 'markdown') | |
| vim.wo[winData.winid].conceallevel = 3 | |
| end | |
| }) | |
| end | |
| }) | |
| vim.go.completeopt = 'menu,noselect,menuone,popup' | |
| local pumMaps = { | |
| ['<Tab>'] = '<C-n>', | |
| ['<Down>'] = '<C-n>', | |
| ['<S-Tab>'] = '<C-p>', | |
| ['<Up>'] = '<C-p>', | |
| ['<CR>'] = '<C-y>', | |
| } | |
| for insertKmap, pumKmap in pairs(pumMaps) do | |
| vim.keymap.set( | |
| {'i'}, | |
| insertKmap, | |
| function () | |
| return vim.fn.pumvisible() == 1 and pumKmap or insertKmap | |
| end, | |
| {expr = true} | |
| ) | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment