diff --git a/src/file_type_config.zig b/src/file_type_config.zig index 944ea16..a8b8a74 100644 --- a/src/file_type_config.zig +++ b/src/file_type_config.zig @@ -23,6 +23,7 @@ pub const default = struct { pub const folder_icon = ""; fn from_file_type(file_type: syntax.FileType) @This() { + const lsp_defaults: LspDefaults = static_file_type_lsp_defaults.get(file_type.name) orelse .{}; return .{ .name = file_type.name, .color = file_type.color, @@ -33,8 +34,8 @@ fn from_file_type(file_type: syntax.FileType) @This() { .first_line_matches_content = if (file_type.first_line_matches) |flm| flm.content else null, .parser = file_type.name, .comment = file_type.comment, - .formatter = file_type.formatter, - .language_server = file_type.language_server, + .formatter = lsp_defaults.formatter, + .language_server = lsp_defaults.language_server, }; } @@ -199,6 +200,46 @@ pub fn create_syntax_guess_file_type( return create_syntax(file_type, allocator, query_cache); } +const static_file_type_lsp_defaults_list = load_file_type_lsp_defaults(@import("file_type_lsp.zig")); +const static_file_type_lsp_defaults = std.StaticStringMap(LspDefaults).initComptime(static_file_type_lsp_defaults_list); + +const LspDefaults = struct { + formatter: ?[]const []const u8 = null, + language_server: ?[]const []const u8 = null, +}; +const ListEntry = struct { []const u8, LspDefaults }; + +fn load_file_type_lsp_defaults(comptime Namespace: type) []const ListEntry { + comptime switch (@typeInfo(Namespace)) { + .@"struct" => |info| { + var count = 0; + for (info.decls) |_| count += 1; + var construct_types: [count]ListEntry = undefined; + var i = 0; + for (info.decls) |decl| { + const lang = decl.name; + const args = @field(Namespace, lang); + construct_types[i] = .{ lang, .{ + .formatter = if (@hasField(@TypeOf(args), "formatter")) vec(args.formatter) else null, + .language_server = if (@hasField(@TypeOf(args), "language_server")) vec(args.language_server) else null, + } }; + i += 1; + } + const types = construct_types; + return &types; + }, + else => @compileError("expected tuple or struct type"), + }; +} + +fn vec(comptime args: anytype) []const []const u8 { + var cmd: []const []const u8 = &[_][]const u8{}; + inline for (args) |arg| { + cmd = cmd ++ [_][]const u8{arg}; + } + return cmd; +} + const syntax = @import("syntax"); const std = @import("std"); const root = @import("root"); diff --git a/src/file_type_lsp.zig b/src/file_type_lsp.zig new file mode 100644 index 0000000..facfe14 --- /dev/null +++ b/src/file_type_lsp.zig @@ -0,0 +1,223 @@ +pub const agda = .{}; + +pub const astro = .{ + .language_server = .{ "astro-ls", "--stdio" }, +}; + +pub const bash = .{ + .language_server = .{ "bash-language-server", "start" }, + .formatter = .{ "shfmt", "--indent", "4" }, +}; + +pub const c = .{ + .language_server = .{"clangd"}, + .formatter = .{"clang-format"}, +}; + +pub const @"c-sharp" = .{ + .language_server = .{ "OmniSharp", "-lsp" }, + .formatter = .{ "csharpier", "format" }, +}; + +pub const conf = .{}; + +pub const cmake = .{ + .language_server = .{"cmake-language-server"}, + .formatter = .{"cmake-format"}, +}; + +pub const cpp = .{ + .language_server = .{"clangd"}, + .formatter = .{"clang-format"}, +}; + +pub const css = .{ + .language_server = .{ "vscode-css-language-server", "--stdio" }, +}; + +pub const diff = .{}; + +pub const dockerfile = .{}; + +pub const dtd = .{}; + +pub const elixir = .{ + .language_server = .{"elixir-ls"}, + .formatter = .{ "mix", "format", "-" }, +}; + +pub const fish = .{}; + +pub const @"git-rebase" = .{}; + +pub const gitcommit = .{}; + +pub const gleam = .{ + .language_server = .{ "gleam", "lsp" }, + .formatter = .{ "gleam", "format", "--stdin" }, +}; + +pub const go = .{ + .language_server = .{"gopls"}, + .formatter = .{"gofmt"}, +}; + +pub const hare = .{}; + +pub const haskell = .{ + .language_server = .{ "haskell-language-server-wrapper", "lsp" }, +}; + +pub const html = .{ + .language_server = .{ "superhtml", "lsp" }, // https://github.com/kristoff-it/super-html.git + .formatter = .{ "superhtml", "fmt", "--stdin" }, +}; + +pub const superhtml = .{ + .language_server = .{ "superhtml", "lsp" }, + .formatter = .{ "superhtml", "fmt", "--stdin-super" }, +}; + +pub const hurl = .{}; + +pub const java = .{}; + +pub const javascript = .{ + .language_server = .{ "typescript-language-server", "--stdio" }, + .formatter = .{ "prettier", "--parser", "typescript" }, +}; + +pub const json = .{ + .language_server = .{ "vscode-json-language-server", "--stdio" }, + .formatter = .{ "prettier", "--parser", "json" }, +}; + +pub const julia = .{ + .language_server = .{ "julia", "-e", "using LanguageServer; runserver()" }, + .formatter = .{ "julia", "-e", "using JuliaFormatter; print(format_text(read(stdin, String)))" }, +}; + +pub const kdl = .{}; + +pub const lua = .{ + .language_server = .{"lua-lsp"}, +}; + +pub const mail = .{}; + +pub const make = .{}; + +pub const markdown = .{ + .language_server = .{ "marksman", "server" }, + .formatter = .{ "prettier", "--parser", "markdown" }, +}; + +pub const @"markdown-inline" = .{}; + +pub const nasm = .{}; + +pub const nim = .{ + .language_server = .{"nimlangserver"}, +}; + +pub const nimble = .{}; + +pub const ninja = .{}; + +pub const nix = .{ + .language_server = .{"nixd"}, + .formatter = .{"alejandra"}, +}; + +pub const nu = .{ + .language_server = .{ "nu", "--lsp" }, +}; + +pub const ocaml = .{ + .language_server = .{ "ocamllsp", "--fallback-read-dot-merlin" }, + .formatter = .{ "ocamlformat", "--profile=ocamlformat", "-" }, +}; + +pub const odin = .{ + .language_server = .{"ols"}, + .formatter = .{ "odinfmt", "-stdin" }, +}; + +pub const openscad = .{ + .language_server = .{"openscad-lsp"}, +}; + +pub const org = .{}; + +pub const php = .{ + .language_server = .{ "intelephense", "--stdio" }, +}; + +pub const powershell = .{}; + +pub const proto = .{}; + +pub const purescript = .{}; + +pub const python = .{ + .language_server = .{"pylsp"}, +}; + +pub const regex = .{}; + +pub const rpmspec = .{}; + +pub const ruby = .{ + .language_server = .{"ruby-lsp"}, +}; + +pub const rust = .{ + .language_server = .{"rust-analyzer"}, + .formatter = .{"rustfmt"}, +}; + +pub const scheme = .{}; + +pub const sql = .{}; + +pub const @"ssh-config" = .{}; + +pub const swift = .{ + .language_server = .{"sourcekit-lsp"}, + .formatter = .{"swift-format"}, +}; + +pub const verilog = .{ + .language_server = .{"verible-verilog-ls"}, + .formatter = .{ "verible-verilog-format", "-" }, +}; + +pub const toml = .{}; + +pub const typescript = .{ + .language_server = .{ "typescript-language-server", "--stdio" }, + .formatter = .{ "prettier", "--parser", "typescript" }, +}; + +pub const typst = .{ + .language_server = .{"tinymist"}, +}; + +pub const uxntal = .{}; + +pub const vim = .{}; + +pub const xml = .{ + .formatter = .{ "xmllint", "--format", "-" }, +}; + +pub const yaml = .{}; + +pub const zig = .{ + .language_server = .{"zls"}, + .formatter = .{ "zig", "fmt", "--stdin" }, +}; + +pub const ziggy = .{}; + +pub const @"ziggy-schema" = .{};