mirror of https://github.com/getcursor/cursor
Merge branch 'main' of github.com:getcursor/cursor
commit
a248be14ae
48
README.md
48
README.md
|
@ -1,37 +1,55 @@
|
|||
|
||||
# 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.
|
||||
|
||||
<p align="center">
|
||||
<a href="https://cursor.so/">
|
||||
<img src="https://user-images.githubusercontent.com/4297743/227696390-0c1886c7-0cda-4528-9259-0b2944892d4c.png" width="1000"><br>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
## 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
|
||||
```
|
||||
|
||||
### Advanced
|
||||
|
||||
Interested in getting paid to work on Cursor remotely? Feel free to reach out to hiring@cursor.so.
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
Invoke-WebRequest -Uri https://cursor.so/resources.zip -o ./resources.zip
|
||||
Invoke-WebRequest -Uri https://cursor.so/lsp.zip -o ./lsp.zip
|
||||
Invoke-WebRequest -Uri https://cursor-github.s3.us-west-1.amazonaws.com/resources.zip -o ./resources.zip
|
||||
Invoke-WebRequest -Uri https://cursor-github.s3.us-west-1.amazonaws.com/lsp.zip -o ./lsp.zip
|
||||
|
||||
Expand-Archive -Path ./resources.zip -DestinationPath ./resources
|
||||
Expand-Archive -Path ./lsp.zip -DestinationPath ./lsp
|
||||
Expand-Archive -Path ./resources.zip -DestinationPath ./
|
||||
Expand-Archive -Path ./lsp.zip -DestinationPath ./
|
||||
|
||||
Remove-Item -Path ./resources.zip
|
||||
Remove-Item -Path ./lsp.zip
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -115,6 +115,26 @@ export function SettingsPopup() {
|
|||
/>
|
||||
</div>
|
||||
|
||||
<div className="settings__item">
|
||||
<div className="settings__item_title">
|
||||
Tab Size
|
||||
</div>
|
||||
<div className="settings__item_description">
|
||||
Controls the tab size
|
||||
</div>
|
||||
<Dropdown
|
||||
options={['2', '4', '8']}
|
||||
onChange={(e) => {
|
||||
dispatch(
|
||||
changeSettings({
|
||||
tabSize: e.value,
|
||||
})
|
||||
)
|
||||
}}
|
||||
value={settings.tabSize}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="settings__item">
|
||||
<div className="settings__item_title">
|
||||
Text Wrapping
|
||||
|
|
|
@ -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
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
@ -128,6 +128,10 @@ body {
|
|||
min-width: 140ch;
|
||||
}
|
||||
|
||||
.display_text_wrapping {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.display_text_wrapping .cm_content {
|
||||
min-width: 100%;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue