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
|
---@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)
---
---@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,
}
|