Commit Graph
6293 Commits
Author SHA1 Message Date
Alex Plate 9247c3d5ee Fix(VIM-4295): a" should treat a tab as trailing white space
:help aquote - any trailing white space is included, unless there is none,
then leading white space is included. Vim's in_quote uses vim_iswhite, which
matches a space or a tab, but IdeaVim only looked for a space.

With a tab after the closing quote, `da"` found no trailing white space and
fell back to including the leading space, deleting the wrong text.

Char.isWhitespace() is deliberately not used, because it also matches a new
line, which would let the scan leave the line.
2026-08-05 16:28:34 +03:00
Alex Plate 174891852c Fix(VIM-4294): sentence motion should not stop on the phantom last line
For a file that ends with a new line, the IDE shows an extra empty last
line. Vim has no such line - the new line is just the last line's EOL.

findSentenceStart() treated that line as a paragraph boundary and returned
its offset, which is the size of the file, so `)` on the last sentence put
the caret on a position that does not exist in Vim, and `d)` deleted the
trailing new line along with the sentence.

Clamp the paragraph offset to the last character of the file. The clamp is
applied in findSentenceStart() rather than in findNextParagraph(), because
findSentenceEnd() relies on comparing its result against the file size when
the last sentence has no terminating punctuation.
2026-08-05 16:28:34 +03:00
Alex Plate 15c2f2ed86 Fix(VIM-4291): classify characters above Latin-1 by character class
'iskeyword' only applies to Latin-1 characters. Vim classifies everything
above with a fixed table of character classes and treats a character as a
word character when its class is greater than punctuation (vim_iswordc_buf
and utf_class_buf in mbyte.c).

IdeaVim treated every character above U+00FF as a keyword character, so word
motions never stopped at non-ASCII punctuation: `w` on "foo—bar" skipped the
whole run, and `2e` on "です。next" jumped past the ideographic full stop.

Port Vim's table of blank and punctuation intervals. 'isfname' keeps
treating every multibyte character as a filename character, which is what
vim_isfilec does.
2026-08-05 16:28:34 +03:00
Alex Plate 5febc337f9 Fix(VIM-4290): apply a pending operator when a word motion fails at the end of the file
Vim's forward word motions fail at the end of the file, but `nv_wordcmd`
only reports the failure when no operator is pending. With an operator, the
operator is applied from the caret to the end of the file, so `dw` on the
last character of the file deletes that character.

IdeaVim returned Motion.Error in both cases, and getMotionRange() aborted
the operator, so `dw`, `dW` and `de` on the last character of the file did
nothing at all.

Forward word motions now opt in to clamping the failed motion to the end of
the file, which getMotionRange() (only ever called with a pending operator)
applies. Plain `w` in normal mode still beeps, and the backward motions `b`,
`ge` and `gE` are unchanged - Vim beeps for those even with an operator.
2026-08-05 16:28:34 +03:00
Alex Plate 1dcd4394e7 Fix(VIM-4292): apply Vim's exclusive motion adjustment for an end in column 1
:help exclusive - when an exclusive motion ends in column 1, its end moves
to the end of the previous line and the motion becomes inclusive. Only the
second half of the rule (the motion becomes linewise when the start is at or
before the first non-blank) was implemented, in the delete and yank
operators.

Without the first half, d} from the middle of a paragraph deleted the new
line of the last line of the paragraph too, merging away the blank line that
separates the paragraphs, and y} yanked a trailing new line that Vim does
not yank.

The operators recognise the linewise half of the rule by the end of the
range being in column 1, so the end is only adjusted when the start is not
in the indent, which is exactly when Vim makes the motion inclusive instead
of linewise.

Backward motions are left alone. Vim opts the affected ones out explicitly,
e.g. <BS> and h wrapping to the previous line set CA_NO_ADJ_OP_END.
2026-08-05 16:28:33 +03:00
Alex Plate eed1805e57 Fix(VIM-4293): y} and d} at the first character of the file should be linewise
anyNonWhitespace() coerced the end of its backward scan to 0, so at offset 0
the range 0..0 inspected the character *under* the caret instead of being
empty. The caller then believed there was non-blank text before the range
start and skipped Vim's charwise-to-linewise promotion for exclusive
motions, but only at the very first character of the file.

Dropping the coercion leaves an empty 0..-1 range, matching what already
happens at every other line-start offset.
2026-08-05 16:28:33 +03:00
Alex Plate c9bc8b31dc Fix(VIM-4289): WORD motions should not split at script boundaries
A WORD is a sequence of non-blank characters, separated with white space
(:help WORD). Vim's cls() returns the same class for every non-blank
character when cls_bigword is set, so a change of Unicode script must not
end a WORD.

