Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
kyoh86 committed Jan 9, 2024
1 parent 34cd61c commit abf9b2f
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 49 deletions.
20 changes: 15 additions & 5 deletions denops/ollama/dispatch/start_chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ import {
import type { Opener } from "./types.ts";
import { generateCompletion } from "../api.ts";
import PromptBufferEcho from "../util/prompt_buffer_echo.ts";
import BufferHighlight from "../util/buffer_highlight.ts";
import {
type BufferHighlight,
createBufferHighlight,
} from "../util/buffer_highlight.ts";
import { canceller } from "../util/cancellable.ts";

export default async function start_chat(
Expand All @@ -35,8 +38,7 @@ export default async function start_chat(
await option.swapfile.setBuffer(denops, bufnr, false);
await fn.bufload(denops, bufnr);

const highlighter = new BufferHighlight(bufnr);
await highlighter.setup(denops);
const highlighter = await createBufferHighlight(denops, bufnr);

await fn.prompt_setprompt(denops, bufnr, `(${model})>> `);
await fn.prompt_setinterrupt(denops, bufnr, "ollama#internal#cancel");
Expand All @@ -58,7 +60,11 @@ export default async function start_chat(
await helper.execute(denops, "setlocal wrap");
await helper.execute(denops, "startinsert");

await highlighter.markPrefix(denops, 2, `(${model})>> `);
await highlighter.markPrefix(
denops,
2,
await fn.strlen(denops, `(${model})>> `),
);
});
}

Expand All @@ -76,7 +82,11 @@ async function promptCallback(
getLogger("denops-ollama-verbose").debug(`prompt: ${prompt}`);

const info = await fn.getbufinfo(denops, bufnr);
highlighter.markPrefix(denops, info[0].linecount, `(${model})>> `);
highlighter.markPrefix(
denops,
info[0].linecount,
await fn.strlen(denops, `(${model})>> `),
);

const context = maybe(
await fn.getbufvar(denops, bufnr, "ollama_chat_context"),
Expand Down
20 changes: 15 additions & 5 deletions denops/ollama/dispatch/start_chat_with_context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ import {
isGenerateChatCompletionMessage,
} from "../api.ts";
import PromptBufferEcho from "../util/prompt_buffer_echo.ts";
import BufferHighlight from "../util/buffer_highlight.ts";
import {
type BufferHighlight,
createBufferHighlight,
} from "../util/buffer_highlight.ts";
import { canceller } from "../util/cancellable.ts";

const isBufferInfo = is.OneOf([
Expand Down Expand Up @@ -139,8 +142,7 @@ export async function start_chat_with_context(
await option.swapfile.setBuffer(denops, bufnr, false);
await fn.bufload(denops, bufnr);

const highlighter = new BufferHighlight(bufnr);
await highlighter.setup(denops);
const highlighter = await createBufferHighlight(denops, bufnr);

await fn.prompt_setprompt(denops, bufnr, `(${model})>> `);
await fn.prompt_setinterrupt(denops, bufnr, "ollama#internal#cancel");
Expand All @@ -162,7 +164,11 @@ export async function start_chat_with_context(
await helper.execute(denops, "setlocal wrap");
await helper.execute(denops, "startinsert");

await highlighter.markPrefix(denops, 2, `(${model})>> `);
await highlighter.markPrefix(
denops,
2,
await fn.strlen(denops, `(${model})>> `),
);
});
}

Expand All @@ -180,7 +186,11 @@ async function promptCallback(
getLogger("denops-ollama-verbose").debug(`prompt: ${prompt}`);

const info = await fn.getbufinfo(denops, bufnr);
highlighter.markPrefix(denops, info[0].linecount, `(${model})>> `);
highlighter.markPrefix(
denops,
info[0].linecount,
await fn.strlen(denops, `(${model})>> `),
);

const messages = maybe(
await fn.getbufvar(denops, bufnr, "ollama_chat_context"),
Expand Down
13 changes: 9 additions & 4 deletions denops/ollama/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ import {
is,
maybe,
} from "https://deno.land/x/[email protected]/mod.ts";
import { handlers, setup } from "https://deno.land/[email protected]/log/mod.ts";
import {
handlers as logHandlers,
setup as setupLog,
} from "https://deno.land/[email protected]/log/mod.ts";

import start_chat from "./dispatch/start_chat.ts";
import list_models from "./dispatch/list_models.ts";
Expand All @@ -18,16 +21,17 @@ import {
start_chat_with_context,
} from "./dispatch/start_chat_with_context.ts";
import { isOpener } from "./dispatch/types.ts";
import { setup as setupHighlight } from "../util/buffer_highlight.ts";
import { mapCancel } from "./util/cancellable.ts";

export async function main(denops: Denops) {
const cacheFile = join(xdg.cache(), "denops-ollama-vim", "log.txt");
await ensureFile(cacheFile);

setup({
setupLog({
handlers: {
console: new handlers.ConsoleHandler("DEBUG"),
cache: new handlers.RotatingFileHandler("DEBUG", {
console: new logHandlers.ConsoleHandler("DEBUG"),
cache: new logHandlers.RotatingFileHandler("DEBUG", {
filename: cacheFile,
formatter: (record) => {
return `${record.datetime.toISOString()} ${record.levelName} ${record.msg}`;
Expand All @@ -49,6 +53,7 @@ export async function main(denops: Denops) {
});

await mapCancel(denops);
await setupHighlight(denops);

denops.dispatcher = {
async open_log() {
Expand Down
92 changes: 57 additions & 35 deletions denops/ollama/util/buffer_highlight.ts
Original file line number Diff line number Diff line change
@@ -1,49 +1,71 @@
import { type Denops } from "https://deno.land/x/[email protected]/mod.ts";
import * as fn from "https://deno.land/x/[email protected]/function/mod.ts";

export async function setup(denops: Denops) {
await denops.cmd("highlight default link OllamaPrompt Question");
}

export interface BufferHighlight {
markPrefix(
denops: Denops,
lnum: number,
bytes: number,
): Promise<void>;
}

export async function createBufferHighlight(
denops: Denops,
bufnr: number,
): Promise<BufferHighlight> {
if (denops.meta.host === "nvim") {
return new BufferHighlightForNeovim(bufnr);
}
if (denops.meta.host == "vim") {
const i = new BufferHighlightForVim(bufnr);
await i.prepare(denops);
return i;
}
throw new Error(`Unsupported host: ${denops.meta.host}`);
}

// UNDONE: split implment into vim and nvim
export default class BufferHighlight {
class BufferHighlightForVim implements BufferHighlight {
#bufnr: number;
constructor(bufnr: number) {
this.#bufnr = bufnr;
}

async setup(denops: Denops) {
await denops.cmd("highlight default link OllamaPrompt Question");
async prepare(denops: Denops) {
await denops.call("prop_type_add", "ollama-prompt", {
bufnr: this.#bufnr,
highlight: "OllamaPrompt",
});
}

async prepare(denops: Denops) {
if (denops.meta.host === "vim") {
await denops.call("prop_type_add", "ollama-prompt", {
bufnr: this.#bufnr,
highlight: "OllamaPrompt",
});
}
if (denops.meta.host === "nvim") {
// noop
}
async markPrefix(denops: Denops, lnum: number, bytes: number) {
await denops.call("prop_add", "ollama-prompt", {
bufnr: this.#bufnr,
highlight: "OllamaPrompt",
col: 1,
lnum: lnum,
length: bytes,
});
}
}
class BufferHighlightForNeovim implements BufferHighlight {
#bufnr: number;
constructor(bufnr: number) {
this.#bufnr = bufnr;
}

async markPrefix(denops: Denops, lnum: number, prefix: string) {
if (denops.meta.host === "vim") {
await denops.call("prop_add", "ollama-prompt", {
bufnr: this.#bufnr,
highlight: "OllamaPrompt",
col: 1,
lnum: lnum,
length: await fn.strlen(denops, prefix),
});
}
if (denops.meta.host === "nvim") {
await denops.call(
"nvim_buf_add_highlight",
this.#bufnr,
-1,
"OllamaPrompt",
lnum - 1,
0,
await fn.strlen(denops, prefix),
);
}
async markPrefix(denops: Denops, lnum: number, bytes: number) {
await denops.call(
"nvim_buf_add_highlight",
this.#bufnr,
-1,
"OllamaPrompt",
lnum - 1,
0,
bytes,
);
}
}

0 comments on commit abf9b2f

Please sign in to comment.