Skip to content

Instantly share code, notes, and snippets.

@przepompownia
Last active August 31, 2025 11:48
Show Gist options
  • Select an option

  • Save przepompownia/0690ebe28a24bd10b45118fceb980dfd to your computer and use it in GitHub Desktop.

Select an option

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
# 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
--- @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