<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Selvacanabady P</title>
    <description>The latest articles on DEV Community by Selvacanabady P (@canabady).</description>
    <link>https://dev.to/canabady</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3732137%2F3aba4aad-29d4-4c81-9e0b-412334872501.jpg</url>
      <title>DEV Community: Selvacanabady P</title>
      <link>https://dev.to/canabady</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/canabady"/>
    <language>en</language>
    <item>
      <title>⚡ AI Writes Code. Debian Asks: Who Takes the Blame?</title>
      <dc:creator>Selvacanabady P</dc:creator>
      <pubDate>Tue, 17 Mar 2026 04:30:14 +0000</pubDate>
      <link>https://dev.to/canabady/ai-writes-code-debian-asks-who-takes-the-blame-3ahg</link>
      <guid>https://dev.to/canabady/ai-writes-code-debian-asks-who-takes-the-blame-3ahg</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;You can ship code in seconds now.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;But can you stand behind it?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🚀 The Shortcut Era
&lt;/h2&gt;

&lt;p&gt;We’ve crossed a line.&lt;/p&gt;

&lt;p&gt;You don’t need to struggle through docs anymore.&lt;br&gt;&lt;br&gt;
You don’t need to debug for hours.&lt;/p&gt;

&lt;p&gt;You just… ask.&lt;/p&gt;

&lt;p&gt;And AI delivers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;functions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fixes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;full features&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fast. Clean. Convincing.&lt;/p&gt;

&lt;p&gt;But here’s the catch nobody likes to admit:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fast code is not the same as good code.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧠 Debian’s Simple Rule
&lt;/h2&gt;

&lt;p&gt;While everyone else rushes to adopt AI, Debian pauses and says:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;“If you submit it, you own it.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;“the AI wrote it”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“it looked correct”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“it worked on my machine”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it breaks, it’s yours.&lt;br&gt;&lt;br&gt;
If it’s illegal, it’s yours.&lt;br&gt;&lt;br&gt;
If it’s insecure, still yours.&lt;/p&gt;

&lt;p&gt;No outsourcing responsibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚖️ The Legal Mess (No One Has Solved)
&lt;/h2&gt;

&lt;p&gt;AI models are trained on… everything.&lt;/p&gt;

&lt;p&gt;Including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;licensed code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;copyrighted work&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unknown sources&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So when AI generates code:&lt;/p&gt;

&lt;p&gt;👉 Is it original?&lt;br&gt;&lt;br&gt;
👉 Is it copied?&lt;br&gt;&lt;br&gt;
👉 Is it safe to ship?&lt;/p&gt;

&lt;p&gt;Nobody can answer that with confidence.&lt;/p&gt;

&lt;p&gt;Debian ships software globally.&lt;br&gt;&lt;br&gt;
That uncertainty isn’t “interesting”—it’s dangerous.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 The Illusion of Quality
&lt;/h2&gt;

&lt;p&gt;AI code &lt;em&gt;looks&lt;/em&gt; good.&lt;/p&gt;

&lt;p&gt;That’s the problem.&lt;/p&gt;

&lt;p&gt;It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;compiles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;runs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;passes basic checks&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But underneath?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;edge cases missing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;logic misunderstood&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;long-term maintenance = nightmare&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And worst of all:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It gives developers false confidence.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧑‍💻 The Silent Skill Collapse
&lt;/h2&gt;

&lt;p&gt;AI creates a new kind of workflow:&lt;/p&gt;

&lt;p&gt;👉 prompt → paste → ship&lt;/p&gt;

&lt;p&gt;But where’s the learning?&lt;/p&gt;

&lt;p&gt;The gap is real:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Getting results ≠ understanding systems&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generating code ≠ engineering&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Debian sees the risk:&lt;/p&gt;

&lt;p&gt;If contributors stop learning,&lt;br&gt;&lt;br&gt;
the project slowly loses its backbone.&lt;/p&gt;

&lt;p&gt;Not today.&lt;br&gt;&lt;br&gt;
But over time.&lt;/p&gt;

&lt;p&gt;And that’s how strong systems decay.&lt;/p&gt;




&lt;h2&gt;
  
  
  ♿ The Truth: AI Also Helps
&lt;/h2&gt;

&lt;p&gt;Let’s not pretend it’s all bad.&lt;/p&gt;

&lt;p&gt;AI can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;reduce physical strain&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;help beginners start&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;speed up tedious work&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That matters.&lt;/p&gt;

&lt;p&gt;Debian isn’t rejecting AI.&lt;/p&gt;

&lt;p&gt;It’s rejecting blind trust in it.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 The Ethical Problem
&lt;/h2&gt;

&lt;p&gt;Here’s the uncomfortable layer:&lt;/p&gt;

&lt;p&gt;AI tools are built by scraping massive amounts of content.&lt;/p&gt;

&lt;p&gt;Often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;without consent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;without attribution&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;without clear licensing respect&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So using AI raises a quiet question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Are we building on something fundamentally unfair?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Debian doesn’t ignore that.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚨 The Flood Problem
&lt;/h2&gt;

&lt;p&gt;AI doesn’t just help developers.&lt;/p&gt;

&lt;p&gt;It multiplies them.&lt;/p&gt;

&lt;p&gt;Suddenly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;more patches&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;more noise&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;more low-quality contributions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And maintainers?&lt;/p&gt;

&lt;p&gt;Still human. Still limited.&lt;/p&gt;

&lt;p&gt;Too much volume = less real progress.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 Why Debian Didn’t Rush a Decision
&lt;/h2&gt;

&lt;p&gt;After all the debate, Debian chose:&lt;/p&gt;

&lt;p&gt;👉 no ban&lt;br&gt;&lt;br&gt;
👉 no approval&lt;br&gt;&lt;br&gt;
👉 no rushed policy&lt;/p&gt;

