1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
---@brief
---
--- https://www.npmjs.com/package/@github/copilot-language-server
---
--- The Copilot Language Server enables any editor or IDE
--- to integrate with GitHub Copilot via
--- [the language server protocol](https://microsoft.github.io/language-server-protocol/).
---
--- **[GitHub Copilot](https://github.com/features/copilot)**
--- is an AI pair programmer tool that helps you write code faster and smarter.
---
--- **Sign up for [GitHub Copilot Free](https://github.com/settings/copilot)!**
---
--- Please see [terms of use for GitHub Copilot](https://docs.github.com/en/site-policy/github-terms/github-terms-for-additional-products-and-features#github-copilot)
---
--- You need to enable `:help lsp-inline-completion` to receive suggestions. For example, you can enable it in the LspAttach event:
---
--- ```lua
--- vim.api.nvim_create_autocmd('LspAttach', {
--- callback = function(args)
--- local bufnr = args.buf
--- local client = assert(vim.lsp.get_client_by_id(args.data.client_id))
---
--- if client:supports_method(vim.lsp.protocol.Methods.textDocument_inlineCompletion, bufnr) then
--- vim.lsp.inline_completion.enable(true, { bufnr = bufnr })
---
--- vim.keymap.set(
--- 'i',
--- '<C-F>',
--- vim.lsp.inline_completion.get,
--- { desc = 'LSP: accept inline completion', buffer = bufnr }
--- )
--- vim.keymap.set(
--- 'i',
--- '<C-G>',
--- vim.lsp.inline_completion.select,
--- { desc = 'LSP: switch inline completion', buffer = bufnr }
--- )
--- end
--- end
--- })
--- ```
---@param bufnr integer,
---@param client vim.lsp.Client
local function sign_in(bufnr, client)
client:request(
---@diagnostic disable-next-line: param-type-mismatch
'signIn',
vim.empty_dict(),
function(err, result)
if err then
vim.notify(err.message, vim.log.levels.ERROR)
return
end
if result.command then
local code = result.userCode
local command = result.command
vim.fn.setreg('+', code)
vim.fn.setreg('*', code)
local continue = vim.fn.confirm(
'Copied your one-time code to clipboard.\n' .. 'Open the browser to complete the sign-in process?',
'&Yes\n&No'
)
if continue == 1 then
client:exec_cmd(command, { bufnr = bufnr }, function(cmd_err, cmd_result)
if cmd_err then
vim.notify(err.message, vim.log.levels.ERROR)
return
end
if cmd_result.status == 'OK' then
vim.notify('Signed in as ' .. cmd_result.user .. '.')
end
end)
end
end
if result.status == 'PromptUserDeviceFlow' then
vim.notify('Enter your one-time code ' .. result.userCode .. ' in ' .. result.verificationUri)
elseif result.status == 'AlreadySignedIn' then
vim.notify('Already signed in as ' .. result.user .. '.')
end
end
)
end
---@param client vim.lsp.Client
local function sign_out(_, client)
client:request(
---@diagnostic disable-next-line: param-type-mismatch
'signOut',
vim.empty_dict(),
function(err, result)
if err then
vim.notify(err.message, vim.log.levels.ERROR)
return
end
if result.status == 'NotSignedIn' then
vim.notify('Not signed in.')
end
end
)
end
---@type vim.lsp.Config
return {
cmd = {
'copilot-language-server',
'--stdio',
},
root_markers = { '.git' },
init_options = {
editorInfo = {
name = 'Neovim',
version = tostring(vim.version()),
},
editorPluginInfo = {
name = 'Neovim',
version = tostring(vim.version()),
},
},
settings = {
telemetry = {
telemetryLevel = 'all',
},
},
on_attach = function(client, bufnr)
vim.api.nvim_buf_create_user_command(bufnr, 'LspCopilotSignIn', function()
sign_in(bufnr, client)
end, { desc = 'Sign in Copilot with GitHub' })
vim.api.nvim_buf_create_user_command(bufnr, 'LspCopilotSignOut', function()
sign_out(bufnr, client)
end, { desc = 'Sign out Copilot with GitHub' })
end,
}
|