diff --git a/manual/src/introduction.md b/manual/src/introduction.md index a865a7e4b..9003e4f25 100644 --- a/manual/src/introduction.md +++ b/manual/src/introduction.md @@ -1,41 +1,61 @@ # Introduction -Difftastic ([source on GitHub](https://github.com/wilfred/difftastic)) is a diff -tool that understands syntax. It supports the following languages: - -* Bash -* C -* C++ -* C# -* Clojure -* Common Lisp -* CSS -* Dart -* Elixir -* Emacs Lisp -* Gleam -* Go -* Haskell -* Janet -* Java -* JavaScript (and JSX) -* JSON -* Kotlin -* Lua -* Nix -* OCaml -* PHP -* Python -* Ruby -* Rust -* Scala -* TOML -* TypeScript (and TSX) -* YAML -* Zig - -When it works, it's *fantastic*. - -This manual tracks the bleeding edge version of difftastic. [The -changelog](https://github.com/Wilfred/difftastic/blob/master/CHANGELOG.md) +Difftastic is a diff tool that understands syntax. It supports [over +20 programming languages](./languages_supported.html) and when it works, it's *fantastic*. + +Difftastic is open source software (MIT license) and [available on +GitHub](https://github.com/wilfred/difftastic). + +This manual tracks the bleeding edge version of difftastic. The +[changelog](https://github.com/Wilfred/difftastic/blob/master/CHANGELOG.md) records which features and bug fixes are in each version. + +## Syntactic Diffing + +Difftastic [detects the language](./usage.html#language-detection), parses the code, and then +compares the syntax trees. Let's look at an example. + +``` +// old.rs +let ts_lang = guess(path, guess_src).map(tsp::from_language); +``` +``` +// new.rs +let ts_lang = language_override + .or_else(|| guess(path, guess_src)) + .map(tsp::from_language); +``` + +
$ difft old.rs new.rs
+1 1 let ts_lang = language_override
+. 2 .or_else(|| guess(path, guess_src))
+. 3 .map(tsp::from_language);
+
+
+
+Notice how difftastic recognises that `.map` is unchanged, even though
+it's now on a new line with whitespace.
+
+A line-oriented diff does a much worse job here.
+
+$ diff -u old.rs new.rs
+@@ -1 +1,3 @@
+-let ts_lang = guess(path, guess_src).map(tsp::from_language);
++let ts_lang = language_override
++ .or_else(|| guess(path, guess_src))
++ .map(tsp::from_language);
+
+
+
+Some textual diff tools also highlight word changes (e.g. GitHub or
+git's `--word-diff`). They still don't understand the code
+though. Difftastic will always find matched delimiters: you can see
+the closing `)` from `or_else` has been highlighted.
+
+## Fallback Textual Diffing
+
+If input files are not in a format that difftastic understands, it
+uses a conventional line-oriented text diff with word highlighting.
+
+Difftastic will also use textual diffing when given extremely large
+inputs.