<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Tool on My Little Blog</title><link>https://www.parkerchenca.com/tags/tool/</link><description>Recent content in Tool on My Little Blog</description><generator>Hugo</generator><language>en-us</language><copyright>Parker Chen</copyright><lastBuildDate>Thu, 10 Sep 2026 11:25:00 +0000</lastBuildDate><atom:link href="https://www.parkerchenca.com/tags/tool/index.xml" rel="self" type="application/rss+xml"/><item><title>Vim in (not so) short</title><link>https://www.parkerchenca.com/tech/vim-in-not-so-short/</link><pubDate>Thu, 10 Sep 2026 11:25:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/vim-in-not-so-short/</guid><description>I want to make it short, but Vim is too powerful</description><content:encoded><![CDATA[<blockquote>
<p>🔔 <strong>Prelude:</strong>
Yes, You can always type :h to see help, for example, :h windows</p>
</blockquote>
<h2 id="vim-in-not-so-short"><strong>Vim in not so short</strong></h2>
<h3 id="preliminaries">Preliminaries</h3>
<ul>
<li>When vim is not available, you can temporarily use <code>cat</code> or <code>nano</code> as alternatives</li>
<li>When using a new IDE, you should first learn or configure:
<ul>
<li>save</li>
<li>copy / paste</li>
<li>duplicate line</li>
<li>delete word / delete line</li>
<li>line movement</li>
<li>navigate forward / back</li>
<li>undo / redo</li>
<li>page navigation (page down, page up, center to middle, etc.)</li>
<li>indent / unindent</li>
<li>multi-cursor</li>
<li>search / content search</li>
<li>input commands (<code>Ctrl + P</code> in VSCode, double <code>Shift</code> in IntelliJ, <code>:</code> in vim…)</li>
<li>completion, suggestion, parameter hint, hover hint</li>
<li>go to / peek definition, type, declaration, reference, implementation</li>
<li>rename symbol / refactor (if available)</li>
<li>AI controlling: toggle chat box, trigger inline chat…</li>
<li>tabs / windows management</li>
</ul>
</li>
<li>Use the <code>:help</code> command to query anything you don’t understand</li>
<li><code>:set option?</code> can view current settings</li>
</ul>
<hr>
<h3 id="windows-and-tabs">Windows and Tabs</h3>
<p><strong>Buffer:</strong> Can be understood as a temporary file. Even if this file is edited, it doesn’t mean it’s written to the actual file. We can <strong>observe</strong> buffers through windows and <strong>manage</strong> them through tabs.</p>
<ol>
<li>Use commands starting with <code>b</code> in Ex (command line) mode for buffer operations:
<ul>
<li><code>bd</code> buffer delete; <code>bwipeout</code> clears more thoroughly</li>
<li><code>bn</code> or <code>bnext</code> switch to next buffer</li>
<li><code>bp</code> or <code>bprevious</code> switch to previous buffer</li>
<li><code>ctrl + ^</code>  switch to the last buffer</li>
</ul>
</li>
</ol>
<p><code>Ctrl + W</code> window shortcuts and <code>:sp</code> split commands are the basics of window management. <code>:sp</code> can use parameters to specify files to split (open a new window for this file)</p>
<ol>
<li><code>Ctrl + W</code> + <code>w</code> cycle windows, <code>Ctrl + W</code> + <code>hjkl</code> switch focus left/down/up/right (move cursor)</li>
<li><code>Ctrl + W</code> + <code>=</code> (make window panes equal size)</li>
<li><code>Ctrl + W</code> + <code>+</code> <code>Ctrl + W</code> +  <code>Ctrl + W</code> + <code>&lt;</code> <code>Ctrl + W</code> + <code>&gt;</code> (fine-tune window size)</li>
<li><code>:vsp</code> performs vertical split, dividing into two sides</li>
<li><code>:resize 20</code> sets height to 20 lines; <code>:vertical resize 80</code> sets width to 80 columns</li>
</ol>
<p><code>:tabs</code> is the basic tab management command.</p>
<ol>
<li><code>:tabnew</code> opens a new tab, <code>:tabe</code> (edit) opens a tab for editing. Can be followed by filename.</li>
<li><code>:tabn</code> <code>:tabp</code> switch tabs, or use <code>gt</code> <code>gT</code> to switch</li>
<li>Display current buffer in new tab: <code>:tab split</code></li>
<li><code>:tabmove</code> move tab, for example <code>:tabmove 2</code></li>
<li><strong>Batch execution</strong>:
<ul>
<li><code>:tabdo {cmd}</code> execute on all tabs, e.g., <code>:tabdo set nocursorline</code></li>
<li><code>:windo {cmd}</code> execute on each window in current tab, e.g., <code>:windo diffthis</code></li>
</ul>
</li>
</ol>
<p><code>:only</code> and <code>:close</code> are universal management methods</p>
<ol>
<li>Type <code>:close</code> <code>:only</code> directly to manage windows</li>
<li>Type <code>:tabclose</code> <code>:tabonly</code> to manage tabs</li>
</ol>
<hr>
<h3 id="key-remapping">Key Remapping</h3>
<p>Here’s the key remapping configuration in VSCode vim extension:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="nt">&#34;vim.leader&#34;</span><span class="p">:</span> <span class="s2">&#34;&lt;space&gt;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="nt">&#34;vim.useSystemClipboard&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="c1">// important
</span></span></span><span class="line"><span class="cl"><span class="nt">&#34;vim.normalModeKeyBindings&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;before&#34;</span> <span class="p">:</span> <span class="p">[</span><span class="s2">&#34;J&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;after&#34;</span> <span class="p">:</span> <span class="p">[</span><span class="s2">&#34;5&#34;</span><span class="p">,</span> <span class="s2">&#34;j&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;before&#34;</span> <span class="p">:</span> <span class="p">[</span><span class="s2">&#34;K&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;after&#34;</span> <span class="p">:</span> <span class="p">[</span><span class="s2">&#34;5&#34;</span><span class="p">,</span> <span class="s2">&#34;k&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl"><span class="nt">&#34;vim.normalModeKeyBindingsNonRecursive&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;before&#34;</span> <span class="p">:</span> <span class="p">[</span><span class="s2">&#34;&lt;Backspace&gt;&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;after&#34;</span> <span class="p">:</span> <span class="p">[</span><span class="s2">&#34;x&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl"><span class="nt">&#34;vim.insertModeKeyBindingsNonRecursive&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl"><span class="nt">&#34;vim.visualModeKeyBindingsNonRecursive&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;before&#34;</span> <span class="p">:</span> <span class="p">[</span><span class="s2">&#34;&lt;Backspace&gt;&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;after&#34;</span> <span class="p">:</span> <span class="p">[</span><span class="s2">&#34;d&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Common key aliases:</p>
<ul>
<li><code>&lt;Backspace&gt;</code></li>
<li><code>&lt;C-c&gt;</code> -&gt; Ctrl + C</li>
<li><code>&lt;A-c&gt;</code> -&gt; Alt + C</li>
<li><code>&lt;Shift&gt;</code></li>
<li><code>&lt;CapsLock&gt;</code></li>
<li><code>&lt;Tab&gt;</code></li>
<li><code>&lt;Enter&gt;</code></li>
<li><code>&lt;Esc&gt;</code></li>
<li><code>&lt;Cmd-&gt;</code> Mac specific</li>
<li><code>&lt;Up&gt;</code></li>
<li><code>&lt;Down&gt;</code></li>
<li><code>&lt;Left&gt;</code></li>
<li><code>&lt;Right&gt;</code></li>
</ul>
<hr>
<h4 id="vim-configuration-file">vim Configuration File</h4>
<p>Use the <code>.vimrc</code> file in the <code>home</code> directory:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-mysql" data-lang="mysql"><span class="line"><span class="cl"><span class="s2">&#34; This is vimscript, so use let for assignment and &#34;</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">comments</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="n">nnoremap</span><span class="w"> </span><span class="o">&lt;</span><span class="n">SPACE</span><span class="o">&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">Nop</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="n">let</span><span class="w"> </span><span class="n">mapleader</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&#34; &#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kt">set</span><span class="w"> </span><span class="n">number</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34; Use system clipboard
</span></span></span><span class="line"><span class="cl"><span class="s2">set clipboard=unnamedplus
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34;</span><span class="w"> </span><span class="n">Map</span><span class="w"> </span><span class="o">`</span><span class="n">J</span><span class="o">`</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="o">`</span><span class="mi">5</span><span class="n">j</span><span class="o">`</span><span class="p">,</span><span class="w"> </span><span class="o">`</span><span class="n">K</span><span class="o">`</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="o">`</span><span class="mi">5</span><span class="n">k</span><span class="o">`</span><span class="p">,</span><span class="w"> </span><span class="o">`&lt;</span><span class="n">Backspace</span><span class="o">&gt;`</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="o">`</span><span class="n">x</span><span class="o">`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="n">nnoremap</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="mi">5</span><span class="n">j</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="n">nnoremap</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="mi">5</span><span class="n">k</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="n">nnoremap</span><span class="w"> </span><span class="o">&lt;</span><span class="n">Backspace</span><span class="o">&gt;</span><span class="w"> </span><span class="n">x</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34; inoremap
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34;</span><span class="w"> </span><span class="n">vnoremap</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34; nmap
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34;</span><span class="w"> </span><span class="n">imap</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34; vmap
</span></span></span><span class="line"><span class="cl"><span class="s2">nnoremap &lt;Enter&gt; o&lt;Esc&gt;
</span></span></span></code></pre></div><hr>
<h3 id="unbound-keys">Unbound Keys</h3>
<p>In VSCode and other IDEs, you can return Vim-controlled keys to the IDE, since they have no use in GUI interfaces.</p>
<ul>
<li><code>Ctrl + D</code> scroll down</li>
<li><code>Ctrl + Z</code> suspend Vim</li>
<li><code>Ctrl + X</code> decrease number at cursor by 1, in insert mode it’s completion, decrease by 1 is quite useful</li>
<li><code>Ctrl + C</code> can be considered</li>
<li><code>Ctrl + F</code> scroll forward, in insert mode used to view command history</li>
<li><code>Ctrl + W</code> window command, delete one word before cursor</li>
<li><code>Ctrl + P</code> completion</li>
<li><code>Ctrl + S</code> pause output</li>
<li><code>Ctrl + Q</code> same as <code>Ctrl + V</code>, only <code>q</code> alone is for recording macros, VSCode defaults to <em>Add cursor below</em>, multi-cursor editing tool</li>
<li><code>Ctrl + Y / E</code> scroll window up/down by 1 line</li>
<li><code>Ctrl + T</code> depends on situation</li>
</ul>
<hr>
<h3 id="quick-reference">Quick Reference</h3>
<p><strong>(jut for memory, may not be accurate)</strong></p>
<ol>
<li><code>w</code> -&gt; word</li>
<li><code>b</code> -&gt; back</li>
<li><code>e</code> -&gt; end</li>
<li><code>H</code> -&gt; page head; <code>L</code> -&gt; low; <code>M</code> -&gt; middle</li>
<li><code>zz</code> move current line to the middle position</li>
<li><code>Ctrl + U</code> &amp; <code>Ctrl + D</code> half screen move up &amp; down
<ul>
<li><code>Ctrl + F</code> &amp; <code>Ctrl + B</code> full screen move forward &amp; back</li>
</ul>
</li>
<li><code>g</code> -&gt; go (sometimes obviously more than that)
<ul>
<li><code>gn</code> <strong>go to next (matched)</strong>, <strong>commonly used</strong></li>
<li><code>gi</code> go to (last) insert</li>
<li><code>gd</code> go to definition</li>
<li><code>gf</code> go to file</li>
</ul>
</li>
<li><code>d</code> -&gt; delete (actually puts deleted content into register); sometimes means down
<ul>
<li><code>dd</code> delete one line</li>
</ul>
</li>
<li><code>x</code> -&gt; <code>dl</code>; <code>X</code> -&gt; <code>dh</code>
<ul>
<li><code>s</code> -&gt; (<code>x</code> + <code>i</code>)</li>
<li><code>c</code> -&gt; change (<code>d</code> + <code>i</code>)</li>
</ul>
</li>
<li><code>y</code> -&gt; yank</li>
<li><code>p</code> -&gt; do paste | as paragraph</li>
<li><code>{</code> <code>}</code> -&gt; paragraph</li>
<li><code>f</code> -&gt; find occurrence (<strong>char</strong>)
<ul>
<li><code>;</code> -&gt; next occurrence</li>
<li><code>,</code> -&gt; last occurrence</li>
<li><code>t</code> -&gt; till next occurrence</li>
<li><code>F</code> -&gt; backward to occurrence</li>
</ul>
</li>
<li><code>/</code> -&gt; search item with pattern
<ul>
<li><code>n</code> -&gt; next item</li>
<li><code>?</code> -&gt; back search</li>
</ul>
</li>
<li><code>u</code> -&gt; undo; <code>Ctrl + R</code> redo</li>
<li><code>123…</code> -&gt; as line number / do multiple times</li>
<li><code>i</code> -&gt; do insert | as inner (inside); <code>o</code> -&gt; open a line below; <code>a</code> -&gt; append | around</li>
<li><code>s</code> -&gt; as sentence | do substitute</li>
<li><code>q</code> -&gt; record macro</li>
<li><code>v</code> -&gt; visual</li>
<li><code>s</code> -&gt; surrounding. <code>cs{old}{new}</code>. plugin command
<ul>
<li><code>v</code> <code>S{desire pair}</code> -&gt; surrounding by.</li>
</ul>
</li>
<li><code>J</code> join</li>
<li><code>r</code> replace</li>
</ol>
<hr>
<h4 id="special-characters">Special Characters</h4>
<ol>
<li><code>@</code> -&gt; execute register content</li>
<li><code>.</code> <strong>&gt; as current line | do repeat last change</strong>, <strong>very commonly used</strong>, for repeating <strong>edit</strong> operations</li>
<li><code>%</code> -&gt; as all lines(all contents); in normal mode represents matching symbols like <code>{[(</code></li>
<li><code>0</code> -&gt; beginning of line
<ul>
<li><code>$</code> -&gt; end of line</li>
<li><code>^</code> first meaningful character</li>
<li><code>_</code> first meaningful character (can be operated by <code>g</code> etc.)</li>
<li><code>g_</code> last meaningful character</li>
</ul>
</li>
<li><code>;</code> <strong>repeat</strong> last <code>f, F, t, T</code> command. For example, if you used <code>f</code> to find a <strong>character</strong>, pressing <code>;</code> will continue to find the next matching character.
<ul>
<li><code>,</code> reverse repeat</li>
</ul>
</li>
<li><code>'</code> for mark navigation. For example, pressing <code>'a</code> jumps to the beginning of line of mark ‘a’.</li>
<li>``` (backtick) for mark navigation. For example, pressing ``a` jumps to the exact position of mark ‘a’.</li>
<li><code>~</code> change char case.</li>
<li><code>&amp;</code> repeat last substitution command</li>
</ol>
<hr>
<h4 id="modes">Modes</h4>
<ol>
<li>Normal mode: Enter normal mode when first starting, press <code>i</code> (insert) to enter insert mode, press <code>:</code> to enter command input mode</li>
<li>Insert mode: Edit file, press Esc to exit.</li>
<li>Command input mode: Input commands, press Esc to exit.</li>
<li>Press <code>v</code> to enter visual mode, generally used for selecting paragraphs</li>
</ol>
<h4 id="command-structure">Command Structure</h4>
<ol>
<li>Normal mode commands are almost based on the <code>verb</code> + <code>adj(count)</code> + <code>obj(motion, text-object)</code> pattern, e.g.: <code>d3j</code>, <code>ca(</code>
<ul>
<li>Omitting <code>verb</code> means <strong>cursor movement</strong>, which can actually be understood as a type of <code>verb</code>.
<ul>
<li>Example: <code>3j</code>, move down 3 lines</li>
<li>Example: <code>0</code>, <code>$</code>, these are special characters</li>
<li>Example: <code>v3w</code>, <code>v</code> only switches mode, doesn’t count as <code>verb</code>, but subsequent behavior without <code>verb</code> is treated as cursor movement</li>
</ul>
</li>
<li><strong>Special case</strong>: Omitting <code>adj.</code> means based on current position, or only operating on <strong>one object</strong>.
<ul>
<li>Example: <code>cw</code>, <code>f{</code></li>
</ul>
</li>
<li><strong>Special case</strong>: Omitting both <code>adj.</code> and <code>obj.</code> generally means some single character/line shortcuts
<ul>
<li>Example: <code>dd</code>, <code>yy</code>, <code>gg</code></li>
<li>Example: <code>s</code>, <code>x</code>, <code>~</code>, <code>u</code></li>
</ul>
</li>
</ul>
</li>
<li>Command line mode has almost no pattern. If anything, they can almost all be categorized as command-like modes.
<ul>
<li>verb + obj pattern: <code>:set number</code>, <code>:r file</code> (read file)</li>
<li>adj + verb pattern: <code>:3,5 d</code>
<ul>
<li>adj + verb + obj: <code>:3,5 d0</code></li>
</ul>
</li>
<li>obj pattern: <code>:map</code></li>
<li>verb pattern: <code>:w</code>, <code>:q</code></li>
<li>Special pattern (can be viewed as mode switching): <code>:!command</code> (execute external command)</li>
<li>Command-like pattern: <code>:s/foo/bar/gc</code></li>
</ul>
</li>
</ol>
<h4 id="repeat-operations">Repeat Operations</h4>
<ul>
<li><code>.</code> for <strong>modifications</strong>.</li>
<li><code>;</code> for f, etc.</li>
<li><code>r</code> means replace</li>
<li><code>f</code> <code>sth</code> -&gt; <code>r</code> -&gt; <code>;</code> -&gt; <code>.</code> -&gt; <code>;</code> -&gt; <code>.</code> -&gt; … : guess what will happen?</li>
<li><code>gn</code> for <code>/</code> etc. Need to operate on current search content once first, then use <code>.</code> to repeat.</li>
</ul>
<h4 id="tips">Tips</h4>
<ul>
<li><code>verb</code> is almost never absent, omitting <code>verb</code> generally means <strong>movement</strong> (<code>v</code> provides selection function, but still needs to <strong>move</strong> to <strong>some position</strong> to trigger)</li>
<li>At the same time, <code>obj</code> is also almost never absent, omitting <code>obj</code> generally means <strong>current position</strong></li>
</ul>
<p>When inputting commands, if you’re unclear what else to input, consider these questions:</p>
<ol>
<li>
<p>Does the command have an object? E.g., <code>w, p, s</code>.
(Specifically, line operations generally omit objects).
Selection in <code>v</code> mode actually provides objects. Similarly, <strong>movement actions actually also provide objects.</strong>
So, this part should be <strong>considered first, but input last</strong>.</p>
</li>
<li>
<p>Does the command have modifiers?
If there’s a <strong>clear area to operate on</strong>, you must pay attention to modifier input.
Because if not provided, it will <strong>immediately</strong> operate based on current position, very easy to cause misoperations.</p>
</li>
<li>
<p>What does the command need to do?
Please treat this as the last part to think about, to control vim behavior more precisely.
But when inputting commands, generally need to input first.
So, <strong>input this first.</strong></p>
</li>
</ol>
<p><strong>Seqs: 3 → 2 → 1</strong></p>
<hr>
<h3 id="commonly-used-commands">Commonly used Commands</h3>
<ul>
<li><code>:w</code> save</li>
<li><code>:q</code> quit</li>
<li><code>:q!</code> force quit without saving</li>
<li><code>:w filename</code> save file as filename</li>
<li><code>:w! filename</code> force save to filename</li>
<li><code>:set nu</code> <code>:set number</code> display line numbers, <strong>commonly used</strong></li>
<li><code>/word</code> search downward (note, no <code>:</code>, when pressing <code>/</code>, command line becomes <code>/</code> mode)
<ul>
<li>Press <code>n, N</code> to search next/previous</li>
<li><code>?word</code> search upward</li>
</ul>
</li>
<li><code>u</code> and <code>:u</code> undo</li>
<li><code>Ctrl + R</code> redo</li>
<li><code>x</code> = <code>dl</code>, <code>X</code> = <code>dh</code></li>
<li><code>s</code> = <code>ch</code></li>
</ul>
<h4 id="compound-commands">Compound Commands</h4>
<ul>
<li><code>:5 d</code> delete line 5, <strong>commonly used</strong></li>
<li><code>:3,5 d</code> delete <strong>lines 3 to 5</strong></li>
<li><code>:$ d</code> delete last line of document</li>
<li><code>:% d</code> delete all content in document</li>
<li><code>:n move m</code> move line n to after line m, <strong>commonly used</strong></li>
<li><code>:n,n+3 t m</code> copy <strong>lines n to n+3</strong> to <strong>after</strong> line m, <strong>commonly used</strong>
<ul>
<li>Summary: <code>:n,m</code> generally means from line n to line m</li>
</ul>
</li>
<li><code>:%s/hello/nihao/g</code> replace all hello with nihao, similar to <code>sed</code> operation
<ul>
<li><code>:s/hello/nihao/g</code> only replace in current line</li>
</ul>
</li>
<li><code>:5,8s/hello/nihao/g</code> replace hello with nihao in lines 5-8</li>
</ul>
<h3 id="common-shortcuts">Common Shortcuts</h3>
<h4 id="movement">Movement</h4>
<ol>
<li><code>Ctrl + O</code> previous position, <code>Ctrl + I</code> next position</li>
<li>If you have <code>Home</code> <code>End</code> <code>PageUp</code> and <code>PageDown</code> keys, you can use them directly, adding <code>Ctrl</code> is more convenient
<ol>
<li><code>PgUp</code> <code>PgDown</code> behavior varies, specifically use with <code>Ctrl</code> and <code>Shift</code></li>
</ol>
</li>
<li><code>Ctrl + U</code> and <code>Ctrl + D</code> half screen scroll; <code>Ctrl + F</code> and <code>Ctrl + B</code> full screen scroll</li>
<li><code>Ctrl + Up</code> to beginning of line, vice versa</li>
</ol>
<hr>
<h3 id="normal-mode">Normal Mode</h3>
<h4 id="cursor-movement"><strong>Cursor Movement</strong></h4>
<h4 id="character-based-movement">Character-based Movement</h4>
<ul>
<li><code>h</code> <code>l</code> move left/right, <code>k</code> <code>j</code> move up/down, arrow keys also work</li>
<li>Use <code>f</code> to find next <strong>character</strong>, uppercase for reverse search; using <code>t</code> stops before that character
<ul>
<li>Use <code>;</code> and <code>,</code> to repeat forward/backward search</li>
</ul>
</li>
<li><code>^</code> move to first non-whitespace position</li>
<li><code>g_</code> find first non-whitespace position from end of line</li>
<li>Use <code>$</code> to move to end of line</li>
<li>Use <code>%</code> to match brackets like <code>( { [</code></li>
</ul>
<h4 id="word-based-movement">Word-based Movement</h4>
<ul>
<li><code>w</code> move to next word, <strong>commonly used</strong>, remember as word</li>
<li><code>b</code> move to beginning of current/previous word, <strong>commonly used</strong>, remember as back</li>
<li><code>e</code> move to end of current/next word, <strong>commonly used</strong>, remember as end
<ul>
<li>Uppercase <code>W, B, E, gE</code> for including characters after words</li>
<li><code>ge</code> move to end of previous word</li>
<li><code>3w</code> can move 3 times</li>
</ul>
</li>
<li>Use <code>/</code> and <code>?</code> to search for <code>pattern</code>, use <code>n</code> and <code>N</code> to jump to next/previous</li>
</ul>
<h4 id="line-based-movement">Line-based Movement</h4>
<ul>
<li><code>g</code> is the most basic line movement command</li>
<li><code>0</code> move cursor to beginning of line, <code>$</code> move cursor to end of line</li>
<li><code>Home</code> key to beginning of line, <code>End</code> key to end of line</li>
<li><code>G</code> (Shift+G)/<code>gg</code> move cursor to end/beginning of file</li>
<li>Actually <code>G</code> is go, so you can input <code>500G</code> or <code>500gg</code> to locate to line <code>500</code>, <strong>commonly used</strong>
<ul>
<li>Or directly use <code>:line_number</code> to locate</li>
<li><code>gi</code> return to last insert location, <strong>commonly used</strong></li>
</ul>
</li>
</ul>
<h4 id="block-or-screen-based-movement">Block or Screen-based Movement</h4>
<ul>
<li><code>{</code> <code>}</code> move by paragraph</li>
<li><code>H</code> move to <strong>top line of screen</strong>; <code>L</code> move to <strong>bottom line of screen</strong>; <code>M</code> move to <strong>middle of screen</strong></li>
</ul>
<h4 id="mark-based-movement">Mark-based Movement</h4>
<ul>
<li><code>ma</code> set mark a</li>
<li><code>'a</code> jump to beginning of line of mark a</li>
<li>``a` jump to exact position of mark a</li>
<li><code>''</code> jump to beginning of line of previous position, <strong>commonly used</strong></li>
<li>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"></code></pre></div></li>
</ul>
<hr>
<h4 id="operation-commands">Operation Commands</h4>
<p>Follow <code>{operator}{count}{motion}</code> pattern, e.g.: <code>d2w</code></p>
<ul>
<li><code>c</code> change, <code>d</code> delete, <code>y</code> yank (copy), <code>p</code> paste
<ul>
<li>change means delete corresponding content and directly enter insert mode</li>
</ul>
</li>
<li><code>gu</code> <code>gU</code> or directly press <code>~</code> to change char’s case (<strong>commonly used</strong>)</li>
<li><code>=</code> format, for formatting, need to set code standards in advance, e.g.:</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">set autoindent        &#34; Inherit indentation from previous line
</span></span><span class="line"><span class="cl">set smartindent       &#34; Smart indentation based on syntax
</span></span><span class="line"><span class="cl">set cindent           &#34; C/C++ style indentation
</span></span><span class="line"><span class="cl">set shiftwidth=4      &#34; Move 4 spaces for each indentation operation
</span></span><span class="line"><span class="cl">set tabstop=4         &#34; Display one Tab as 4 spaces
</span></span><span class="line"><span class="cl">set expandtab         &#34; Use spaces instead of Tab
</span></span></code></pre></div><p>Common formatting commands:</p>
<ul>
<li>
<p><code>==</code>: Format current line.</p>
</li>
<li>
<p><code>=motion</code>: Format range specified by <code>motion</code>.</p>
</li>
<li>
<p><code>=ap</code>: Format current paragraph (<code>ap</code> means “a paragraph”).</p>
</li>
<li>
<p><code>=%</code>: Format content within brackets matching current cursor position.</p>
</li>
<li>
<p><code>gg=G</code>: Format entire file.</p>
</li>
<li>
<p>Use <code>&gt;&gt;</code> for indentation, use <code>&gt;</code> when target is provided</p>
</li>
</ul>
<h4 id="text-objects-delete-content-of-specific-patterns">Text Objects (delete content of specific patterns)</h4>
<p>Follow <code>{operator}{a/i}{text object}</code> pattern, e.g.: <code>di'</code> (delete inside ’)</p>
<ul>
<li>Generally used with <code>c</code>, <code>d</code></li>
<li>a -&gt; around, i -&gt; inside</li>
<li>text-object identifiers:
<ul>
<li><code>w</code> word</li>
<li><code>s</code> sentence</li>
<li><code>p</code> paragraph</li>
<li><code>'&quot;[{&lt;</code> ` corresponding to respective special blocks</li>
<li><code>t</code> tag, commonly used in html language, between <code>&gt;&lt;</code></li>
</ul>
</li>
</ul>
<h4 id="copy-and-delete">Copy and Delete</h4>
<ul>
<li><code>yy</code> copy current line, <strong>commonly used</strong></li>
<li><code>dd</code> cut current line, <strong>commonly used</strong></li>
<li><code>3dd</code> delete 3 lines, <strong>commonly used</strong></li>
<li><code>p</code>/<code>P</code> paste content after/before cursor, <strong>commonly used</strong></li>
<li><code>x</code> delete character at cursor, <code>X</code> delete previous character</li>
<li><code>r</code> modify character at cursor</li>
<li><code>R</code> enter replace mode</li>
</ul>
<h4 id="undo">Undo</h4>
<ul>
<li><code>u</code> undo, <strong>commonly used</strong></li>
<li><code>Ctrl + R</code> redo, <strong>commonly used</strong></li>
</ul>
<h4 id="enter-insert-mode">Enter Insert Mode</h4>
<ul>
<li><code>i</code> enter insert mode at current position</li>
<li><code>a</code> enter insert mode at next character</li>
<li><code>A</code> enter insert mode at end of line</li>
<li><strong><code>o</code> enter insert mode on next line</strong>, often used with <code>G</code> and <code>End</code>, <strong>commonly used</strong></li>
<li><code>s</code> delete current character and enter insert mode</li>
<li><code>S</code> delete current line and enter insert mode</li>
<li><code>cw</code> delete next word and enter insert mode</li>
<li><code>cb</code> delete previous word and enter insert mode</li>
</ul>
<hr>
<h3 id="insert-mode">Insert Mode</h3>
<p>Generally use shortcuts for operations</p>
<h4 id="cursor-movement-1">Cursor Movement</h4>
<ol>
<li><code>Ctrl + A</code> move cursor to beginning of line, uppercase moves to beginning of document</li>
<li><code>Ctrl + E</code> move cursor to end of line</li>
</ol>
<h4 id="text-operations">Text Operations</h4>
<ol>
<li><code>Ctrl + W</code>: Delete one word before cursor.</li>
<li><code>Ctrl + U</code>: Delete all content from current cursor position to beginning of line.</li>
<li><code>Ctrl + T</code> increase indentation to the right</li>
<li><code>Ctrl + D</code> decrease indentation to the left</li>
<li><code>Ctrl + R</code>: Insert register content. After pressing, need to input register identifier, e.g., <code>Ctrl + R, 0</code> inserts content of register 0.</li>
</ol>
<h4 id="completion-features">Completion Features</h4>
<ol>
<li><code>Ctrl + N</code>: Auto-complete next matching word. <strong>commonly used</strong></li>
<li><code>Ctrl + P</code>: Auto-complete previous matching word.</li>
<li><code>Ctrl + X</code>, <code>Ctrl + L</code>: Full line completion, shows dropdown menu</li>
<li><code>Ctrl + X</code>, <code>Ctrl + N/P</code>: Word completion based on current file.</li>
<li><code>Ctrl + X</code>, <code>Ctrl + F</code>: Filename completion.</li>
<li><code>Ctrl + X</code>, <code>Ctrl + K</code>: Dictionary lookup completion.</li>
</ol>
<h4 id="others">Others</h4>
<ol>
<li><code>Ctrl + C</code>: Exit input mode. Replace Esc, <strong>commonly used</strong></li>
<li><code>Ctrl + O</code>: Temporarily switch to normal mode to execute one command, then return to input mode. <strong>commonly used</strong></li>
<li>What if you press wrong key? In normal mode use <code>Ctrl + O</code> to return to previous position, meaning in input mode press <code>Ctrl + O</code> x2</li>
</ol>
<hr>
<h3 id="visual-mode">Visual Mode</h3>
<p>Follow <code>{trigger v}{motion}{operator}</code> pattern, e.g.: <code>v2wd</code> (select two words then delete)</p>
<ul>
<li>Press <code>v</code> for character selection, <code>V</code> for line selection, <code>Ctrl + V</code> for block selection</li>
<li>Generally only used for copy-paste, operation speed is slow</li>
</ul>
<hr>
<h3 id="-command-mode"><code>:</code> Command Mode</h3>
<h4 id="batch-processing-delete-move-copy-paste">Batch Processing (delete, move, copy, paste)</h4>
<ol>
<li><code>:2,5d a</code>: Delete <strong>lines 2 to 5</strong> and <strong>save in register a</strong></li>
<li><code>0</code> line 0; `# Vim in a Nutshell</li>
<li><code>:.,+3d</code> delete current lint &amp; plus 3 lines</li>
<li>In <code>visual</code> mode，<code>:'&lt;,'&gt;d</code> means “delete selected content”</li>
<li><code>@:</code> repeat last <code>:</code> command
<ul>
<li>After using <code>q</code> for macro recording we can use <code>@@</code> repeat it</li>
<li>After <code>@:</code> , <code>@@</code> is still available</li>
</ul>
</li>
<li><code>:'&lt;,'&gt;move .</code>
<ul>
<li><code>:m 10</code> move (current line) to 10 line after</li>
</ul>
</li>
<li><code>:/</code> looking for last found pattern</li>
</ol>
<hr>
<h4 id="quick-reference-1">Quick Reference</h4>
<h4 id="find-and-replace">Find and Replace</h4>
<ul>
<li><strong><code>:%s/old/new/g</code></strong>: In entire file range, replace all strings matching <code>old</code> with <code>new</code>. Add <code>c</code> to ask before each replacement.</li>
<li><strong><code>:s/old/new/g</code></strong>: Replace all <code>old</code> with <code>new</code> in current line.</li>
<li><strong><code>:g/pattern/d</code></strong>: Delete all lines matching <code>pattern</code>.</li>
<li><strong><code>:'&lt;,'&gt;s/old/new/g</code></strong>: In visual mode selected range, replace all <code>old</code> with <code>new</code>.</li>
<li><strong><code>:'&lt;,'&gt;normal command</code></strong>: Execute <code>normal</code> mode command on each line selected in visual mode.</li>
</ul>
<h4 id="line-operations">Line Operations</h4>
<ul>
<li><strong><code>:d</code></strong>: Delete current line (similar to <code>dd</code>).</li>
<li><strong><code>:t .+1</code></strong>: Copy current line and paste to next line.</li>
<li><strong><code>:m .+1</code></strong>: Move current line down one line.</li>
<li><strong><code>:m .-2</code></strong>: Move current line up two lines.</li>
<li><code>:-3,. m .+1</code>: Move 3 lines above current line to below current line</li>
<li><code>:-3,.y | :.+1put</code>: Copy above three lines, paste to next line. <code>put</code> creates new line, <code>p</code> pastes at cursor position</li>
</ul>
<h4 id="sed-like-command-usage">sed-like Command Usage</h4>
<ol>
<li>Replace all matching patterns at once: <code>:%s/pattern/replacement/gc</code> for entire file range (<code>%</code>), substitute (<code>s</code>) <code>pattern</code> with <code>replacement</code></li>
<li><code>gc</code> are <code>flags</code>, common <code>flags</code> include:
<ul>
<li><code>g</code>: Global replacement (apply command to all lines)</li>
<li><code>c</code>: Ask before each command execution.</li>
<li><code>i</code>: Ignore case</li>
<li><code>n</code>: Maximum number of replacements</li>
<li><code>p</code>: Print results</li>
<li><code>v</code>: Invert results</li>
<li><code>!</code>: Pass to external tool -&gt; <code>%!sort</code> will sort entire text</li>
</ul>
</li>
<li><strong>Explicitly</strong> use <strong>normal commands</strong> in <code>Ex</code> mode. Use <code>norm</code>
<ul>
<li>Very useful with v mode</li>
<li>Example: <code>:'&lt;,'&gt;norm A!</code>, will <strong>for content selected in v mode (‘&lt;,’&gt;)</strong>, uniformly <strong>add a “!” at the end of lines (A)</strong></li>
</ul>
</li>
</ol>
<p><code>%</code> itself is shorthand for **`1,# Vim in a Nutshell</p>
<hr>
<h3 id="tips-1">Tips</h3>
<ul>
<li>Accidentally pressed <code>Ctrl + S</code>? Use <code>Ctrl + Q</code> to release</li>
<li>It’s best not to use the right numeric keypad for editing, there might be key conflicts</li>
</ul>
<hr>
<h3 id="copy-paste-issues">Copy-Paste Issues</h3>
<p>Vim editor has its own clipboard system called registers. Vim uses registers to store text, which are different from X11 clipboards. If Vim is compiled with X11 clipboard support (through +clipboard option), then you can use special registers <code>&quot;*</code> and <code>&quot;+</code> to access X11’s PRIMARY and CLIPBOARD.</p>
<h4 id="paste-mode">Paste Mode</h4>
<p>To prevent auto-formatting from corrupting pasted content, Vim provides paste mode. Before pasting, execute <code>:set paste</code> command to enter paste mode, which will temporarily disable auto-indent, auto-wrap and other functions. After pasting, execute <code>:set nopaste</code> to return to normal mode.</p>
<p>You can also install some programs to access X11 clipboard, such as <strong>xclip</strong> or <strong>xsel</strong>.</p>
<p>Right mouse button enters visual mode?</p>
<ul>
<li><code>:set mouse-=a</code></li>
</ul>
<hr>
<h4 id="register-overview">Register Overview</h4>
<p>Vim uses a set of registers as its “clipboard”. These registers can be used to save text and paste later. Each register has an identifier, which can be a single letter or special character. Here are some basics about Vim registers:</p>
<p>Note, to use registers, first press <code>&quot;</code>, then <strong>switch</strong> to the desired register, then perform operations</p>
<p>To view register status, type <code>:reg</code> in command line mode</p>
<hr>
<h4 id="basic-registers">Basic Registers</h4>
<ul>
<li><code>&quot;&quot;</code> - Default register, if you don’t know where copied content went, look here</li>
<li><code>&quot;0</code> - Number 0 register. Stores content of your last yank (copy).</li>
<li><code>&quot;-</code> - Small delete register. Stores content of your last delete or change that’s less than one line.</li>
<li><code>&quot;1</code> to <code>&quot;9</code> - Number registers. Store your recent delete or change history (<code>&quot;1</code> is most recent, <code>&quot;9</code> is oldest).</li>
<li><code>&quot;a</code> to <code>&quot;z</code> or <code>&quot;A</code> to <code>&quot;Z</code> - Named registers. You can use lowercase letters to store text, uppercase letters to append text to corresponding lowercase register.</li>
</ul>
<hr>
<h4 id="special-registers">Special Registers</h4>
<ul>
<li><code>&quot;*</code> and <code>&quot;+</code> - Clipboard registers. In Vim with clipboard support (usually GUI version Vim or Vim with <code>+clipboard</code> feature), these two registers communicate with system clipboard:
<ul>
<li><code>&quot;*</code> register corresponds to X11’s <code>PRIMARY</code> clipboard (usually the select-to-copy one).</li>
<li><code>&quot;+</code> register corresponds to <code>CLIPBOARD</code> clipboard (usually used with <code>Ctrl+C</code>/<code>Ctrl+V</code> key combinations). <strong>Most commonly used.</strong></li>
</ul>
</li>
</ul>
<hr>
<h4 id="using-registers">Using Registers</h4>
<ul>
<li><strong>Copy to register</strong>: You can use <code>&quot;ay</code> to copy to register <code>a</code>, where <code>a</code> is the register name, <code>y</code> is the yank command.
<ul>
<li>Almost the same in visual mode</li>
</ul>
</li>
<li><strong>Paste from register</strong>: To paste from register, you can use <code>&quot;ap</code> to paste content of register <code>a</code>, where <code>a</code> is the register name, <code>p</code> is the paste command.</li>
<li><strong>In insert mode</strong>: Use <code>Ctrl + R</code> to call up <code>&quot;</code> symbol</li>
</ul>
<h4 id="using-registers-in-insert-mode">Using Registers in Insert Mode</h4>
<p>Press</p>
<p><code>Ctrl + R + register name</code></p>
<p>For example</p>
<p><code>Ctrl + R + &quot;</code> uses default register, <code>Ctrl + R + +</code> uses system register.</p>
<hr>
<h4 id="using-registers-in-terminal">Using Registers in Terminal</h4>
<p>When you use Vim in terminal instead of GUI version, accessing system clipboard becomes more complex, because Vim needs to include clipboard support at compile time. You can run <code>vim --version</code> to see if your Vim supports clipboard (look for <code>+clipboard</code> or <code>+xterm_clipboard</code>).</p>
<p>If your Vim supports clipboard, you can interact with system clipboard in the following ways:</p>
<ul>
<li>Use <code>&quot;*y</code> to copy to system’s PRIMARY clipboard.</li>
<li>Use <code>&quot;+y</code> to copy to system’s CLIPBOARD clipboard.</li>
<li>Use <code>&quot;*p</code> or <code>&quot;+p</code> to paste from corresponding system clipboard to Vim.</li>
</ul>
<p>If your Vim doesn’t have clipboard support, you won’t be able to directly access system clipboard from Vim. In this case, you need to use external programs (like <code>xclip</code> or <code>xsel</code>) to help you copy Vim register content to system clipboard, or paste from system clipboard to Vim.</p>
<hr>
<h3 id="external-commands">External Commands</h3>
<h4 id="using--to-execute-external-commands">Using <code>:!</code> to Execute External Commands</h4>
<p>You can use <code>:!</code> followed by command to execute any external command. For example, if you want to see current directory contents, you can type in Vim’s command mode:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">:!ls
</span></span></code></pre></div><h4 id="using-r-to-read-external-command-output">Using <code>:r</code> to Read External Command Output</h4>
<p>If you want to insert output of <code>sed</code>, <code>awk</code> or other commands into current Vim editor text, you can use <code>:r !</code> command. For example, if you want to insert <code>ls</code> command output at current position, you can type:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">:r !ls
</span></span></code></pre></div><h4 id="using--to-process-entire-file-content-through-external-command">Using <code>:%!</code> to Process Entire File Content Through External Command</h4>
<p>If you want to apply <code>sed</code> or <code>awk</code> command to entire file content and replace current file content, you can use <code>:%!</code> followed by corresponding command. For example, use <code>sed</code> command to replace all “foo” with “bar” in document:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">:%!sed <span class="s1">&#39;s/foo/bar/g&#39;</span>
</span></span></code></pre></div><h4 id="partial-usage">Partial Usage</h4>
<p>You can also specify a range to use external command only on certain parts of the file. For example, only process lines 5 to 10 through <code>awk</code> command:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">:5,10!awk <span class="s1">&#39;{print $1}&#39;</span>
</span></span></code></pre></div><hr>
<h3 id="macro-recording"><strong>Macro Recording</strong></h3>
<ol>
<li>Use <code>q</code> for macro recording in normal mode
<ul>
<li>Give register a name, say <code>a</code>, the full name of this register is <code>@a</code></li>
<li>Press <code>q</code> again to end recording after recording is complete</li>
<li>Type <code>@a</code> to execute macro, <code>@@</code> to execute last macro, <code>9@a</code> to execute macro 9 times</li>
</ul>
</li>
<li><strong>+1 operation</strong> on numbers. <code>&lt;C-a&gt;</code>, can be used with macro recording to write ordered lists:
<ul>
<li><code>1. sth</code>, then <code>yyp</code>, perform <code>&lt;C-a&gt;</code> on 1, repeat</li>
</ul>
</li>
</ol>
<hr>
<h3 id="other-features">Other Features</h3>
<ol>
<li><strong>Spell check</strong>. <code>:set spell! spelllang=en_us</code></li>
<li><code>:set rnu</code> set <strong>relative line numbers</strong>. Convenient for jumping</li>
</ol>
]]></content:encoded></item><item><title>Window Functions in SQL</title><link>https://www.parkerchenca.com/tech/window-functions-in-sql/</link><pubDate>Thu, 10 Sep 2026 11:13:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/window-functions-in-sql/</guid><description>Apply Aggregate Functions to Specific Data</description><content:encoded><![CDATA[<blockquote>
<p>🔔 <strong>Prelude:</strong></p>
<p>Boss: &ldquo;I need the average sales for 7 days.&rdquo;</p>
<p>Me: &ldquo;Sure! Which 7 days?&rdquo;</p>
<p>Boss: &ldquo;All the 7 days!&rdquo;</p>
<p>Me: &ldquo;Su…Sure…?&rdquo;</p>
</blockquote>
<h2 id="-window-functions">🖋️ Window Functions</h2>
<p>Window functions are generally applied after aggregate functions like <code>MAX()</code>, <code>MIN()</code>, <code>AVG()</code> to perform calculations <strong>across</strong> a set of table rows(days before, days after) that are related to the current row(current day).</p>
<h4 id="example-table-1-employees">Example Table 1: <code>employees</code></h4>
<table>
	<thead>
			<tr>
					<th>employee_id</th>
					<th>department_id</th>
					<th>salary</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>101</td>
					<td>5000</td>
			</tr>
			<tr>
					<td>2</td>
					<td>101</td>
					<td>6000</td>
			</tr>
			<tr>
					<td>3</td>
					<td>101</td>
					<td>5500</td>
			</tr>
			<tr>
					<td>4</td>
					<td>102</td>
					<td>7000</td>
			</tr>
			<tr>
					<td>5</td>
					<td>102</td>
					<td>7200</td>
			</tr>
			<tr>
					<td>6</td>
					<td>102</td>
					<td>6800</td>
			</tr>
	</tbody>
</table>
<h4 id="example-1-over-without-partitioning">Example 1: <code>OVER()</code> Without Partitioning</h4>
<p>Calculate the average salary for all employees:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employee_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">department_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">salary</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">AVG</span><span class="p">(</span><span class="n">salary</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="p">()</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">avg_salary_all_departments</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employees</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Result:</strong></p>
<table>
	<thead>
			<tr>
					<th>employee_id</th>
					<th>department_id</th>
					<th>salary</th>
					<th><strong>avg_salary_all_departments</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>101</td>
					<td>5000</td>
					<td>6250</td>
			</tr>
			<tr>
					<td>2</td>
					<td>101</td>
					<td>6000</td>
					<td>6250</td>
			</tr>
			<tr>
					<td>3</td>
					<td>101</td>
					<td>5500</td>
					<td>6250</td>
			</tr>
			<tr>
					<td>4</td>
					<td>102</td>
					<td>7000</td>
					<td>6250</td>
			</tr>
			<tr>
					<td>5</td>
					<td>102</td>
					<td>7200</td>
					<td>6250</td>
			</tr>
			<tr>
					<td>6</td>
					<td>102</td>
					<td>6800</td>
					<td>6250</td>
			</tr>
	</tbody>
</table>
<h4 id="example-2-partition-by">Example 2: <code>PARTITION BY</code></h4>
<p>Calculate the average salary <strong>per</strong> department:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employee_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">department_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">salary</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">AVG</span><span class="p">(</span><span class="n">salary</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="p">(</span><span class="n">PARTITION</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">department_id</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">avg_salary_per_department</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employees</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Result:</strong></p>
<table>
	<thead>
			<tr>
					<th>employee_id</th>
					<th>department_id</th>
					<th>salary</th>
					<th><strong>avg_salary_per_department</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>101</td>
					<td>5000</td>
					<td>5500</td>
			</tr>
			<tr>
					<td>2</td>
					<td>101</td>
					<td>6000</td>
					<td>5500</td>
			</tr>
			<tr>
					<td>3</td>
					<td>101</td>
					<td>5500</td>
					<td>5500</td>
			</tr>
			<tr>
					<td>4</td>
					<td>102</td>
					<td>7000</td>
					<td>7000</td>
			</tr>
			<tr>
					<td>5</td>
					<td>102</td>
					<td>7200</td>
					<td>7000</td>
			</tr>
			<tr>
					<td>6</td>
					<td>102</td>
					<td>6800</td>
					<td>7000</td>
			</tr>
	</tbody>
</table>
<h4 id="example-3-order-by-with-ranking">Example 3: <code>ORDER BY</code> with Ranking</h4>
<p>Rank employees <strong>by</strong> salary <strong>within</strong> their departments:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employee_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">department_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">salary</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">RANK</span><span class="p">()</span><span class="w"> </span><span class="n">OVER</span><span class="p">(</span><span class="n">PARTITION</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="o">**</span><span class="n">department_id</span><span class="o">**</span><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="o">**</span><span class="n">salary</span><span class="o">**</span><span class="w"> </span><span class="k">DESC</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="o">**</span><span class="n">salary_rank</span><span class="o">**</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employees</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Result:</strong></p>
<table>
	<thead>
			<tr>
					<th>employee_id</th>
					<th><strong>department_id</strong></th>
					<th><strong>salary</strong></th>
					<th><strong>salary_rank</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>2</td>
					<td>101</td>
					<td>6000</td>
					<td>1</td>
			</tr>
			<tr>
					<td>3</td>
					<td>101</td>
					<td>5500</td>
					<td>2</td>
			</tr>
			<tr>
					<td>1</td>
					<td>101</td>
					<td>5000</td>
					<td>3</td>
			</tr>
			<tr>
					<td>5</td>
					<td>102</td>
					<td>7200</td>
					<td>1</td>
			</tr>
			<tr>
					<td>4</td>
					<td>102</td>
					<td>7000</td>
					<td>2</td>
			</tr>
			<tr>
					<td>6</td>
					<td>102</td>
					<td>6800</td>
					<td>3</td>
			</tr>
	</tbody>
</table>
<hr>
<h4 id="example-table-2-orders">Example Table 2: <code>orders</code></h4>
<table>
	<thead>
			<tr>
					<th>order_id</th>
					<th>order_date</th>
					<th>order_total</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>2023-01-01</td>
					<td>100</td>
			</tr>
			<tr>
					<td>2</td>
					<td>2023-01-03</td>
					<td>200</td>
			</tr>
			<tr>
					<td>3</td>
					<td>2023-01-05</td>
					<td>150</td>
			</tr>
			<tr>
					<td>4</td>
					<td>2023-01-07</td>
					<td>250</td>
			</tr>
			<tr>
					<td>5</td>
					<td>2023-01-09</td>
					<td>300</td>
			</tr>
	</tbody>
</table>
<h4 id="example-4-range-with-date-intervals">Example 4: <code>RANGE</code> with Date Intervals</h4>
<p>Sum the total orders in the last 7 days for <strong>each row</strong>: (INTERVAL 6 because included CURRENT ROW)</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">order_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">order_date</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">order_total</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">SUM</span><span class="p">(</span><span class="n">order_total</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="p">(</span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">order_date</span><span class="w"> </span><span class="n">RANGE</span><span class="w"> </span><span class="k">BETWEEN</span><span class="w"> </span><span class="nb">INTERVAL</span><span class="w"> </span><span class="s1">&#39;6&#39;</span><span class="w"> </span><span class="k">DAY</span><span class="w"> </span><span class="n">PRECEDING</span><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="k">CURRENT</span><span class="w"> </span><span class="k">ROW</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">sum_last_7_days</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">orders</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Result:</strong></p>
<table>
	<thead>
			<tr>
					<th>order_id</th>
					<th>order_date</th>
					<th>order_total</th>
					<th>sum_last_7_days</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>2023-01-01</td>
					<td>100</td>
					<td>100</td>
			</tr>
			<tr>
					<td>2</td>
					<td>2023-01-03</td>
					<td>200</td>
					<td>300</td>
			</tr>
			<tr>
					<td>3</td>
					<td>2023-01-05</td>
					<td>150</td>
					<td>450</td>
			</tr>
			<tr>
					<td>4</td>
					<td>2023-01-07</td>
					<td>250</td>
					<td>700</td>
			</tr>
			<tr>
					<td>5</td>
					<td>2023-01-09</td>
					<td>300</td>
					<td>950</td>
			</tr>
	</tbody>
</table>
<h4 id="example-5-rows-between-preceding-and-following">Example 5: <code>ROWS</code> Between Preceding and Following</h4>
<p>Calculate the sum of order totals for the current row and the 2 preceding rows:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">order_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">order_date</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">order_total</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">SUM</span><span class="p">(</span><span class="n">order_total</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="p">(</span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">order_date</span><span class="w"> </span><span class="k">ROWS</span><span class="w"> </span><span class="k">BETWEEN</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="n">PRECEDING</span><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="k">CURRENT</span><span class="w"> </span><span class="k">ROW</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">sum_last_3_orders</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">orders</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Result:</strong></p>
<table>
	<thead>
			<tr>
					<th>order_id</th>
					<th>order_date</th>
					<th>order_total</th>
					<th>sum_last_3_orders</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>2023-01-01</td>
					<td>100</td>
					<td>100</td>
			</tr>
			<tr>
					<td>2</td>
					<td>2023-01-03</td>
					<td>200</td>
					<td>300</td>
			</tr>
			<tr>
					<td>3</td>
					<td>2023-01-05</td>
					<td>150</td>
					<td>450</td>
			</tr>
			<tr>
					<td>4</td>
					<td>2023-01-07</td>
					<td>250</td>
					<td>600</td>
			</tr>
			<tr>
					<td>5</td>
					<td>2023-01-09</td>
					<td>300</td>
					<td>700</td>
			</tr>
	</tbody>
</table>
<hr>
<h4 id="references-sheet">References sheet</h4>
<p>After max()…</p>
<ul>
<li><strong>OVER(…)</strong>: Applied <strong>over</strong> &hellip;</li>
<li><strong>PARTITION BY</strong>: Used to <strong>divide by</strong> &hellip;</li>
<li><strong>ORDER BY</strong> [DESC]</li>
<li><strong>ROWS</strong> <code>[BETWEEN...AND]</code>
<ol>
<li><code>n PRECEDING</code></li>
<li><code>n FOLLOWING</code></li>
<li><code>CURRENT ROW</code></li>
<li><code>UNBOUNDED PRECEDING</code> All before</li>
<li><code>UNBOUNDED FOLLOWING</code> All after</li>
</ol>
</li>
<li><strong>RANGE</strong> <code>[BETWEEN...AND]</code>
<ol>
<li><code>INTERVAL 'n' DAY</code></li>
</ol>
</li>
</ul>
]]></content:encoded></item><item><title>CO-STAR Template for ChatGPT</title><link>https://www.parkerchenca.com/tech/co-star-template-for-chatgpt/</link><pubDate>Thu, 10 Sep 2026 11:11:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/co-star-template-for-chatgpt/</guid><description>Getting ChatGPT to Do Exactly What You Need</description><content:encoded><![CDATA[<blockquote>
<p>🔔 <strong>Prelude:</strong>
If you use ChatGPT frequently, you&rsquo;ve probably encountered situations where it provides off-topic answers. Since we can&rsquo;t modify the model, the better approach is to rely on accurate prompts and additional context.</p>
</blockquote>
<h2 id="-main">🖋️ Main</h2>
<h4 id="let-chatgpt-answer-your-questions-accurately"><strong>Let ChatGPT Answer Your Questions Accurately!</strong></h4>
<p>First, you need to let ChatGPT know some personal information about you and how it should respond to you.</p>
<ol>
<li>Click on your profile picture at the top right corner.</li>
<li>Select &ldquo;Customize ChatGPT.&rdquo;</li>
<li>Hover over the &ldquo;Custom Instructions&rdquo; question mark on the right and fill in the information as guided.</li>
<li>Use the specific CO-STAR template in a new session.</li>
<li>Interact with ChatGPT.</li>
</ol>
<hr>
<h4 id="co-star-template">CO-STAR Template</h4>
<p>The CO-STAR template is a structured method that can help you communicate more clearly and effectively with ChatGPT. By providing context, objectives, style, tone, audience, and response format, you can explain exactly what you need from ChatGPT, and get replies that correspond more closely with your requirements.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># CO-STAR Template
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Template Example
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Context
</span></span><span class="line"><span class="cl"># I am a university student majoring in computer science, writing a paper on the application of machine learning in financial analysis.
</span></span><span class="line"><span class="cl"># Objective
</span></span><span class="line"><span class="cl"># Please help me write a section about the advantages and challenges of machine learning in stock market prediction.
</span></span><span class="line"><span class="cl"># Style
</span></span><span class="line"><span class="cl"># The style should be academic, using formal and technical language.
</span></span><span class="line"><span class="cl"># Tone
</span></span><span class="line"><span class="cl"># The tone should be serious and professional, avoiding humor or overly casual expressions.
</span></span><span class="line"><span class="cl"># Audience
</span></span><span class="line"><span class="cl"># The target audience is researchers and professionals in finance and computer science who are familiar with the relevant terminology and concepts.
</span></span><span class="line"><span class="cl"># Response
</span></span><span class="line"><span class="cl"># Please provide the content in paragraph form, including clear arguments and supporting evidence.
</span></span></code></pre></div><p>You can simply copy and paste this template to use it! Or, here is a more detailed explanation:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">## Context
</span></span><span class="line"><span class="cl"># Provide relevant background information to help the model understand the current situation.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Objective
</span></span><span class="line"><span class="cl"># Clearly state your goal or the task you want ChatGPT to help you with.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Style
</span></span><span class="line"><span class="cl"># Specify the desired writing style, such as formal, informal, technical, etc.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Tone
</span></span><span class="line"><span class="cl"># Define the desired tone, such as persuasive, humorous, serious, etc.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Audience
</span></span><span class="line"><span class="cl"># Define the target audience so the model can adjust the complexity and terminology of its output.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Response
</span></span><span class="line"><span class="cl"># Specify the desired response format, such as a list, paragraph, or a specific data format.
</span></span></code></pre></div>]]></content:encoded></item></channel></rss>