&lt;p&gt;Because the situation is still evolving.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;p&gt;👉 handle things case-by-case&lt;br&gt;&lt;br&gt;
👉 stick to core principles&lt;br&gt;&lt;br&gt;
👉 keep humans accountable&lt;/p&gt;

&lt;p&gt;It’s slower.&lt;/p&gt;

&lt;p&gt;But it’s safer.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 The Real Takeaway
&lt;/h2&gt;

&lt;p&gt;AI solved one problem:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;writing code is now easy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But it didn’t solve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;understanding&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ownership&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ethics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trust&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And those are the parts that actually matter.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✍️ Final Line
&lt;/h2&gt;

&lt;p&gt;You can generate code in seconds.&lt;/p&gt;

&lt;p&gt;But when it fails—and it will—&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;someone still has to answer for it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Debian just made sure that “someone” is still human.&lt;/p&gt;

&lt;p&gt;Note: This post was created based on the article &lt;a href="https://lwn.net/SubscriberLink/1061544/125f911834966dd0/" rel="noopener noreferrer"&gt;Debian decides not to decide on AI-generated contributions&lt;/a&gt; by &lt;strong&gt;Joe Brockmeier&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>debian</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Hidden Architecture of the AI Revolution</title>
      <dc:creator>Selvacanabady P</dc:creator>
      <pubDate>Tue, 10 Mar 2026 04:09:46 +0000</pubDate>
      <link>https://dev.to/canabady/the-hidden-architecture-of-the-ai-revolution-45nj</link>
      <guid>https://dev.to/canabady/the-hidden-architecture-of-the-ai-revolution-45nj</guid>
      <description>&lt;p&gt;Revolutions promise decentralization. In practice, they tend to reorganize power rather than eliminate it.&lt;/p&gt;

&lt;p&gt;This pattern appears repeatedly across history: an entrenched authority is challenged, a distributed movement emerges, internal competition reshapes the landscape, and eventually a new concentration of influence stabilizes the system. The political upheavals of the eighteenth century and the technological transformations of modern software follow strikingly similar trajectories.&lt;/p&gt;

&lt;p&gt;Understanding this pattern is useful today as the software industry enters another structural shift driven by artificial intelligence.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Classical Pattern of Revolution
&lt;/h2&gt;

&lt;p&gt;The French Revolution (1789–1799) illustrates the dynamic clearly.&lt;/p&gt;

&lt;p&gt;The revolution began with the dismantling of the monarchy represented by King Louis XVI. Political authority was supposed to shift from a hereditary crown to the people.&lt;/p&gt;

&lt;p&gt;Instead, a period of instability followed, including the Reign of Terror. Eventually a new centralized authority emerged when Napoleon Bonaparte consolidated power and established an empire.&lt;/p&gt;

&lt;p&gt;The revolution transformed the political system, but it did not eliminate hierarchy. It replaced one configuration of power with another.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Software Revolution
&lt;/h2&gt;

&lt;p&gt;A comparable structural shift occurred in computing during the late twentieth century.&lt;/p&gt;

&lt;p&gt;For decades the software industry was dominated by proprietary systems. Operating systems, development tools, and application platforms were controlled by corporations, most notably Microsoft.&lt;/p&gt;

&lt;p&gt;The emergence of the &lt;strong&gt;free software&lt;/strong&gt; and &lt;strong&gt;open-source&lt;/strong&gt; movements challenged this model. Instead of closed development, software could be built collaboratively and distributed with source code available for inspection and modification.&lt;/p&gt;

&lt;p&gt;Several key developments accelerated this transition:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The creation of the Linux kernel by Linus Torvalds
&lt;/li&gt;
&lt;li&gt;The philosophy of software freedom promoted by Richard Stallman
&lt;/li&gt;
&lt;li&gt;Large-scale community collaboration through distributed development workflows
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open development proved technically effective. Linux became the dominant server operating system, and open-source tooling spread across the entire software stack.&lt;/p&gt;

&lt;p&gt;The result was a significant reduction in the influence of any single proprietary platform.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Emergence of Platform Ecosystems
&lt;/h2&gt;

&lt;p&gt;However, decentralization did not eliminate large actors.&lt;/p&gt;

&lt;p&gt;Instead, open-source infrastructure became the foundation for new platform ecosystems built by companies such as Apple and Google.&lt;/p&gt;

&lt;p&gt;These companies integrated open technologies into vertically integrated platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apple’s operating systems rely heavily on Unix-derived infrastructure
&lt;/li&gt;
&lt;li&gt;Google’s services and Android ecosystem are built largely on Linux
&lt;/li&gt;
&lt;li&gt;Cloud platforms leverage open-source infrastructure while offering proprietary orchestration layers
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is a hybrid model: open foundations combined with centralized service platforms.&lt;/p&gt;

&lt;p&gt;Meanwhile, Microsoft itself adapted to this environment. The company now contributes heavily to open-source projects and operates one of the largest developer ecosystems in the world.&lt;/p&gt;

&lt;p&gt;The original “revolution” did not destroy the major players—it reshaped the competitive landscape.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Next Phase: Artificial Intelligence
&lt;/h2&gt;

&lt;p&gt;The industry is now entering another transformation driven by artificial intelligence.&lt;/p&gt;

&lt;p&gt;Modern AI systems rely heavily on the open infrastructure created during the software revolution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux-based compute clusters
&lt;/li&gt;
&lt;li&gt;Open-source machine learning frameworks
&lt;/li&gt;
&lt;li&gt;Distributed development tooling
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Companies such as Anthropic, OpenAI, Google, Microsoft, and Meta are building large-scale models capable of performing tasks traditionally associated with human expertise.&lt;/p&gt;

&lt;p&gt;From a technical perspective, these systems represent a new layer in the computing stack:&lt;/p&gt;

