diff --git a/package.json b/package.json index dae1d9de..6903f56a 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-slot": "^1.1.0", + "@replit/codemirror-vim": "^6.2.1", "@uiw/react-codemirror": "^4.23.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", diff --git a/src/app/page.tsx b/src/app/page.tsx index ce6339da..e933c8fc 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,30 +1,31 @@ 'use client'; +import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; -import { Separator } from "@/components/ui/separator"; -import { useNonEmptyQueryParam } from "@/hooks/useNonEmptyQueryParam"; -import { defaultKeymap } from "@codemirror/commands"; -import { javascript } from "@codemirror/lang-javascript"; -import { EditorView, keymap, ViewPlugin, ViewUpdate } from "@codemirror/view"; -import { SymbolIcon, FileIcon, Cross1Icon } from "@radix-ui/react-icons"; -import { ScrollArea, Scrollbar } from "@radix-ui/react-scroll-area"; -import CodeMirror from '@uiw/react-codemirror'; -import Image from "next/image"; -import { useRouter } from "next/navigation"; -import { useEffect, useMemo, useState } from "react"; -import { useDebouncedCallback } from 'use-debounce'; -import logoLight from "../../public/sb_logo_light.png"; -import logoDark from "../../public/sb_logo_dark.png"; import { ResizableHandle, ResizablePanel, ResizablePanelGroup, } from "@/components/ui/resizable"; +import { Separator } from "@/components/ui/separator"; +import { useNonEmptyQueryParam } from "@/hooks/useNonEmptyQueryParam"; import { GetSourceResponse, pathQueryParamName, repoQueryParamName } from "@/lib/api"; import { createPathWithQueryParams } from "@/lib/utils"; -import { ThemeSelectorButton } from "./themeSelectorButton"; +import { defaultKeymap } from "@codemirror/commands"; +import { javascript } from "@codemirror/lang-javascript"; +import { EditorView, keymap, ViewPlugin, ViewUpdate } from "@codemirror/view"; +import { Cross1Icon, FileIcon, SymbolIcon } from "@radix-ui/react-icons"; +import { ScrollArea, Scrollbar } from "@radix-ui/react-scroll-area"; +import { vim } from "@replit/codemirror-vim"; +import CodeMirror from '@uiw/react-codemirror'; import { useTheme } from "next-themes"; -import { Button } from "@/components/ui/button"; +import Image from "next/image"; +import { useRouter } from "next/navigation"; +import { useEffect, useMemo, useState } from "react"; +import { useDebouncedCallback } from 'use-debounce'; +import logoDark from "../../public/sb_logo_dark.png"; +import logoLight from "../../public/sb_logo_light.png"; +import { ThemeSelectorButton } from "./themeSelectorButton"; interface ZoekMatch { URL: string, @@ -158,6 +159,7 @@ export default function Home() { code={code} filepath={filepath} onClose={() => setIsCodePanelOpen(false)} + keymapType="default" /> )} @@ -169,12 +171,14 @@ export default function Home() { interface CodeEditorProps { code: string; filepath: string; + keymapType: "default" | "vim"; onClose: () => void; } const CodeEditor = ({ code, filepath, + keymapType, onClose, }: CodeEditorProps) => { const { theme: _theme, systemTheme } = useTheme(); @@ -208,7 +212,7 @@ const CodeEditor = ({