charType() consulted the Hiragana/Katakana/CJK Unicode blocks before the
punctuationAsLetters (bigWord) flag, so W, E, B and dW stopped at the
boundary between scripts: E on "abcあいう def" landed on 'c' instead of 'う'.

Short-circuit on punctuationAsLetters before the script checks. The script
classes still apply to small-word motions, which is where they belong.
2026-08-05 15:58:01 +03:00
1grzyb1 26ec5a57a0 VIM-301 disable yank ring 2026-08-05 12:36:37 +02:00
1grzyb1 78a44b5aee VIM-301 Configure max history 2026-08-05 12:36:37 +02:00
1grzyb1 a305e9cc09 VIM-301 Include all paste commands 2026-08-05 12:36:37 +02:00
1grzyb1 65db163134 VIM-301 Add YRReplace command 2026-08-05 12:36:37 +02:00
1grzyb1 f6143f8de5 VIM-301 Cycle through yanked values 2026-08-05 12:36:37 +02:00
1grzyb1 cdd7df317c VIM-301 parse printable characters in YRShow 2026-08-05 12:36:37 +02:00
1grzyb1 441e2211c4 VIM-301 Implement Yank Keyring history 2026-08-05 12:36:37 +02:00
1grzyb1 61e98f9381 Fix opening what's new in split mode
In split mode resources are loaded from backend
2026-08-04 10:12:42 +02:00
1grzyb1 044c155e3c VIM-4304 command mode sethandler 2026-08-03 13:57:59 +02:00
1grzyb1 16415b8b54 VIM-4302 initlize vim editor for run in python console
When running python script in python console name of console isn't "Python Console" so we need to check that by KEY.
2026-08-03 11:55:56 +02:00
IdeaVim Bot 7b6b04d25b Preparation to 2.45.2 release 2026-08-03 09:05:23 +00:00
IdeaVim Bot d0c5cecb1c Preparation to 2.45.1 release 2026-07-29 12:07:41 +00:00
1grzyb1 c15110ec25 Fix spellchecker for split mode 2026-07-29 13:40:36 +02:00
1grzyb1 f0f399b10f Unflaky caret visual helper test 2026-07-29 13:40:36 +02:00
1grzyb1 a4a88aa562 VIM-2879 clear highlights after restart 2026-07-29 09:22:32 +02:00
IdeaVim Bot 3740f57628 Preparation to 2.45.0 release 2026-07-28 10:34:05 +00:00
1grzyb1 9156d402b9 VIM-4301 fix native undo action
Do not normalize carets after native undo/redo. The platform undo (UndoRedo.execute) treats caret movement as a separate undo step by default
2026-07-28 10:01:21 +02:00
1grzyb1 a40024cf75 VIM-4287 Expand characterwise range to whole lines when promoted to linewise delete
this fixes issue with removing with dat
2026-07-28 09:01:13 +02:00
claude[bot]andClaude Opus 5 e5e948cd20 Prepare What's New for the upcoming release
Document the VIM-330 spelling dictionary commands in the changelog and
bring whatsnew-tbr.html up to date with the changelog entries that were
not yet represented on the page.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-27 12:32:08 +02:00
1grzyb1 74bb15cbad VIM-330 Add zw command to remove misspelled word from dictionary 2026-07-27 12:09:08 +02:00
1grzyb1 8015e72d70 VIM-330 Add z= command to offer suggested replacements 2026-07-27 12:09:08 +02:00
1grzyb1 4a94518074 VIM-330 Add zg command to mark word as correct 2026-07-27 12:09:08 +02:00
1grzyb1 10a7861558 VIM-330 Add tests for motion misspelled word 2026-07-27 12:09:08 +02:00
1grzyb1 465081377c Handle <C-O> single command deletion to end of line correctly 2026-07-24 12:12:40 +02:00
1grzyb1 902e7bb200 Disable last command test
It's flaky in ci
2026-07-24 12:04:49 +02:00
1grzyb1 52301def45 VIM-2649 Move carret on enter after C-G/C-t
during serach and moving through searches using C-G/C-T we didn't move caret to this search after enter
2026-07-23 12:02:10 +02:00
1grzyb1 c35eadbbb0 VIM-4284 Don't fail whole script on last line error
When last line had an error whole vim file was rejected
2026-07-23 10:55:54 +02:00
1grzyb1 2d5131a14c VIM-4284 Show errors from parsing vimscript 2026-07-23 10:55:54 +02:00
1grzyb1 94eab2c7d8 VIM-3936 In normal mode always execute command
When in normal mode it was wierd that enter has moved between lines instead of exeecuting it. To execute command in python console cursor must be at the end of line so we move it in normal mode
2026-07-23 09:07:21 +02:00
1grzyb1 566891ac54 VIM-3936 Keep mode when entering python console 2026-07-23 09:07:21 +02:00
1grzyb1 390bf15777 VIM-3936 pass some keys directly to console
Let python console handle up/down/enter keystrokes to handle them in default way
2026-07-23 09:07:21 +02:00
1grzyb1 360ad346e9 VIM-3936 pass enter to console action 2026-07-23 09:07:21 +02:00
1grzyb1 8f2742b48d VIM-3936 Enable vim in python console 2026-07-23 09:07:21 +02:00
claude[bot]andClaude Opus 4.8 829b8e1a10 Fix :last not switching to the last open file
SelectLastFileCommand passed 999 to selectFile(), but both implementations
only treat 99 as the "select last file" sentinel. As a result `:last` returned
an error and never switched buffers for any realistic number of open files —
a regression introduced when the original Java handler (which correctly passed
99) was rewritten in Kotlin.