&lt;p&gt;→ Hardware infrastructure&lt;br&gt;
→ Operating systems&lt;br&gt;
→ Cloud platforms&lt;br&gt;
→ Machine learning frameworks&lt;br&gt;
→ Foundation models&lt;br&gt;
→ AI-driven applications&lt;/p&gt;

&lt;p&gt;The higher the layer, the greater the concentration of computational and financial resources required.&lt;/p&gt;

&lt;p&gt;Training state-of-the-art models demands massive datasets, specialized hardware, and large-scale distributed infrastructure. These requirements naturally concentrate development among organizations capable of operating global compute platforms.&lt;/p&gt;




&lt;h2&gt;
  
  
  A New Concentration of Power
&lt;/h2&gt;

&lt;p&gt;This creates a structural tension.&lt;/p&gt;

&lt;p&gt;The open-source movement democratized software development by lowering the barrier to entry. AI development, particularly at the frontier level, tends to &lt;strong&gt;increase&lt;/strong&gt; the barrier due to compute requirements.&lt;/p&gt;

&lt;p&gt;As a result, a new concentration of influence is forming around companies capable of deploying large-scale AI infrastructure.&lt;/p&gt;

&lt;p&gt;In other words, the system is repeating a familiar cycle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A dominant technological model emerges
&lt;/li&gt;
&lt;li&gt;A decentralized movement challenges it
&lt;/li&gt;
&lt;li&gt;The resulting infrastructure enables new capabilities
&lt;/li&gt;
&lt;li&gt;New platform leaders emerge around those capabilities
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The pattern is not accidental. Large-scale systems tend toward centralization because of economies of scale in infrastructure, data, and distribution.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Means for Developers
&lt;/h2&gt;

&lt;p&gt;For developers, the implications are significant.&lt;/p&gt;

&lt;p&gt;Open-source tools remain essential to innovation, but the strategic leverage in the industry is increasingly shifting toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compute infrastructure
&lt;/li&gt;
&lt;li&gt;Data pipelines
&lt;/li&gt;
&lt;li&gt;Model training capabilities
&lt;/li&gt;
&lt;li&gt;AI platform ecosystems
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers who previously focused primarily on application logic now operate within a layered ecosystem where AI services and APIs act as foundational components.&lt;/p&gt;

&lt;p&gt;Understanding these layers is becoming a core engineering skill.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Technological revolutions rarely eliminate power structures. Instead, they transform them.&lt;/p&gt;

&lt;p&gt;The open-source movement reshaped the software industry and dramatically expanded collaboration and innovation. Yet it also enabled the emergence of powerful platform ecosystems.&lt;/p&gt;

&lt;p&gt;Artificial intelligence represents the next stage in this evolution.&lt;/p&gt;

&lt;p&gt;The infrastructure built by open-source communities made AI possible at scale. Now AI platforms are becoming the new centers of gravity in the technology landscape.&lt;/p&gt;

&lt;p&gt;For developers, the challenge is not simply to use these systems, but to understand the architectural, economic, and governance structures forming around them.&lt;/p&gt;

&lt;p&gt;Because if history is any guide, the current revolution is not ending.&lt;/p&gt;

&lt;p&gt;It is just entering its next phase.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>history</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Writing Better Git Commit Messages: A Practical Guide</title>
      <dc:creator>Selvacanabady P</dc:creator>
      <pubDate>Wed, 04 Mar 2026 12:24:14 +0000</pubDate>
      <link>https://dev.to/canabady/writing-better-git-commit-messages-a-practical-guide-3f2j</link>
      <guid>https://dev.to/canabady/writing-better-git-commit-messages-a-practical-guide-3f2j</guid>
      <description>&lt;p&gt;Every developer writes commits.&lt;br&gt;
But not every developer writes &lt;strong&gt;useful commit messages&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A commit message is more than a label for a code change.&lt;br&gt;
It becomes part of your project’s permanent history, helping teammates—and your future self—understand why something changed.&lt;/p&gt;

&lt;p&gt;Many repositories unfortunately end up with commit histories like this:&lt;br&gt;
&lt;code&gt;fix&lt;br&gt;
update code&lt;br&gt;
changes&lt;br&gt;
final fix&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;These messages provide almost no context.&lt;/p&gt;

&lt;p&gt;Fortunately, a few simple conventions can make commit messages significantly clearer and more helpful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Commit Messages Matter
&lt;/h2&gt;

&lt;p&gt;When developers explore a repository, the commit history becomes the &lt;strong&gt;narrative of the project&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Good commit messages help with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding &lt;strong&gt;why a change was made&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Navigating the &lt;strong&gt;project history&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Reviewing pull requests efficiently&lt;/li&gt;
&lt;li&gt;Debugging issues later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code explains &lt;strong&gt;how something works&lt;/strong&gt;.&lt;br&gt;
A commit message explains &lt;strong&gt;why the change exists&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Without that context, even well-written code becomes harder to maintain.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Structure of a Good Commit Message
&lt;/h2&gt;

&lt;p&gt;A clean commit message usually contains two parts:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Short summary of the change (subject)&lt;/p&gt;

&lt;p&gt;Optional explanation describing why the change was made&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first line is the &lt;strong&gt;subject line&lt;/strong&gt;, which tools like &lt;code&gt;git log&lt;/code&gt; and GitHub display prominently.&lt;/p&gt;

&lt;p&gt;The body is optional but useful when additional explanation is needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Seven Simple Rules for Better Commit Messages
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Separate the subject from the body with a blank line
&lt;/h3&gt;

&lt;p&gt;This helps Git tools correctly interpret the commit structure.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add authentication middleware&lt;/p&gt;

&lt;p&gt;Introduce middleware that validates API tokens before&lt;br&gt;
requests reach protected endpoints.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2. Keep the subject line concise (around 50 characters)
&lt;/h3&gt;

