1
1
mirror of https://github.com/mawww/kakoune.git synced 2024-11-29 10:02:57 +03:00
Commit Graph

2718 Commits

Author SHA1 Message Date
Maxime Coste
53d9b9b676 Escaping tweak in git.kak 2024-02-06 20:50:14 +11:00
Johannes Altmanninger
c97add7f5a rc tools git: blame-jump to handle buffer modifications since blame
If I run

    git blame
    execute-keys 10o<esc>,j
    git blame-jump

that'll jump to the wrong commit.

Use a flag-lines option to tell if a line still has blame information
cached.

Closes #5084
2024-02-05 21:42:02 +11:00
Johannes Altmanninger
4e13fbef0a rc tools git: support blame in git-diff and git-log buffers
Today we can recursively search history with "git blame-jump". However
that command has some drawbacks, mainly that it's blocking. Making
it async without any progress indicator might be confusing. Better
to run plain "git blame"[1] and press Enter.

Also it might be nice to enable recursive searches using only "git
blame" and `<ret>` (since that is bound to "git blame-jump" while
blame annotations are displayed).

Make "git blame" in git-diff/git-log buffers run "git show
$commit:$file" for the commit and file at cursor, and decorate this
blob view with blame annotations. The latter allows to use `<ret>`
and repeat.

Unfortunately this relies on a hidden option "git_blob" to keep the
commit ID and filename. Maybe we can put this metadata somewhere
else like the buffer name or contents, ideally in a way that survives
serialization.

I'd still keep "git blame-jump" because it seems faster for the common
case of tracking down a single line.

[1]: In my testing, "git blame --incremental" is not any slower than
"git blame -L123,123" at finding that line.
2024-02-05 21:42:02 +11:00
Johannes Altmanninger
24bf123503 rc tools git: while blame annotations are shown, map <ret> to "git blame-jump"
Running git blame signals intent to view the blamed commit.  Let's make
`<ret>` to go to that commit+line as long as blame info is shown.

In diff buffers we already use `<ret>` for "diff-jump".

Like blame annotations, the blame-jump mapping lives in window scope.
This means it will not collide with "diff-jump" which is mapped in
buffer scope.

Add the mapping synchronously (unlike the rest of the git-blame code)
to perhaps allow the user to override the mapping:

    git blame; map window normal <ret> ...
2024-02-05 21:42:02 +11:00
Johannes Altmanninger
86d940c225 rc tools git: command for easy recursive blaming
Our ":git blame" annotates each line with the most recent commit.
However often a line has been modified by several commits.

Introduce ":git blame-jump" which shows the commit that added the
line at cursor. Crucially, it works also in Git diff buffers, so it
can be used recursively to find the full history of a line.

To do the recursive blame from a diff, I need to navigate to the
old (deleted) version of a line. Since old and new line are usually
neighbors. Speed up the common scenario of finding the old version
by making ":git blame-jump" jump to the new version. This means the
initial diff view might not include the commit message etc. Compensate
this by showing the commit's date+author+subject in the status line.

Here are some test cases.
- run blame-jump after "git blame"
- create an uncommitted or unsaved line, run "git blame" and
  "blame-jump" on the uncommitted line
- run blame-jump without running "git blame"
- run blame-jump in "git show"
- run blame-jump in "git diff HEAD"
- run blame-jump in "git diff --cached"
- run blame-jump in "git diff" (YMMV if there are cached changes,
  could fix that)

Naming: there are some similar commands in the wild [1];
they are usually called "show-blamed" or similar, but they
don't jump to the corresponding line.  Also our list of git
commands is getting a bit messy (especially the undocumented
show-diff/hide-diff/next-hunk/prev-hunk; subject first naming seems
better).

[1]: f6e78ec4c0/kakrc (L423)

Future work: to go back to the previously-blamed commit we need to
have had the foresight to use "rename-buffer". Perhaps we want to
add some kind of buffer stack (like Magit does for example).
2024-02-05 21:42:02 +11:00
Johannes Altmanninger
36efbf4cbf rc filetype diff: extract diff parsing from diff-jump
Most diff consumers we've written only care about the "final" state
after parsing through a diff. Let's extract the diff parsing part,
for reuse in several new commands.

