Dax Raad 7 месяцев назад
Родитель
Сommit
cf83e31f23
2 измененных файлов с 62 добавлено и 4 удалено
  1. 58 0
      packages/opencode/src/lsp/server.ts
  2. 4 4
      packages/opencode/src/tool/edit.ts

+ 58 - 0
packages/opencode/src/lsp/server.ts

@@ -4,6 +4,8 @@ import path from "path"
 import { Global } from "../global"
 import { Log } from "../util/log"
 import { BunProc } from "../bun"
+import { $ } from "bun"
+import fs from "fs/promises"
 
 export namespace LSPServer {
   const log = Log.create({ service: "lsp.server" })
@@ -144,4 +146,60 @@ export namespace LSPServer {
       }
     },
   }
+
+  export const ElixirLS: Info = {
+    id: "elixir-ls",
+    extensions: [".ex", ".exs"],
+    async spawn() {
+      let binary = Bun.which("elixir-ls")
+      if (!binary) {
+        const elixirLsPath = path.join(Global.Path.bin, "elixir-ls")
+        binary = path.join(
+          Global.Path.bin,
+          "elixir-ls-master",
+          "release",
+          process.platform === "win32"
+            ? "language_server.bar"
+            : "language_server.sh",
+        )
+
+        if (!(await Bun.file(binary).exists())) {
+          const elixir = Bun.which("elixir")
+          if (!elixir) {
+            log.error("elixir is required to run elixir-ls")
+            return
+          }
+
+          log.info("downloading elixir-ls from GitHub releases")
+
+          const response = await fetch(
+            "https://github.com/elixir-lsp/elixir-ls/archive/refs/heads/master.zip",
+          )
+          if (!response.ok) return
+          const zipPath = path.join(Global.Path.bin, "elixir-ls.zip")
+          await Bun.file(zipPath).write(response)
+
+          await $`unzip -o -q ${zipPath}`.cwd(Global.Path.bin).nothrow()
+
+          await fs.rm(zipPath, {
+            force: true,
+            recursive: true,
+          })
+
+          await $`mix deps.get && mix compile && mix elixir_ls.release2 -o release`
+            .quiet()
+            .cwd(path.join(Global.Path.bin, "elixir-ls-master"))
+            .env({ MIX_ENV: "prod", ...process.env })
+
+          log.info(`installed elixir-ls`, {
+            path: elixirLsPath,
+          })
+        }
+      }
+
+      return {
+        process: spawn(binary),
+      }
+    },
+  }
 }

+ 4 - 4
packages/opencode/src/tool/edit.ts

@@ -489,10 +489,10 @@ export function replace(
     BlockAnchorReplacer,
     WhitespaceNormalizedReplacer,
     IndentationFlexibleReplacer,
-    EscapeNormalizedReplacer,
-    TrimmedBoundaryReplacer,
-    ContextAwareReplacer,
-    MultiOccurrenceReplacer,
+    // EscapeNormalizedReplacer,
+    // TrimmedBoundaryReplacer,
+    // ContextAwareReplacer,
+    // MultiOccurrenceReplacer,
   ]) {
     for (const search of replacer(content, oldString)) {
       const index = content.indexOf(search)