CodeEditApp / CodeEditSourceEditor

A code editor view written in Swift powered by tree-sitter.
https://codeeditapp.github.io/CodeEditSourceEditor/documentation/codeeditsourceeditor
MIT License
517 stars 84 forks source link

✨ Multiple Cursors #30

Closed Jeehut closed 1 year ago

Jeehut commented 2 years ago

Problem: Sometimes, you have multiple variables or a collection and you want to edit all occurrences at the same time.

Solution: Other code editors like Atom and even Xcode have added multiple-cursor support to conveniently edit multiple places at once, this can save lots of time. We should add a similar feature here, too. Part of supporting multiple cursors, it's also important that this feature is accompanied by ways to create multiple cursors. I suggest the following two ways:

  1. A shortcut that select other occurrences of the currently selected text within the same file (creating multiple cursors with selection). In Atom that's Cmd+D, in Xcode it's Cmd+Alt+E. I suggest that this comparison is case-sensitive.
  2. A keyboard-command to explicitly specify the places with the mouse cursor where the multiple text cursors should be created. In Xcode, this happens by holding the Alt key and either pressing manually into multiple places or by simply clicking the mouse and dragging it down to create multiple cursors at the same column on multiple lines.

https://user-images.githubusercontent.com/806104/171508531-bd3e7186-7808-442f-8f56-d115b4fae260.mov

Alternatives considered: Making the search with the shortcut case-insensitive (like Xcode does by default, it changes based on your last search settingS) makes this feature error prone when there's for example a class named String and 5 variables named string and I want to just edit the variables, I might accidentally also select the class.

Atom also supports a shortcut for finding all occurrences of the currently selected text in the file and create multiple cursors for all. This seems to be an extra feature that could be added later on. In the meantime, just holding the last key of the shortcut should select all entries within the same file relatively quickly as an alternative.

austincondiff commented 2 years ago

When you hold option, any subsequent click will add additional cursors in the location that was clicked. If there is already a cursor in that location and there is more than one cursor, it removes that cursor. If option is held and the mouse is pressed down and dragged, it makes a secondary selection.

If option + shift is held and the mouse is dragged, then it enables column selection and you can either add cursors if the mouse is moved straight down or if it is moved diagonally it will make a selection from the mouses start x position to the mouses end x position on each line from the mouses start y position to the end y position.

If the user cuts or copies while multiple items are selected, it will cut all items and when pasted, each cursor will paste the item that it cut or copied so long as their are the same number of cursors as when the text was cut/copied. If there is a different number of cursors, it will paste everything in the clipboard for each cursor.

Wouter01 commented 1 year ago

@austincondiff, can this be closed as it'll be added in the upcoming STTextView release?

austincondiff commented 1 year ago

@Wouter01 when the updated version is included in CodeEdit we can close this issue.

austincondiff commented 1 year ago

Closing as this is now possible with ⌃⇧. We will probably want a setting to change this shortcut though.

Jeehut commented 1 year ago

@austincondiff Thanks, sounds awesome! 🚀

But I would suggest changing the shortcut to match the Xcode shortcut which I mentioned in the initial post. That would make Xcode users feel right at home, which I think is a goal of this project.

And what about alt-clicking? Is that also possible? If not, could we create an extra feature request to track its progress?

austincondiff commented 1 year ago

@Jeehut I just opened https://github.com/CodeEditApp/CodeEdit/issues/1295 yesterday which may shed some light on that.