In future we should try to use this (or better, a diff-parsing library)
for patch-range.pl. We'd add a callback argument that is invoked once
perl hunk (or line). Unfortunately I haven't found that library for
Perl yet.
2024-02-05 21:42:02 +11:00
Johannes Altmanninger
ce7ceb1cf0 rc tools git: detect filetype=git-diff for untracked diff buffers
On untracked diff buffers, it might be useful to make the upcoming
blame features work.

This is experimental, I might drop it.
2024-02-05 21:42:02 +11:00
Johannes Altmanninger
d6b75ac0bb rc tools git: change git diff filetype from diff to git-diff
Diff buffers created by ":git diff" differ from other filetype=diff
buffers in that they use "git rev-parse --show-toplevel" as root
directory for diff-jump. This makes sense because paths printed by
"git diff" are relative to that directory.

Today we handle the above difference by making ":git" override the
diff-jump mapping.  This doesn't work for buffers that were read from
a file.  Fix this by introducing a separate filetype, "git-diff",
which allows to move the mapping in the usual place.

This breaks existing filetype=diff hooks[1] which need to be adapted
to match git-diff (also git-log).

Another motivation for the separate filetype is that a following
patch wants to enable Git blame commands in git-diff buffers but
not in plain diff buffers -- those should keep being blamed like any
other file if tracked by Git.
Perhaps git-* buffers are for Git metadata, not files that are tracked
by Git.

The added hooks awkwardly include their hook parameter to work around
hook ordering issues when switching between filetypes. See also [2].

We could also use filetype=git-log instead of git-diff.
Our highlighting for "git log --graph" would have rare false positives.

Closes #5049

[1]: https://github.com/search?utf8=%E2%9C%93&q=filetype%3Ddiff+language%3Akakounescript+-repo%3Amawww%2Fkakoune+-is%3Afork&type=code
[2]: https://lists.sr.ht/~mawww/kakoune/%3C20240201091907.973508-1-aclopte@gmail.com%3E
2024-02-05 21:42:02 +11:00
Johannes Altmanninger
7a5bf7f649 rc tools git: remove unused dependency on diff from status/show-branch 2024-02-05 21:42:02 +11:00
Johannes Altmanninger
da1adc9b94 rc tools git: blame buffer contents, not on-disk file
When a buffer has unsaved deleted/added lines, then any blame
annotations below those lines may be off. Fix this by feeding the
latest buffer contents to Git.  Unfortunately there is no easy way
to distinguish between "Unsaved" and "Saved but not committed yet"
so let's keep using the umbrella term.
2024-02-05 21:42:02 +11:00
Johannes Altmanninger
c2c978907f rc tools patch: figure out path to patch-range.pl without double-parsing
We double-parse a command definition to figure out the location of
a support script at load time. This feels a bit dangerous and is not
really necessary, so use %val{runtime}/rc/tools/... instead.

Reference: https://lists.sr.ht/~mawww/kakoune/%3CZbOSCK2JjJvo-RTt@gmail.com%3E
2024-02-01 20:41:01 +11:00
Johannes Altmanninger
2c944f6415 rc patch.kak: fix quoting
I learned that

    $ foo="'1

    2'"
    $ echo $foo
    '1 2'

Quote some variables to avoid this double unescaping.
2024-01-26 10:05:55 +11:00
Johannes Altmanninger
11e7e2964c rc tools patch: skip patch message signature, fixing diff application
Patches as produced by "git format-patch" have a trailing signature
that is separated from the body by a line with "-- " on it.  By default
it contains the Git version.  We erroneously include this signature
in the diff we pipe to patch, which fails to apply as a result.

Add a targeted fix to suppress these signatures.
2024-01-26 09:55:52 +11:00
Johannes Altmanninger
c7eeb0ead5 rc tools git: suggest -3/--3way argument to git apply
Sometimes a patch that fails to apply will apply cleanly after
adding -3.  Also sometimes we do want to apply with conflict markers.
So this is another somewhat common option.
2024-01-26 09:52:01 +11:00
Johannes Altmanninger
6eb3d1baf5 rc tools git: fix regression hiding blame in large files
Sorry I did not test my earlier patch in production.  It passes
blame flags via the environment.  On a 5000 line file this results in
"execve failed: Argument list too long" errors.

