summaryrefslogtreecommitdiff
path: root/nvim/lsp/ts_ls.lua
diff options
context:
space:
mode:
authoranand <anand.panchdhari@gmail.com>2025-12-17 15:57:55 +0530
committeranand <anand.panchdhari@gmail.com>2025-12-17 15:57:55 +0530
commitb7ef29a8886a57aadb787807a7c6cf74c1f0ed3a (patch)
tree366a68240fbc9da6b1d567bd6c46d1350ad814de /nvim/lsp/ts_ls.lua
Nixos
Diffstat (limited to 'nvim/lsp/ts_ls.lua')
-rwxr-xr-xnvim/lsp/ts_ls.lua104
1 files changed, 104 insertions, 0 deletions
diff --git a/nvim/lsp/ts_ls.lua b/nvim/lsp/ts_ls.lua
new file mode 100755
index 0000000..e3cc99b
--- /dev/null
+++ b/nvim/lsp/ts_ls.lua
@@ -0,0 +1,104 @@
+---@brief
+---
+--- https://github.com/typescript-language-server/typescript-language-server
+---
+--- `ts_ls`, aka `typescript-language-server`, is a Language Server Protocol implementation for TypeScript wrapping `tsserver`. Note that `ts_ls` is not `tsserver`.
+---
+--- `typescript-language-server` depends on `typescript`. Both packages can be installed via `npm`:
+--- ```sh
+--- npm install -g typescript typescript-language-server
+--- ```
+---
+--- To configure typescript language server, add a
+--- [`tsconfig.json`](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html) or
+--- [`jsconfig.json`](https://code.visualstudio.com/docs/languages/jsconfig) to the root of your
+--- project.
+---
+--- Here's an example that disables type checking in JavaScript files.
+---
+--- ```json
+--- {
+--- "compilerOptions": {
+--- "module": "commonjs",
+--- "target": "es6",
+--- "checkJs": false
+--- },
+--- "exclude": [
+--- "node_modules"
+--- ]
+--- }
+--- ```
+---
+--- Use the `:LspTypescriptSourceAction` command to see "whole file" ("source") code-actions such as:
+--- - organize imports
+--- - remove unused code
+
+return {
+ init_options = { hostInfo = 'neovim' },
+ cmd = { 'typescript-language-server', '--stdio' },
+ filetypes = {
+ 'javascript',
+ 'javascriptreact',
+ 'javascript.jsx',
+ 'typescript',
+ 'typescriptreact',
+ 'typescript.tsx',
+ },
+ root_markers = { 'tsconfig.json', 'jsconfig.json', 'package.json', '.git' },
+ handlers = {
+ -- handle rename request for certain code actions like extracting functions / types
+ ['_typescript.rename'] = function(_, result, ctx)
+ local client = assert(vim.lsp.get_client_by_id(ctx.client_id))
+ vim.lsp.util.show_document({
+ uri = result.textDocument.uri,
+ range = {
+ start = result.position,
+ ['end'] = result.position,
+ },
+ }, client.offset_encoding)
+ vim.lsp.buf.rename()
+ return vim.NIL
+ end,
+ },
+ commands = {
+ ['editor.action.showReferences'] = function(command, ctx)
+ local client = assert(vim.lsp.get_client_by_id(ctx.client_id))
+ local file_uri, position, references = unpack(command.arguments)
+
+ local quickfix_items = vim.lsp.util.locations_to_items(references, client.offset_encoding)
+ vim.fn.setqflist({}, ' ', {
+ title = command.title,
+ items = quickfix_items,
+ context = {
+ command = command,
+ bufnr = ctx.bufnr,
+ },
+ })
+
+ vim.lsp.util.show_document({
+ uri = file_uri,
+ range = {
+ start = position,
+ ['end'] = position,
+ },
+ }, client.offset_encoding)
+
+ vim.cmd('botright copen')
+ end,
+ },
+ on_attach = function(client, bufnr)
+ -- ts_ls provides `source.*` code actions that apply to the whole file. These only appear in
+ -- `vim.lsp.buf.code_action()` if specified in `context.only`.
+ vim.api.nvim_buf_create_user_command(bufnr, 'LspTypescriptSourceAction', function()
+ local source_actions = vim.tbl_filter(function(action)
+ return vim.startswith(action, 'source.')
+ end, client.server_capabilities.codeActionProvider.codeActionKinds)
+
+ vim.lsp.buf.code_action({
+ context = {
+ only = source_actions,
+ },
+ })
+ end, {})
+ end,
+}