Files
IntelliJ-IdeaVim/src/main/resources/whatsnew-2.41.0.html

456 lines
12 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!--
~ Copyright 2003-2026 The IdeaVim authors
~
~ Use of this source code is governed by an MIT-style
~ license that can be found in the LICENSE.txt file or at
~ https://opensource.org/licenses/MIT.
-->
<!doctype html>
<html data-theme="__THEME__" lang="en">
<head>
<meta charset="UTF-8">
<meta content="width=device-width, initial-scale=1" name="viewport">
<title>What's New in IdeaVim __VERSION__</title>
<style>
/* Light theme (default). The IDE theme is injected as data-theme on <html>;
prefers-color-scheme is the fallback when the page is viewed standalone. */
:root {
--bg: #eceef1;
--term-bg: #ffffff;
--titlebar: #e3e6ea;
--border: #d7dbe0;
--fg: #1a1c1f;
--fg-dim: #5b6168;
--prompt: #067d17; /* green prompt */
--accent: #871094; /* magenta */
--link: #0033b3;
--key: #0d6efd;
--string: #067d17;
--comment: #8c8c8c;
--code-bg: #f4f5f7;
--code-border: #e3e6ea;
--dot1: #ff5f56;
--dot2: #ffbd2e;
--dot3: #27c93f;
--shadow: 0 10px 40px rgba(0, 0, 0, 0.12);
}
:root[data-theme="dark"] {
--bg: #131417;
--term-bg: #1e1f22;
--titlebar: #2b2d30;
--border: #393b40;
--fg: #dfe1e5;
--fg-dim: #9aa0a6;
--prompt: #57965c;
--accent: #c77dbb;
--link: #56a8f5;
--key: #2aacb8;
--string: #6aab73;
--comment: #7a7e85;
--code-bg: #16171a;
--code-border: #393b40;
--dot1: #ff5f56;
--dot2: #ffbd2e;
--dot3: #27c93f;
--shadow: 0 12px 48px rgba(0, 0, 0, 0.55);
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--bg: #131417;
--term-bg: #1e1f22;
--titlebar: #2b2d30;
--border: #393b40;
--fg: #dfe1e5;
--fg-dim: #9aa0a6;
--prompt: #57965c;
--accent: #c77dbb;
--link: #56a8f5;
--key: #2aacb8;
--string: #6aab73;
--comment: #7a7e85;
--code-bg: #16171a;
--code-border: #393b40;
--dot1: #ff5f56;
--dot2: #ffbd2e;
--dot3: #27c93f;
--shadow: 0 12px 48px rgba(0, 0, 0, 0.55);
}
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: var(--bg);
color: var(--fg);
font-family: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
font-size: 14.5px;
line-height: 1.7;
-webkit-font-smoothing: antialiased;
padding: 32px 16px 64px;
}
/* Terminal window -------------------------------------------------- */
.term {
max-width: 760px;
margin: 0 auto;
background: var(--term-bg);
border: 1px solid var(--border);
border-radius: 12px;
box-shadow: var(--shadow);
overflow: hidden;
}
.titlebar {
display: flex;
align-items: center;
gap: 8px;
padding: 11px 14px;
background: var(--titlebar);
border-bottom: 1px solid var(--border);
}
.dot {
width: 12px;
height: 12px;
border-radius: 50%;
}
.dot.r {
background: var(--dot1);
}
.dot.y {
background: var(--dot2);
}
.dot.g {
background: var(--dot3);
}
.titlebar .title {
flex: 1 1 auto;
text-align: center;
font-size: 12.5px;
color: var(--fg-dim);
margin-right: 44px; /* balance the dots */
}
.body {
padding: 26px 30px 30px;
}
/* The intro "command" --------------------------------------------- */
.runline {
margin: 0 0 6px;
}
.runline .p {
color: var(--prompt);
font-weight: 700;
}
.runline .cmd {
color: var(--fg);
}
.runline .flag {
color: var(--key);
}
.out {
color: var(--fg-dim);
margin: 0 0 28px;
}
.out .v {
color: var(--accent);
font-weight: 700;
}
/* Blog content ----------------------------------------------------- */
h2 {
font-size: 17px;
font-weight: 700;
margin: 0px 0 4px;
color: var(--fg);
letter-spacing: -0.01em;
}
h2::before {
content: "❯ ";
color: var(--prompt);
font-weight: 700;
}
.kicker {
font-size: 12px;
color: var(--accent);
text-transform: lowercase;
letter-spacing: 0.04em;
margin: 0 0 10px;
}
.kicker::before {
content: "# ";
color: var(--comment);
}
p {
margin: 0 0 14px;
}
p.note {
color: var(--fg-dim);
}
.section {
margin-bottom: 30px;
}
.section + .section {
border-top: 1px dashed var(--border);
padding-top: 4px;
}
/* Inline tokens ---------------------------------------------------- */
code, kbd {
font-family: inherit;
font-size: 13px;
background: var(--code-bg);
border: 1px solid var(--code-border);
border-radius: 5px;
padding: 1px 6px;
white-space: nowrap;
}
kbd {
color: var(--key);
}
code {
color: var(--accent);
}
/* Terminal output / code blocks ----------------------------------- */
pre {
background: var(--code-bg);
border: 1px solid var(--code-border);
border-radius: 8px;
padding: 14px 16px;
margin: 0 0 14px;
overflow-x: auto;
line-height: 1.7;
font-size: 13px;
}
pre .cm {
color: var(--comment);
}
pre .str {
color: var(--string);
}
pre .key {
color: var(--key);
}
pre .p {
color: var(--prompt);
}
/* "Also worth a look" grid ---------------------------------------- */
.grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
margin-top: 6px;
}
@media (max-width: 560px) {
.grid {
grid-template-columns: 1fr;
}
}
.mini {
border: 1px solid var(--border);
border-radius: 8px;
padding: 14px 16px;
}
.mini h3 {
margin: 0 0 6px;
font-size: 14px;
}
.mini h3::before {
content: "$ ";
color: var(--prompt);
}
.mini p {
margin: 0;
font-size: 13px;
color: var(--fg-dim);
}
/* Fixes list ------------------------------------------------------- */
ul {
margin: 4px 0 0;
padding: 0;
list-style: none;
}
li {
margin-bottom: 8px;
color: var(--fg-dim);
padding-left: 1.6em;
text-indent: -1.6em;
}
li::before {
content: "+ ";
color: var(--prompt);
font-weight: 700;
}
li strong {
color: var(--fg);
font-weight: 700;
}
/* Footer prompt ---------------------------------------------------- */
footer {
margin-top: 34px;
padding-top: 18px;
border-top: 1px solid var(--border);
color: var(--fg-dim);
font-size: 13px;
}
footer .p {
color: var(--prompt);
font-weight: 700;
}
footer a {
color: var(--link);
text-decoration: none;
}
footer a:hover {
text-decoration: underline;
}
.caret {
display: inline-block;
width: 0.6em;
height: 1.05em;
background: var(--fg);
vertical-align: text-bottom;
animation: blink 1.1s steps(1) infinite;
}
@keyframes blink {
50% {
background: transparent;
}
}
</style>
</head>
<body>
<div class="term">
<div class="titlebar">
<span class="dot r"></span><span class="dot y"></span><span class="dot g"></span>
<span class="title">ideavim — whats-new — 80×24</span>
</div>
<div class="body">
<p class="runline"><span class="p">~ $</span> <span class="cmd">ideavim</span>
</p>
<p class="out">Here's what landed in <span class="v">__VERSION__</span>.</p>
<!-- indentwise — the star -->
<div class="section">
<p class="kicker">new plugin · motions</p>
<h2>indentwise — move by indentation</h2>
<p>The bundled <strong>indentwise</strong> extension adds motions that navigate by indentation level
instead of by line — jump to the next line that's less indented, more indented, or sits at the same
depth, or hop straight to the edges of the block you're in.</p>
<pre><span class="str">Plug 'jeetsukumaran/vim-indentwise'</span>
<span class="key">[-</span> <span class="key">]-</span> <span class="cm">" previous / next line of LESSER indent</span>
<span class="key">[+</span> <span class="key">]+</span> <span class="cm">" previous / next line of GREATER indent</span>
<span class="key">[=</span> <span class="key">]=</span> <span class="cm">" previous / next line of EQUAL indent</span>
<span class="key">[%</span> <span class="key">]%</span> <span class="cm">" start / end of the current indent block</span></pre>
<p class="note">They work as operator motions too — try <kbd>d]=</kbd> to delete down to the next
line at the same indent.</p>
</div>
<!-- U command -->
<div class="section">
<p class="kicker">editing · undo</p>
<h2>Undo a whole line at once</h2>
<p>The classic <code>U</code> command is now implemented — it undoes every recent change you made to the
last-edited line in one stroke. Pressing <code>U</code> again redoes them, so it doubles as a quick
before/after toggle.</p>
<pre><span class="key">U</span> <span class="cm">" undo all latest changes on the most recently changed line</span>
<span class="key">U</span> <span class="cm">" press again to redo them</span></pre>
</div>
<!-- Also worth a look -->
<div class="section">
<p class="kicker">also worth a look</p>
<div class="grid">
<div class="mini">
<h3>Mouse, your way</h3>
<p>The new <code>'mouse'</code> option (default <code>nvi</code>) decides which modes a click moves
the caret in — a flag per mode (<code>n</code>/<code>v</code>/<code>i</code>/<code>c</code>),
<code>a</code> for all, and <code>r</code> to dismiss the more-prompt on click.</p>
</div>
<div class="mini">
<h3>NERDTree, out of the way</h3>
<p>Set <code>let g:NERDTreeQuitOnOpen = 1</code> and the project tree closes itself the moment you
open a file with <kbd>o</kbd>.</p>
</div>
</div>
</div>
<!-- Polish & fixes -->
<div class="section">
<p class="kicker">polish &amp; fixes</p>
<ul>
<li><strong>Undo replays inside macros</strong> — recording <kbd>dwu</kbd> (delete a word, then undo)
and replaying it with <kbd>@a</kbd> now works as recorded.
</li>
<li><strong>Autocmds run in the right mode</strong> — Normal-mode events like <code>BufWritePre</code> no
longer fire while you're still in Insert mode; IdeaVim returns to Normal first.
</li>
<li><strong>Empty <code>'guicursor'</code> behaves</strong> — an empty value now falls back to the
default IDE caret instead of breaking it.
</li>
</ul>
</div>
<footer>
<p><span class="p">~ $</span> # thanks for using IdeaVim — happy editing<span class="caret"></span></p>
<p>
<a href="https://github.com/JetBrains/ideavim/blob/master/CHANGES.md">full-changelog</a> ·
<a href="https://youtrack.jetbrains.com/issues/VIM">report-an-issue</a> ·
<a href="https://jb.gg/ideavim-eap">join-the-eap</a>
</p>
</footer>
</div>
</div>
</body>
</html>