&lt;p&gt;Short summaries make commit history easier to scan.&lt;/p&gt;

&lt;p&gt;Instead of writing a long sentence, aim for a clear and compact description.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Capitalize the subject line
&lt;/h3&gt;

&lt;p&gt;Treat the subject line like a title.&lt;/p&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Add support for OAuth authentication&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;add support for oauth authentication&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Avoid ending the subject with a period
&lt;/h3&gt;

&lt;p&gt;Commit titles behave more like headings than sentences.&lt;/p&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Fix memory leak in cache manager&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Fix memory leak in cache manager.&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Use the imperative mood
&lt;/h3&gt;

&lt;p&gt;Write commit messages as instructions or commands.&lt;/p&gt;

&lt;p&gt;Good examples:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Add user authentication&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Fix API timeout issue&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Remove unused dependencies&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Avoid:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Added user authentication&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Fixes API timeout issue&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This style aligns naturally with Git commands such as &lt;strong&gt;merge&lt;/strong&gt; or &lt;strong&gt;revert&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Wrap the body at around 72 characters
&lt;/h3&gt;

&lt;p&gt;Limiting line length keeps messages readable in terminals and Git tools.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add request logging middleware&lt;/p&gt;

&lt;p&gt;This middleware records incoming HTTP requests and response&lt;br&gt;
times to help diagnose performance issues in production.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  7. Explain what and why, not how
&lt;/h3&gt;

&lt;p&gt;The code already shows &lt;strong&gt;how&lt;/strong&gt; the implementation works.&lt;/p&gt;

&lt;p&gt;The commit message should explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What problem is being solved&lt;/li&gt;
&lt;li&gt;Why the change was necessary&lt;/li&gt;
&lt;li&gt;Any context future developers should know&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This extra context becomes extremely valuable months or years later.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Real Example
&lt;/h2&gt;

&lt;p&gt;Bad commit message:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fix bug&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Better commit message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fix null pointer crash in user profile service&lt;/p&gt;

&lt;p&gt;The crash occurred when a profile was requested for users&lt;br&gt;
without an address record. Added a null check and fallback&lt;br&gt;
handling to prevent the service from terminating.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second message gives developers useful context about the change.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Commit Template
&lt;/h2&gt;

&lt;p&gt;Many teams use a commit template to maintain consistency.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Short summary (max ~50 characters)&lt;/p&gt;

&lt;p&gt;Explain why this change is needed.&lt;br&gt;
Describe the problem being solved.&lt;br&gt;
Mention any relevant context.&lt;/p&gt;

&lt;p&gt;Optional: reference issue numbers&lt;br&gt;
Fixes #123&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Writing good commit messages is a small habit with a big impact.&lt;/p&gt;

&lt;p&gt;Clear commit history makes projects easier to understand, easier to maintain, and easier for others to contribute to.&lt;/p&gt;

&lt;p&gt;If you focus on &lt;strong&gt;clear summaries, structured messages, and explaining why changes happen&lt;/strong&gt;, your repository history will become far more useful.&lt;/p&gt;

&lt;p&gt;And one day, when you're debugging a tricky issue months later, you'll be glad you did.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href="https://chris.beams.io/git-commit" rel="noopener noreferrer"&gt;How to Write a Git Commit Message&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Digital Freedom and the Architecture of Social Media</title>
      <dc:creator>Selvacanabady P</dc:creator>
      <pubDate>Tue, 24 Feb 2026 06:17:41 +0000</pubDate>
      <link>https://dev.to/canabady/digital-freedom-and-the-architecture-of-social-media-2pdj</link>
      <guid>https://dev.to/canabady/digital-freedom-and-the-architecture-of-social-media-2pdj</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Social media platforms now function as core infrastructure for communication, creative work, and online communities. Despite this role, most of these systems are built as centralized, proprietary services governed by private interests rather than public standards. That design choice has long-term consequences for reliability, user autonomy, and the durability of online communities.&lt;/p&gt;

&lt;p&gt;This article examines why centralized social media architectures create systemic risk, and how federated, protocol-based alternatives—such as Loops—approach the problem differently.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters to Developers
&lt;/h2&gt;

&lt;p&gt;Although social media is often discussed in cultural or economic terms, its most significant characteristics are architectural. Decisions about centralization, identity, and data ownership shape how systems behave under stress, how users migrate between services, and how communities persist over time.&lt;/p&gt;

&lt;p&gt;For developers building platforms or tooling around user-generated content, these choices determine whether a system is resilient—or brittle.&lt;/p&gt;




&lt;h2&gt;
  
  
  Centralization as a Structural Constraint
&lt;/h2&gt;

&lt;p&gt;Centralized social platforms concentrate control over identity, content distribution, and moderation within a single organization. This model simplifies deployment and monetization, but it also introduces failure modes that scale with adoption.&lt;/p&gt;

&lt;p&gt;Three constraints consistently emerge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Audience Dependency
&lt;/h3&gt;

&lt;p&gt;Creators often build audiences within closed ecosystems where follower relationships cannot be meaningfully exported. When access to the platform is restricted or policies change, those relationships may disappear with no recovery path.&lt;/p&gt;

&lt;p&gt;This dependency places creators in a structurally weaker position than the platforms they rely on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data as a Revenue Surface
&lt;/h3&gt;

&lt;p&gt;Most centralized platforms are designed around behavioral data extraction. Recommendation systems are tuned to maximize engagement metrics that align with advertising goals, not necessarily with user intent or long-term community health.&lt;/p&gt;

&lt;p&gt;This incentive structure is architectural, not incidental.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fragmented Identity
&lt;/h3&gt;