Use a different way of checking whether blame info is shown.
2024-01-23 08:16:16 +11:00
Maxime Coste
1194aa861e Merge remote-tracking branch 'krobelus/patch-context-only-filediff' 2024-01-22 20:23:52 +11:00
Maxime Coste
a500d27ef1 Merge remote-tracking branch 'krobelus/git-blame-toggle' 2024-01-22 20:23:49 +11:00
Johannes Altmanninger
1276e67ef7 rc tools patch: skip spurious diff header for files with no changes
Since :patch transforms its inputs into context-only lines, we can
easily get into a state where a file diff has only context lines.
git apply does not accept a "diff" without any hunk, so let's skip
that.
2024-01-22 07:02:31 +01:00
Johannes Altmanninger
462bf9ff6a rc tools git: blame to hide blame if already shown
This simplifies the UI (no need to add multiple mappings) and might
obsolete hide-blame.
2024-01-21 13:01:28 +01:00
Johannes Altmanninger
6b03f4dc4f rc tools git: remove redundant try
These commands must never fail.
2024-01-21 13:01:28 +01:00
Maxime Coste
0674311945 Remove sorting of tags results
It is not an obviously better result than just displaying results
from each tag file, so remove sorting to take advantage of live
completion updates

As discussed in #5081
2024-01-17 21:18:22 +11:00
Maxime Coste
b0119b0696 Merge remote-tracking branch 'razetime/master' 2024-01-17 21:01:45 +11:00
Maxime Coste
11aede3493 Merge remote-tracking branch 'c7skasku/ocaml-comment-insert' 2024-01-17 21:01:04 +11:00
Maxime Coste
455cd73a93 Merge remote-tracking branch 'geppettodivacin/protobuf-newline-fix' 2024-01-17 21:00:26 +11:00
Maxime Coste
f9fe191437 Merge remote-tracking branch 'krobelus/show-completions-eagerly' 2024-01-17 20:57:17 +11:00
Maxime Coste
218f7ba0e0 Merge remote-tracking branch 'greenfork/update-pony' 2024-01-17 20:55:46 +11:00
Eric Dilmore
8ff2860851 Fix command name in protobuf newline hook 2024-01-16 14:58:31 -06:00
Cormac Stephenson
3beeda7bcc ocaml.kak: give a name to the hook which inserts comment characters
This lets set-option window disabled_hooks .*-insert work as expected.
2024-01-15 03:15:42 +00:00
Johannes Altmanninger
c9a544413c rc tools ctags/man: rationalize sorting of completion candidates
As of recently, shell script candidate completions are computed in
the background, and displayed incrementally.
Sorting completions means we can't show partial results.

We do this for "ctags-search"; but if there is only one ctags file
there is already a sensible order (which is slightly different than
what GNU sort does). So let's preserve the order in that case.
The number of completions is probably too high for an order to be useful.

Similarly, for "man", sorting is probably not very helpful because
there are so many results.

See https://github.com/mawww/kakoune/pull/5035#discussion_r1413015934
2024-01-13 17:24:03 +01:00
Dmitry Matveyev
2a5a1ab611 Update Pony language support
The last update is from 2017, it's pretty outdated. Current
support was combined from existing languages such as Ruby and
Zig and tweaked to fit the Pony language.
2024-01-11 23:46:14 +03:00
razetime
e9a71d22f3 add prolog highlighter 2024-01-11 10:47:41 +08:00
Johannes Altmanninger
ea930664ad rc tools git: fix off-by-one regression in git blame SHA column
Introduced in f27f6fa2d (rc git: fix "git blame" on macOS with perl
rewrite, 2023-11-12); awk uses 1-based indices but perl uses offsets.
2024-01-07 20:51:20 +01:00
Maxime Coste
9716875ba9 Merge remote-tracking branch 'arachsys/scheme-infnan' 2024-01-05 15:27:25 +11:00
Maxime Coste
12246674f1 Merge remote-tracking branch 'arachsys/groovy-quoting' 2024-01-05 15:26:44 +11:00
Maxime Coste
91d6ac013f Merge remote-tracking branch 'krobelus/fix-with-option' 2024-01-05 15:25:51 +11:00
Igor Ramazanov
1edebb8505
Update scala.kak to support SBT, ScalaCLI and Ammonite files
* https://www.scala-sbt.org/1.x/docs/Directories.html#sbt+build+definition+files
* https://scala-cli.virtuslab.org/docs/getting_started#scripting
* https://ammonite.io/#ScriptFiles
2023-12-30 19:29:32 +00:00
Johannes Altmanninger
1ce639f2f9 rc windowing: with-option to restore option value also after error
Today "with-option foo bar command-that-fails" fails with

	Error: 1:1: 'evaluate-commands': 1:1: 'with-option': 2:5: 'evaluate-commands': 4:9: 'evaluate-commands': 1:2: 'no-such-command': no such command

