diff --git a/.gitignore b/.gitignore index 677ea8b..0234127 100644 --- a/.gitignore +++ b/.gitignore @@ -116,4 +116,6 @@ settings.json resources/** lsp/** *.zip -scripts/** \ No newline at end of file +scripts/** + +run_todesktop.sh \ No newline at end of file diff --git a/README.md b/README.md index ab29a43..e4e5069 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,54 @@ + # Cursor -This is the repo for [Cursor](https://www.cursor.so), an editor built for pair programming with AI. +[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/getcursor/cursor/blob/main/LICENSE) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)]() [![](https://dcbadge.vercel.app/api/server/PJEgRywgRy?style=flat&compact=true)](https://discord.gg/PJEgRywgRy) -Feel free to file tickets for bugs or feature requests. Upvote 👍 the ones you'd like us to prioritize. +**[Cursor](cursor.so) is an editor made for programming with AI.** It's early days, but right now Cursor can help you with a few things... + +- **Write**: Generate 10-100 lines of code with an AI that's smarter than Copilot +- **Diff**: Ask the AI to edit a block of code, see only proposed changes +- **Chat**: ChatGPT-style interface that understands your current file +- **And more**: ask to fix lint errors, generate tests/comments on hover, etc. + +

+ +
+
+

## Getting Started Head over to [our website](https://cursor.so/) to download and try out the editor. -## Contributing +Feel free to file tickets for bugs or feature requests. Upvote 👍 the ones you'd like us to prioritize. -### Setup +## Roadmap -MacOS/Linux: +Long term, our plan is to build Cursor into the world's most productive development environment. Using LLMs, we want to do things like: +- Auto-fix errors as soon as they show up in your terminal +- Embed AI-written documentation into the UI +- "Heal" your repository when you're halfway through a refactor +- Allow you to code by editing a "pseudocode" version of your codebase + +If you're excited about working on this future, reach out to hiring@cursor.so + +## Development + +We welcome PRs :) To get started: ``` +git clone git@github.com:getcursor/cursor.git +cd cursor npm i -./setup.sh ``` -Windows: - +Then, download some non-versioned dependencies (ripgrep binaries and language server js): ``` -npm i -./setup.ps1 +./setup.sh # Mac/Linux +./setup.ps1 # Windows ``` -### Run +Finally, to run the client: ``` npm start diff --git a/package-lock.json b/package-lock.json index 359339f..23804fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "Cursor", - "version": "0.1.4", + "version": "0.1.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "Cursor", - "version": "0.1.4", + "version": "0.1.6", "license": "MIT", "dependencies": { "@codemirror/commands": "^6.2.1", diff --git a/package.json b/package.json index 3c4c39b..e06d680 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "email": "mntruell@gmail.com" }, "productName": "Cursor", - "version": "0.1.4", + "version": "0.1.6", "description": "Cursor is an AI-first coding environment.", "main": ".webpack/main", "scripts": { diff --git a/src/components/codemirrorHooks/extensions.ts b/src/components/codemirrorHooks/extensions.ts index 0c87bbd..c3db21b 100644 --- a/src/components/codemirrorHooks/extensions.ts +++ b/src/components/codemirrorHooks/extensions.ts @@ -507,5 +507,16 @@ export function useExtensions({ } }, [fileIndentUnit, editorRef.current, justCreated]) + useEffect(() => { + if (settings.tabSize != undefined) { + editorRef.current.view?.dispatch({ + effects: indentCompartment.reconfigure([ + indentUnit.of(" ".repeat(Number(settings.tabSize))), + EditorState.tabSize.of(Number(settings.tabSize)) + ]), + }) + } + }, [settings.tabSize, editorRef.current, justCreated]) + return globalExtensions } diff --git a/src/components/settingsPane.tsx b/src/components/settingsPane.tsx index 4cfe08c..5f6f70e 100644 --- a/src/components/settingsPane.tsx +++ b/src/components/settingsPane.tsx @@ -115,6 +115,26 @@ export function SettingsPopup() { /> +
+
+ Tab Size +
+
+ Controls the tab size +
+ { + dispatch( + changeSettings({ + tabSize: e.value, + }) + ) + }} + value={settings.tabSize} + /> +
+
Text Wrapping diff --git a/src/features/window/state.ts b/src/features/window/state.ts index e6dddcc..5a386bb 100644 --- a/src/features/window/state.ts +++ b/src/features/window/state.ts @@ -300,6 +300,7 @@ export interface Settings { useFour: string contextType: string textWrapping: string + tabSize?: string } export interface SettingsState { @@ -400,6 +401,7 @@ export const initialSettingsState = { useFour: 'disabled', contextType: 'none', textWrapping: 'disabled', + tabSize: undefined }, } diff --git a/src/index.css b/src/index.css index 837fa81..0dc2f0b 100644 --- a/src/index.css +++ b/src/index.css @@ -128,6 +128,10 @@ body { min-width: 140ch; } +.display_text_wrapping { + width: 100%; +} + .display_text_wrapping .cm_content { min-width: 100%; } @@ -542,6 +546,10 @@ li.rta__item--selected mark { overflow-y: auto; } +.cover-bar { + pointer-events: none; +} + .window__editorcontainer .cover-bar { background-color: var(--background); right: 0px; diff --git a/src/main/lsp.ts b/src/main/lsp.ts index 59dfa75..067bc81 100644 --- a/src/main/lsp.ts +++ b/src/main/lsp.ts @@ -34,6 +34,10 @@ const lspDir = app.isPackaged ? path.join(process.resourcesPath, 'lsp') : path.join(__dirname, '..', '..', 'lsp') + if (!fs.existsSync(lspDir)) { + fs.mkdirSync(lspDir) +} + // Get the architecture and osType from electron // architecture can take the values of 'arm', 'arm64', 'ia32', or 'x64' const architecture = process.arch @@ -419,7 +423,7 @@ class LSPManager { case 'c': let cVersion = await getLatestVersion( - 'https://api.github.com/clangd/clangd/releases/latest' + 'https://api.github.com/repos/clangd/clangd/releases/latest' ) if (osType === 'Darwin') { remoteUrl = `https://github.com/clangd/clangd/releases/download/${cVersion}/clangd-mac-${cVersion}.zip` @@ -434,7 +438,6 @@ class LSPManager { if (!fs.existsSync(cDir)) { fs.mkdirSync(cDir) } - // fetch and download it downloadPath = path.join(lspDir, 'c', 'clangd.zip') await downloadFile(remoteUrl, downloadPath) diff --git a/src/main/main.ts b/src/main/main.ts index 0fb15a0..4a4bc27 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -108,6 +108,7 @@ process.on('unhandledRejection', (error) => { }) const createWindow = () => { + const width = 1500, height = 800; // Create the browser window. const main_window = new BrowserWindow({ ...(process.platform === 'darwin' @@ -117,8 +118,10 @@ const createWindow = () => { trafficLightPosition: { x: 10, y: 10 }, } : { frame: false }), - width: 1500, - height: 800, + width: width, + height: height, + minWidth: width / 2 + minHeight: height / 2, title: 'Cursor', webPreferences: { // @ts-ignore