&lt;p&gt;Identity and social graphs are tightly bound to individual platforms. Moving to a new service typically means abandoning accumulated reputation and connections, reinforcing lock-in and discouraging experimentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Platform Disruption as a Case Study
&lt;/h2&gt;

&lt;p&gt;Recent regulatory and geopolitical events have highlighted how fragile centralized platforms can be at scale. When access to a widely used service is threatened or restricted, users are forced to confront how little control they have over their digital presence.&lt;/p&gt;

&lt;p&gt;Attempts to migrate communities often reveal the same limitation: alternative platforms may differ in branding, but they replicate the same centralized assumptions.&lt;/p&gt;

&lt;p&gt;The underlying issue is not any single application. It is the absence of interoperable social infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Federation as an Alternative Model
&lt;/h2&gt;

&lt;p&gt;Federated systems take a different approach. Instead of a single platform controlling the entire network, independent servers interoperate through shared protocols.&lt;/p&gt;

&lt;p&gt;Loops is built on this model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Distributed Operation
&lt;/h3&gt;

&lt;p&gt;In a federated network, no single operator controls availability for all users. Individual servers can enforce local policies while remaining connected to the broader ecosystem.&lt;/p&gt;

&lt;p&gt;This removes a single point of technical and organizational failure.&lt;/p&gt;

&lt;h3&gt;
  
  
  User-Controlled Data
&lt;/h3&gt;

&lt;p&gt;Federation enables users to retain ownership of their content and identity. Data can be moved between servers or hosted independently, reducing dependency on any single service provider.&lt;/p&gt;

&lt;p&gt;Portability is a property of the system itself, not a discretionary feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Implementation
&lt;/h3&gt;

&lt;p&gt;Because the software is open source, its behavior can be audited and improved publicly. System design decisions are visible rather than hidden behind proprietary abstractions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Protocol-Level Interoperability
&lt;/h3&gt;

&lt;p&gt;By using ActivityPub, federated platforms can exchange content and interactions across services. Users are not required to rebuild audiences or maintain separate identities for each application they use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Governance
&lt;/h3&gt;

&lt;p&gt;Moderation and governance decisions are handled at the server level. Users can choose environments that reflect their expectations or operate their own infrastructure if needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Broader Implications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Creators
&lt;/h3&gt;

&lt;p&gt;Federated platforms reduce dependency on opaque ranking systems and policy volatility. Creators maintain direct relationships with their audiences rather than relying on platform-mediated reach.&lt;/p&gt;

&lt;h3&gt;
  
  
  For Users
&lt;/h3&gt;

&lt;p&gt;Users gain control over where their data lives and how it is used. Participation becomes a matter of choice rather than coercion through engagement-driven design.&lt;/p&gt;

&lt;h3&gt;
  
  
  For the Web
&lt;/h3&gt;

&lt;p&gt;The early web succeeded because it relied on open protocols rather than centralized ownership. Email, the web, and DNS continue to function because no single organization controls them.&lt;/p&gt;

&lt;p&gt;Federation applies the same principle to social media.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Centralized social media platforms offer convenience, but they do so by concentrating control over identity, data, and distribution. This concentration introduces risks that become more severe as platforms grow.&lt;/p&gt;

&lt;p&gt;Federated systems represent a different architectural path—one that prioritizes interoperability, resilience, and user agency. &lt;a href="https://github.com/joinloops/loops-server" rel="noopener noreferrer"&gt;Loops&lt;/a&gt; is one implementation of that approach.&lt;/p&gt;

&lt;p&gt;If social media is to function as long-term infrastructure, its foundations must be designed accordingly.&lt;/p&gt;

</description>
      <category>socialmedia</category>
      <category>fediverse</category>
      <category>opensource</category>
      <category>digitalfreedom</category>
    </item>
    <item>
      <title>Bash History Expansion Trick: diff Promote Overwrite (Without Retyping Paths)</title>
      <dc:creator>Selvacanabady P</dc:creator>
      <pubDate>Mon, 09 Feb 2026 11:08:44 +0000</pubDate>
      <link>https://dev.to/canabady/bash-history-expansion-trick-diff-promote-overwrite-without-retyping-paths-5c1p</link>
      <guid>https://dev.to/canabady/bash-history-expansion-trick-diff-promote-overwrite-without-retyping-paths-5c1p</guid>
      <description>&lt;h2&gt;
  
  
  Bash History Expansion Trick: &lt;code&gt;diff&lt;/code&gt; → Promote → Overwrite (Without Retyping Paths)
&lt;/h2&gt;

&lt;p&gt;If you work in the terminal long enough, you’ll notice something:&lt;/p&gt;

&lt;p&gt;You type the same long paths twice.You compare files. Then you overwrite one with the other.And you retype both paths carefully… hoping you don’t flip them.Bash already remembers what you typed.&lt;br&gt;&lt;br&gt;
History expansion lets you reuse it precisely.&lt;/p&gt;

&lt;p&gt;Here’s a tight, real-world example.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Goal
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Compare two files
&lt;/li&gt;
&lt;li&gt;Decide the new one should replace the old one
&lt;/li&gt;
&lt;li&gt;Overwrite safely
&lt;/li&gt;
&lt;li&gt;Avoid retyping long paths
&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Step 1 — Compare the Files
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diff somepath/file.txt somepath/file1.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Assume:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;file.txt&lt;/code&gt; → old version
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file1.txt&lt;/code&gt; → new version
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Word positions in that command:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;diff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;somepath/file.txt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;somepath/file1.txt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bash stores this entire command in history.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 2 — Promote the New File Over the Old One
&lt;/h2&gt;

&lt;p&gt;Instead of retyping both paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;^
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;Now let’s break it down.&lt;/p&gt;




