Sysmagine / SemanticDiff

Community support for SemanticDiff, the programming language aware diff for Visual Studio Code and GitHub.
https://semanticdiff.com
45 stars 0 forks source link

Edit text in diff viewer #15

Open sanderkob opened 1 year ago

sanderkob commented 1 year ago

The Diff viewer works fine, but does not allow to edit text or move text segments from one file to the other in the diff viewer.

A behaviour such is in Meld (meldmerge.org) would be very helpfull.

mmueller2012 commented 1 year ago

Thanks for the feature suggestion.

I think a generic edit mode is probably out of scope for now. The VS Code API is tailored for some very specific use cases and is often limited in other areas. We ran into such limitations when we tried to add our own diff mode. We couldn't change the way the existing diff viewer worked and had to write one from scratch using the webview functionality. The same thing happened when we tried to add syntax highlighting to the displayed code. The VS Code API didn't provide a way to access the syntax highlighter and we had to reimplement it (albeit by reusing a lot of VS Code's code). I think reinventing the editor as well would probably take too much time away from improving the core functionality of SemanticDiff.

But that doesn't mean we can't add something more basic. To evaluate this, it would be good to understand your needs a little better:

  1. Would the ability to move changed blocks/lines between the two versions be enough?
  2. How should it behave when the surrounding code also contains style changes? Should it also copy the surrounding style or try to "merge" both versions?
sanderkob commented 1 year ago

The way I use SemanticDiff now is:

Since most changes are simply moves between the versions, that would be the most important feature. Bonus would be the ability to delete the block or insert it instead of move it, see Meld for the details. The detailed editing is something I would still do later in a proper editor. I am not certain what style changes are. But i do not think that is important for me.

mmueller2012 commented 1 year ago

By style changes, I mean a situation like this:

style changes

Line 3 in the old code corresponds to line 3-7 in the new code. The only change that is considered relevant by SemanticDiff is the addition of the new parameter in line 6, everything else is considered a style variation. I wonder how a copy button should behave in such a situation. I can think of two ways:

a) SemanticDiff would copy the whole block and thus replace line 3 (old) with the lines 3-7 (new): Result:

func test(
    param1 int,
    param2 float64,
    param3 byte,
) int {

b) SemanticDiff would try to copy the invidual change and merge it into the old style:

func test(param1 int, param2 float64, param3 byte) int {

Which solution (a, b, something else) would you prefer?

sanderkob commented 1 year ago

I am for solution a, personally I am in favour of implicit line continuation anyway. And solution a is in line with what SemanticDiff tries to offer: make code more readable when comparing.