but leaks the option value. Fix this by resetting the option and
rethrowing the error.  Unfortunately the original stack trace is lost
(questionable behavior inherited from C++?).
2023-12-16 12:13:20 +01:00
Chris Webb
d9614c77e1 Fix quoting in rc/filetype/groovy.kak
Escape " with \ inside a double-quoted string to avoid a load error.
2023-12-13 17:22:54 +00:00
Chris Webb
51dab20aef Fix escaping in the scheme.kak highlighter awk script
The awk-generated highlighters in scheme.kak need '\\.' to obtain '\.'
in the generated kakscript output. Fix the inf/nan rule (which should
generate '(?:inf|nan)\.0') to read '(?:inf|nan)\\.0' in the awk.
2023-12-13 17:12:59 +00:00
Maxime Coste
83fb65aef5 Merge remote-tracking branch 'krobelus/generalize-windowing' 2023-12-12 21:29:31 +11:00
Maxime Coste
533f51c744 Merge remote-tracking branch 'krobelus/prefer-input-order-over-alphabet' 2023-12-12 21:27:31 +11:00
Maxime Coste
9cc9374375 Merge remote-tracking branch 'lobre/pl-not-executable' 2023-12-12 21:24:10 +11:00
Maxime Coste
250ead2b7a Merge remote-tracking branch 'arachsys/c-family-pp' 2023-12-12 21:21:40 +11:00
Chris Webb
86979841b7 Improve c-family highlighting of preprocessor directives
The current handling of preprocessor directives in filetype/c-family.kak
leads to a wall of solid colour for more complicated #if or #define
directives, although #include is already nicely highlighted.

Instead of highlighting an entire directive with the meta face, highlight
just the #define, #if or #elif keyword as meta, treating the rest of the
directive as normal c-family expressions. This significantly improves
the readability of complex macro definitions.

For directives other than #define, #if and #elif, we treat the rest of
the directive as an opaque string in normal face rather than trying to
highlight it, covering cases like #error, #pragma, etc. where the rest
of the line is an error message string or other non-expression content.

This does the right thing for #ifdef and #ifndef too, as we don't highlight
identifiers in c-family text so their arguments should be normal face
anyway.
2023-12-10 13:50:29 +00:00
Chris Webb
8a14fbc15b Highlight inline patches and signatures in mail.kak
We already pull in the diff module in mail.kak to enable the nice
:diff-jump behaviour on inline patches. Also enable the shared/diff/
highlighter underneath our shared/mail/ highlighter for inline diffs,
listing it first so mail patterns take precedence over diff patterns.

De-emphasise signatures including the standard '^-- \n' separator in the
same way as quoted text in a reply.

Fixes: https://github.com/mawww/kakoune/issues/4998
2023-12-10 11:42:32 +00:00
Loric Brevet
a362c8a145
Perl files are not always executable 2023-12-04 14:19:15 +01:00
Johannes Altmanninger
658c3385a9 ranked match: prefer input order over alphabetical order for user-specified completions
When using either of

	set-option g completers option=my_option
	prompt -shell-script-candidates ...

While the search text is empty, the completions will be sorted
alphabetically.
This is bad because it means the most important entries are not listed
first, making them harder to select or even spot.

Let's apply input order before resorting to sorting alphabetically.

In theory there is a more elegant solution: sort candidates (except
if they're user input) before passing them to RankedMatch, and then
always use stable sort. However that doesn't work because we use a
heap which doesn't support stable sort.

Closes #1709, #4813
2023-12-02 10:43:59 +01:00
Maxime Coste
84ecd41da1 Merge remote-tracking branch 'herrhotzenplotz/feat/hg-highlight-keywords' 2023-12-02 11:05:27 +11:00
Maxime Coste
c93c57a46f Merge remote-tracking branch 'krobelus/fuzzy-menu' 2023-12-02 10:56:29 +11:00
Maxime Coste
8e2eacae83 Merge remote-tracking branch 'krobelus/fix-git-blame' 2023-12-02 10:48:49 +11:00