&lt;h2&gt;
  
  
  What &lt;code&gt;!$&lt;/code&gt; Means
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;!$&lt;/code&gt; expands to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The last argument of the previous command.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diff somepath/file.txt somepath/file1.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last argument is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;somepath/file1.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!$ → somepath/file1.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What &lt;code&gt;!^&lt;/code&gt; Means
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;!^&lt;/code&gt; expands to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The first argument of the previous command&lt;br&gt;&lt;br&gt;
(same as &lt;code&gt;!:1&lt;/code&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;somepath/file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!^ → somepath/file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Expansion
&lt;/h2&gt;

&lt;p&gt;Bash expands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;somepath/file1.txt somepath/file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Replace the old file with the new file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You compared them first.&lt;br&gt;&lt;br&gt;
You verified the differences.&lt;br&gt;&lt;br&gt;
Now you promote the new version.&lt;/p&gt;

&lt;p&gt;All without retyping anything.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why This Is Powerful
&lt;/h2&gt;

&lt;p&gt;This pattern shines when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paths are long
&lt;/li&gt;
&lt;li&gt;Filenames contain spaces
&lt;/li&gt;
&lt;li&gt;Parentheses need escaping
&lt;/li&gt;
&lt;li&gt;You’re working deep in nested directories
&lt;/li&gt;
&lt;li&gt;You want to eliminate typo risk
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You already typed the paths once.&lt;br&gt;&lt;br&gt;
There’s no reason to type them again.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Mental Model
&lt;/h2&gt;

&lt;p&gt;After:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diff A B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can think:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;^
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Move the last thing to the first thing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Short. Precise. Dangerous if careless — but powerful if deliberate.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Direction Matters
&lt;/h2&gt;

&lt;p&gt;If you accidentally reverse it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;^ &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll overwrite the new file with the old one.&lt;/p&gt;

&lt;p&gt;History expansion does exactly what you ask — not what you meant.&lt;/p&gt;

&lt;p&gt;Be intentional.&lt;/p&gt;




&lt;h2&gt;
  
  
  Safer Version
&lt;/h2&gt;

&lt;p&gt;To avoid accidental overwrites:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;^
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or preview before running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;^:p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;:p&lt;/code&gt; modifier prints the expanded command without executing it.&lt;/p&gt;

&lt;p&gt;In production shells, that extra half-second of verification is wisdom.&lt;/p&gt;




&lt;h2&gt;
  
  
  When This Pattern Is Useful
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Reviewing config changes
&lt;/li&gt;
&lt;li&gt;Comparing generated artifacts
&lt;/li&gt;
&lt;li&gt;Replacing versioned files
&lt;/li&gt;
&lt;li&gt;Promoting staged files to production
&lt;/li&gt;
&lt;li&gt;Iterative local development
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Diff. Decide. Promote. Minimal keystrokes. Maximum control.&lt;/p&gt;




&lt;h1&gt;
  
  
  Part 2 — Advanced Version (No Duplicate Paths)
&lt;/h1&gt;

&lt;p&gt;Instead of writing the directory twice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diff some/long/path/name/file.txt some/long/path/name/file1.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We derive the sibling path dynamically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diff some/long/path/name/file.txt &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="c"&gt;#:1:h/file1.txt&lt;/span&gt;
&lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;^
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Breaking Down &lt;code&gt;!#:1:h&lt;/code&gt;
&lt;/h1&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;!#&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Expands to the current command buffer before &lt;code&gt;!#&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;At that moment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;diff some/long/path/name/file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;code&gt;:1&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Selects the first argument:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;some/long/path/name/file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;code&gt;:h&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Removes the filename, keeps the directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;some/long/path/name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Append &lt;code&gt;/file1.txt&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Final expansion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;some/long/path/name/file1.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Then Promote
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;^
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;!$&lt;/code&gt; → some/long/path/name/file1.txt
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!^&lt;/code&gt; → some/long/path/name/file.txt
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;some/long/path/name/file1.txt some/long/path/name/file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No duplicated directory typing. No copy-paste errors.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why This Matters
&lt;/h1&gt;

&lt;p&gt;This is powerful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paths are long&lt;/li&gt;
&lt;li&gt;Filenames include spaces or parentheses&lt;/li&gt;
&lt;li&gt;You’re working in deep project trees&lt;/li&gt;
&lt;li&gt;You’re reviewing build artifacts&lt;/li&gt;
&lt;li&gt;You want to eliminate typo risk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You typed the path once. That’s enough.&lt;/p&gt;




&lt;h1&gt;
  
  
  ⚠️ Important: Word Position Is Literal
&lt;/h1&gt;

&lt;p&gt;History expansion is positional.&lt;/p&gt;

&lt;p&gt;If you change argument order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diff &lt;span class="nt"&gt;-u&lt;/span&gt; some/path/file.txt ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;:1&lt;/code&gt; may no longer refer to the file.&lt;/p&gt;

&lt;p&gt;It doesn’t understand semantics. It only understands word positions.&lt;/p&gt;




&lt;h1&gt;
  
  
  Safer Usage
&lt;/h1&gt;

&lt;p&gt;Preview expansion before execution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;^:p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or add confirmation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;^
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Final Thought
&lt;/h1&gt;

&lt;p&gt;Most developers use Bash like a typewriter. History expansion turns it into a memory system.&lt;/p&gt;

</description>
      <category>bash</category>
      <category>linux</category>
      <category>cli</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Vim Navigation</title>
      <dc:creator>Selvacanabady P</dc:creator>
      <pubDate>Mon, 26 Jan 2026 07:41:24 +0000</pubDate>
      <link>https://dev.to/canabady/vim-navigation-for-experienced-developers-13c1</link>
      <guid>https://dev.to/canabady/vim-navigation-for-experienced-developers-13c1</guid>
      <description>&lt;p&gt;Vim’s movement model is one of its strongest advantages—when used intentionally.&lt;br&gt;&lt;br&gt;
This guide compiles techniques that are especially valuable in day-to-day development: &lt;strong&gt;jumping across locations&lt;/strong&gt;, &lt;strong&gt;navigating within code&lt;/strong&gt;, and controlling how your screen follows your cursor.&lt;/p&gt;


&lt;h3&gt;
  
  
  Table of Contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
Jump

&lt;ul&gt;
&lt;li&gt;Jump by percentage of file&lt;/li&gt;
&lt;li&gt;Return to last edit location&lt;/li&gt;
&lt;li&gt;Navigate jump history (Ctrl+O / Ctrl+I)&lt;/li&gt;
&lt;li&gt;Jump to the Nth character&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Navigate

&lt;ul&gt;
&lt;li&gt;Screen positioning commands&lt;/li&gt;
&lt;li&gt;Start/end of line: physical vs screen line&lt;/li&gt;
&lt;li&gt;Navigate blocks&lt;/li&gt;
&lt;li&gt;Navigate comments&lt;/li&gt;
&lt;li&gt;Window-relative navigation (H, M, L)&lt;/li&gt;
&lt;li&gt;Refine search without leaving the prompt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Jump
&lt;/h2&gt;

&lt;p&gt;Jumping is about &lt;strong&gt;teleporting&lt;/strong&gt;: moving to a meaningful location with minimal keystrokes—often across large distances in a file or across navigation history.&lt;/p&gt;


&lt;h3&gt;
  
  
  Jump by percentage of file
&lt;/h3&gt;

&lt;p&gt;When working with large files, line numbers are not always the most convenient reference point. Vim allows you to jump to an approximate location using percentages.&lt;/p&gt;
&lt;h4&gt;
  
  
  TIP: Jump to the middle of the file
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="m"&gt;50&lt;/span&gt;%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  TIP: Jump to the Nth portion of the file
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;N%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;N&lt;/code&gt; can range from &lt;strong&gt;1 to 100&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Example: jump near the end of the file:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="m"&gt;90&lt;/span&gt;%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is useful for quickly scanning large source files, logs, or generated output.&lt;/p&gt;


&lt;h3&gt;
  
  
  Return to last edit location
&lt;/h3&gt;

&lt;p&gt;It is common to search, inspect code in different places, and then return to the place you were actively editing.&lt;/p&gt;
&lt;h4&gt;
  
  
  TIP: Go to the last edited location (and enter INSERT mode)
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;gi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  TIP: Go to the last edited location (remain in NORMAL mode)
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;`^
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is especially useful after:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;searching (&lt;code&gt;/pattern&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;jumping between functions or blocks&lt;/li&gt;
&lt;li&gt;exploring a file during debugging&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Navigate jump history (Ctrl+O / Ctrl+I)
&lt;/h3&gt;

&lt;p&gt;Vim maintains a &lt;strong&gt;jump list&lt;/strong&gt;—a history of significant cursor moves. This makes it easy to move backward and forward through where you’ve been.&lt;/p&gt;
&lt;h4&gt;
  
  
  TIP: Jump backward in history
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;Ctrl&lt;span class="p"&gt;+&lt;/span&gt;O
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  TIP: Jump forward in history
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;Ctrl&lt;span class="p"&gt;+&lt;/span&gt;I
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is highly effective after:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repeated searching (&lt;code&gt;/pattern&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;jumping around during refactors&lt;/li&gt;
&lt;li&gt;navigating between distant sections of a file&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Jump to the Nth character
&lt;/h3&gt;

&lt;p&gt;For character-precise positioning (common in configs, logs, or long  content), Vim supports direct character offsets across the file.&lt;/p&gt;
&lt;h4&gt;
  
  
  TIP: Jump to the Nth character from the start of the file
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;gotoN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Example: jump to the &lt;strong&gt;25th character&lt;/strong&gt; in the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="p"&gt;:&lt;/span&gt;goto25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  TIP: Jump forward N characters from the cursor
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;N&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;space&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example: move forward 200 characters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;space&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  TIP: Jump backward N characters from the cursor
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;N&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Backspace&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example: move backward 300 characters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="m"&gt;300&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Backspace&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Navigate
&lt;/h2&gt;

&lt;p&gt;Navigation is about &lt;strong&gt;controlled movement&lt;/strong&gt;: staying oriented while moving inside code with precision and minimal scrolling.&lt;/p&gt;




&lt;h3&gt;
  
  
  Screen positioning commands
&lt;/h3&gt;

&lt;p&gt;Cursor movement is not always enough—screen positioning improves readability and reduces unnecessary scrolling.&lt;/p&gt;

&lt;h4&gt;
  
  
  TIP: Center/top/bottom the screen on the cursor
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;zz   " Center the screen &lt;span class="k"&gt;on&lt;/span&gt; the &lt;span class="nb"&gt;cursor&lt;/span&gt;
zt   " Place the &lt;span class="nb"&gt;cursor&lt;/span&gt; &lt;span class="nb"&gt;line&lt;/span&gt; at the &lt;span class="nb"&gt;top&lt;/span&gt; of the &lt;span class="nb"&gt;window&lt;/span&gt;
zb   " Place the &lt;span class="nb"&gt;cursor&lt;/span&gt; &lt;span class="nb"&gt;line&lt;/span&gt; at the bottom of the &lt;span class="nb"&gt;window&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Alternative equivalents
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;z&lt;span class="p"&gt;.&lt;/span&gt;         " Center the screen &lt;span class="k"&gt;on&lt;/span&gt; the &lt;span class="nb"&gt;cursor&lt;/span&gt;
z&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;ENTER&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;   " Place the &lt;span class="nb"&gt;cursor&lt;/span&gt; &lt;span class="nb"&gt;line&lt;/span&gt; at the &lt;span class="nb"&gt;top&lt;/span&gt; of the &lt;span class="nb"&gt;window&lt;/span&gt;
z&lt;span class="p"&gt;-&lt;/span&gt;         " Place the &lt;span class="nb"&gt;cursor&lt;/span&gt; &lt;span class="nb"&gt;line&lt;/span&gt; at the bottom of the &lt;span class="nb"&gt;window&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands are particularly useful when reviewing dense code or maintaining context during debugging.&lt;/p&gt;




&lt;h3&gt;
  
  
  Start/end of line: physical vs screen line
&lt;/h3&gt;

&lt;p&gt;Vim distinguishes between &lt;strong&gt;physical lines&lt;/strong&gt; (newline-delimited lines in the file) and &lt;strong&gt;screen lines&lt;/strong&gt; (how lines appear when wrapped in the editor window). This distinction matters when working with long lines.&lt;/p&gt;

&lt;h4&gt;
  
  
  TIP: Navigate to the end of a line
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;$    " End of the physical &lt;span class="nb"&gt;line&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;NORMAL &lt;span class="k"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
g_   " Last non&lt;span class="p"&gt;-&lt;/span&gt;whitespace character of the physical &lt;span class="nb"&gt;line&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;NORMAL &lt;span class="k"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
A    " End of the physical &lt;span class="nb"&gt;line&lt;/span&gt; &lt;span class="nb"&gt;and&lt;/span&gt; enter INSERT &lt;span class="k"&gt;mode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  TIP: Navigate to the start of a line (first non-whitespace)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;^    " First non&lt;span class="p"&gt;-&lt;/span&gt;whitespace character &lt;span class="p"&gt;(&lt;/span&gt;NORMAL &lt;span class="k"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
I    " First non&lt;span class="p"&gt;-&lt;/span&gt;whitespace character &lt;span class="nb"&gt;and&lt;/span&gt; enter INSERT &lt;span class="k"&gt;mode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  TIP: Navigate to the absolute start (column 0)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="m"&gt;0&lt;/span&gt;    " Column &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;NORMAL &lt;span class="k"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="k"&gt;i&lt;/span&gt;   " Column &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;and&lt;/span&gt; enter INSERT &lt;span class="k"&gt;mode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Physical line vs screen line navigation
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;$  &lt;span class="nb"&gt;and&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;   " End/beginning of the physical &lt;span class="nb"&gt;line&lt;/span&gt;
&lt;span class="k"&gt;g&lt;/span&gt;$ &lt;span class="nb"&gt;and&lt;/span&gt; g0  " End/beginning of the screen &lt;span class="nb"&gt;line&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;wrapped&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For long lines, &lt;code&gt;g0&lt;/code&gt; and &lt;code&gt;g$&lt;/code&gt; are often more accurate than &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;$&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Navigate blocks
&lt;/h3&gt;

&lt;p&gt;When working in brace-heavy codebases, jumping by structure is often faster than scrolling.&lt;/p&gt;

&lt;h4&gt;
  
  
  TIP: Jump to the start of the previous &lt;code&gt;{&lt;/code&gt; block
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Navigate comments
&lt;/h3&gt;

&lt;p&gt;For documentation-heavy files or legacy codebases, comment navigation can reduce scanning time.&lt;/p&gt;

&lt;h4&gt;
  
  
  TIP: Place cursor to previous start of a C comment
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Window-relative navigation (H, M, L)
&lt;/h3&gt;

&lt;p&gt;Window-relative navigation allows you to move inside the visible portion of the file without scrolling.&lt;/p&gt;

&lt;h4&gt;
  
  
  TIP: Jump within the current window
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;H   " Top of the &lt;span class="nb"&gt;window&lt;/span&gt;
M   " Middle of the &lt;span class="nb"&gt;window&lt;/span&gt;
L   " Bottom of the &lt;span class="nb"&gt;window&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also provide a count:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="m"&gt;10&lt;/span&gt;H  " Move &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="nb"&gt;lines&lt;/span&gt; below the &lt;span class="nb"&gt;top&lt;/span&gt; of the &lt;span class="nb"&gt;window&lt;/span&gt;
&lt;span class="m"&gt;3&lt;/span&gt;L   " Move &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nb"&gt;lines&lt;/span&gt; above the bottom of the &lt;span class="nb"&gt;window&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Summary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;H     Go &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;top&lt;/span&gt; of screen
M     Go &lt;span class="k"&gt;to&lt;/span&gt; middle of screen
L     Go &lt;span class="k"&gt;to&lt;/span&gt; bottom of screen
nH    Go &lt;span class="k"&gt;n&lt;/span&gt; &lt;span class="nb"&gt;lines&lt;/span&gt; from &lt;span class="nb"&gt;top&lt;/span&gt;
nL    Go &lt;span class="k"&gt;n&lt;/span&gt; &lt;span class="nb"&gt;lines&lt;/span&gt; from bottom
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Refine search without leaving the prompt
&lt;/h3&gt;

&lt;p&gt;When iterating on search patterns, you can refine without immediately executing the search.&lt;/p&gt;

&lt;h4&gt;
  
  
  TIP: Stay in search mode after entering a pattern
&lt;/h4&gt;

&lt;p&gt;Instead of pressing Enter, use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl-g&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl-t&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps you in the search prompt so you can refine the pattern efficiently.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Efficient Vim movement is not about memorizing every command—it is about adopting a small set of high-value techniques and using them consistently.&lt;/p&gt;

&lt;p&gt;A practical approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select &lt;strong&gt;3–5 commands&lt;/strong&gt; from this post
&lt;/li&gt;
&lt;li&gt;Use them daily for one week
&lt;/li&gt;
&lt;li&gt;Add more only when the current set becomes automatic
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>vim</category>
      <category>neovim</category>
      <category>productivity</category>
      <category>developertools</category>
    </item>
  </channel>
</rss>