Use the shared VimFile.LAST_FILE_SENTINEL constant so the command and the
implementations agree by construction, and add a behavior test that opens
several files and asserts `:last` selects the last one. The test fails against
the old 999 value and passes with the fix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-22 11:17:29 +02:00
claude[bot]andClaude Opus 4.8 0c29b00250 Introduce VimFile.LAST_FILE_SENTINEL for selectFile "last file" marker
The `selectFile(count)` API uses the magic number 99 as a sentinel meaning
"select the last open file". This value was duplicated as a bare literal in
both implementations (IjFileGroup and FileRemoteApiImpl), with nothing tying
it to the callers that must produce it. Name it once on the VimFile companion
and reference it from both implementations so the value can no longer drift.

No behavior change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-22 11:17:29 +02:00
claude[bot]andClaude Opus 4.8 7c608b0eb5 Add tests for yy count clamping in YankLineActionTest
There was no count-prefixed `yy` test in the normal-mode suite, leaving the
`count - 1` / `min(..., fileSize)` line-range logic in YankGroupBase.yankLine
uncovered. Add two tests:

- `2yy` yanks the expected multiple lines.
- `5yy` near end-of-file clamps to the last line instead of running past the
  end of the buffer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-22 11:15:49 +02:00
1grzyb1 ac6b6f127b VIM-4282 Don't scroll if caret below visible area
We scrolled up to show caret when it was under visible are which didn't make much sense
2026-07-22 10:34:09 +02:00
IdeaVim Bot 6fc20109e3 Preparation to 2.44.1 release 2026-07-22 08:29:34 +00:00
1grzyb1 4abc82ab26 VIM-4283 Fix dw in jupyter notebook cell
cells had guarded blocks which prevents from modifing document at such place and they are treated as collapsed regions.
So after adding expanding collapsed regions it was included in motion range and as it is guarded block we couldn't delete in such way
2026-07-22 09:45:21 +02:00
IdeaVim Bot a71d2c80f4 Preparation to 2.44.0 release 2026-07-21 11:02:45 +00:00
claude[bot]andClaude Opus 4.8 9b7fce67b6 Prepare What's New for the upcoming release
Update the changelog and the What's New page for the next release.

Changelog (CHANGES.md), added to [To Be Released]:
- Feature: VIM-1850 'keymap' option, 'iminsert', <C-^>, :loadkeymap and the
  :lmap/:lnoremap/:lunmap/:lmapclear language-mapping commands
- Fix: VIM-4281 output panel and command line now refresh colors on theme change
- Merged PRs: 1929, 1928, 1925

What's New (whatsnew-tbr.html), incremental update of the existing page:
- New section for the 'keymap' language-mappings feature
- Mini cards for gx and :w with a file argument
- Fixes list entries for theme refresh, :s///g on tab-indented lines, method
  navigation crash, and caret after delete-to-end from <C-O>

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 12:18:09 +02:00
1grzyb1 409b04c9a4 VIM-4281 update output panel theme on change
Listen for changes in theme and update output panel theme on that change
2026-07-21 11:28:44 +02:00
1grzyb1 d1d1f1907a VIM-4279 fix till V motion
Forced motion was handling V in ctV which broke this motion. to prevent that we check isAwaitingCharacterBasedArgument in ForcedMotionConsumer now
2026-07-21 09:47:19 +02:00