<?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: Eric Wong</title>
    <description>The latest articles on DEV Community by Eric Wong (@wsdjeg).</description>
    <link>https://dev.to/wsdjeg</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F79064%2F17e9accd-9169-4ba9-88d8-d5412b339323.png</url>
      <title>DEV Community: Eric Wong</title>
      <link>https://dev.to/wsdjeg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wsdjeg"/>
    <language>en</language>
    <item>
      <title>Giving Your Neovim AI Assistant a Sense of Time: Scheduled Tasks in chat.nvim</title>
      <dc:creator>Eric Wong</dc:creator>
      <pubDate>Wed, 08 Jul 2026 13:27:59 +0000</pubDate>
      <link>https://dev.to/wsdjeg/giving-your-neovim-ai-assistant-a-sense-of-time-scheduled-tasks-in-chatnvim-3da9</link>
      <guid>https://dev.to/wsdjeg/giving-your-neovim-ai-assistant-a-sense-of-time-scheduled-tasks-in-chatnvim-3da9</guid>
      <description>&lt;h2&gt;
  
  
  AI Is Passive
&lt;/h2&gt;

&lt;p&gt;You tell AI "fix this code," it responds instantly. You say "remind me about the meeting in an hour," it says "sure" — and then nothing happens.&lt;/p&gt;

&lt;p&gt;This isn't a bug in one product. It's a common limitation across most mainstream AI assistants: &lt;strong&gt;they are passive.&lt;/strong&gt; They answer when you ask. They stay silent when you don't. They have no concept of "time," no concept of "the future," and no ability to initiate anything on their own. While some open-source or closed-source Agent frameworks already support scheduled tasks, mainstream assistants like Doubao and DeepSeek still lack this capability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wsdjeg/chat.nvim" rel="noopener noreferrer"&gt;chat.nvim&lt;/a&gt; now includes a scheduled task feature, designed to give AI a sense of time — letting it proactively reach out to you at a future moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Idea
&lt;/h2&gt;

&lt;p&gt;To break AI's passivity, the key question is: &lt;strong&gt;how do we make AI start working at a future moment, as if it just received a user message?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The solution is straightforward, three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Remember a task (when, what)&lt;/li&gt;
&lt;li&gt;Trigger at the right time&lt;/li&gt;
&lt;li&gt;Inject the message into the session — AI processes it like any user message&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Simple in concept, but the devil is in the details. Let's walk through the design decisions for each part.&lt;/p&gt;

&lt;h2&gt;
  
  
  Time Model: Unified as Absolute Timestamps
&lt;/h2&gt;

&lt;p&gt;Users can describe time in three ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"In 1 hour" — relative delay&lt;/li&gt;
&lt;li&gt;"Tomorrow at 9 AM" — absolute point in time&lt;/li&gt;
&lt;li&gt;"Every day at 10 PM" — recurring cycle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick one, they're mutually exclusive.&lt;/p&gt;

&lt;p&gt;Regardless of how the user describes it, internally everything converts to a Unix timestamp. "In 1 hour" becomes &lt;code&gt;current_time + 3600&lt;/code&gt;. "Every day" becomes every 86400 seconds starting from creation time.&lt;/p&gt;

&lt;p&gt;Why? Because the scheduling engine only needs to handle one time model. No need to distinguish between "delay" and "schedule," no need for different logic branches. Unified abstraction eliminates branching.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trigger Mechanism: No Polling, Use Timers
&lt;/h2&gt;

&lt;p&gt;The most intuitive approach is polling: scan the task list every few seconds to check if anything is due.&lt;/p&gt;

&lt;p&gt;That's wasteful. 99 out of 100 tasks are still waiting, yet you scan them every second.&lt;/p&gt;

&lt;p&gt;A better approach: one independent timer per task. It wakes up only when due, with zero CPU overhead while waiting. This is event-driven, not poll-driven.&lt;/p&gt;

&lt;p&gt;Neovim has libuv built in. &lt;code&gt;uv.new_timer()&lt;/code&gt; does exactly this — millisecond precision, non-blocking on the main thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-Drift for Recurring Tasks
&lt;/h2&gt;

&lt;p&gt;Recurring tasks have a pitfall: if Neovim restarts midway, how do you calculate the next trigger time after recovery?&lt;/p&gt;

&lt;p&gt;The instinctive approach is &lt;code&gt;current_time + interval&lt;/code&gt;. But this causes rhythm drift — you set "every day at 10 AM," after a restart it becomes 10:03, after another restart 10:07...&lt;/p&gt;

&lt;p&gt;The correct approach: calculate the next trigger based on creation time and execution count.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;next_trigger = creation_time + (executed_count + 1) × interval
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way, no matter how many restarts happen, the 7th execution always lands at &lt;code&gt;creation_time + 7 × interval&lt;/code&gt;. The rhythm is locked to the moment of creation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 24.8-Day Limit
&lt;/h2&gt;

&lt;p&gt;libuv timers have a hard limit: maximum timeout of &lt;code&gt;2³¹-1&lt;/code&gt; milliseconds, approximately 24.8 days.&lt;/p&gt;

&lt;p&gt;What if a user sets a task 30 days out?&lt;/p&gt;

&lt;p&gt;The solution is sharding. First set a 24.8-day timer. When it fires, check — the real trigger time hasn't arrived yet, so recalculate the remaining delay and set a new timer. Two relays cover any duration.&lt;/p&gt;

&lt;p&gt;The 30-day cap covers reasonable use cases while preventing a buggy task from hanging around forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decoupling Scheduling from Execution
&lt;/h2&gt;

&lt;p&gt;This is the most critical decision in the entire design.&lt;/p&gt;

&lt;p&gt;The scheduling engine does exactly one thing: when the time comes, push a message into the queue. It doesn't call the LLM API, doesn't care if AI is online, doesn't care about network status.&lt;/p&gt;

&lt;p&gt;Why not just call the API directly when the timer fires? Because once responsibilities are mixed, complexity explodes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What if AI is already processing another request?&lt;/li&gt;
&lt;li&gt;What if the network is down?&lt;/li&gt;
&lt;li&gt;What if the session was deleted?&lt;/li&gt;
&lt;li&gt;What if the user is mid-keystroke?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After decoupling, the scheduling engine's logic is dead simple: fire → push → done. Everything else is handled by the message queue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Message Queue: Waiting for a Window
&lt;/h2&gt;

&lt;p&gt;After a task fires, the message enters a queue. The queue is responsible for delivering the message to AI at "the right moment."&lt;/p&gt;

&lt;p&gt;What's the right moment? &lt;strong&gt;When the session is idle.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If AI isn't busy, send immediately&lt;/li&gt;
&lt;li&gt;If AI is processing another request, queue up and check every few seconds — inject once it's free&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's like a colleague messaging you while you're in a meeting — the message doesn't disappear, you just read it after the meeting.&lt;/p&gt;

&lt;p&gt;Only after 3 consecutive send failures does the message get discarded, preventing transient glitches from swallowing messages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Persistence and Recovery
&lt;/h2&gt;

&lt;p&gt;Neovim isn't a persistent process — users can close it at any time. Scheduled tasks must survive restarts.&lt;/p&gt;

&lt;p&gt;The approach is straightforward: every time a task is created, cancelled, or fired, write all tasks to a JSON file on disk. On next launch, load it back.&lt;/p&gt;

&lt;p&gt;One detail: libuv timers are in-memory objects that can't be serialized. When persisting, the timer handle must be excluded and recreated on recovery.&lt;/p&gt;

&lt;p&gt;Recovery has two different strategies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Expired one-time tasks&lt;/strong&gt;: skip them. The trigger time has passed, they're meaningless now&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expired recurring tasks&lt;/strong&gt;: must be restored. Recurring tasks need to continue executing — they shouldn't break just because of a restart&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Complete Flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You say: "Remind me about the meeting in 1 hour"
    │
    ▼
AI calls the tool, calculates trigger_at = current_time + 3600
    │
    ▼
Scheduling engine creates the task, writes to disk, arms a 3600s timer
    │
    ··· (1 hour later) ···
    │
    ▼
Timer fires → pushes "Remind me about the meeting" into the session's message queue
    │
    ▼
Queue detects session is idle → sends to AI
    │
    ▼
AI receives the message, responds with a reminder — just as if you said it yourself
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to Use It
&lt;/h2&gt;

&lt;p&gt;Just tell AI in natural language:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Remind me to follow up on the Subei People's Hospital project in 1 hour&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI will automatically calculate the time and create a scheduled task.&lt;/p&gt;

&lt;p&gt;Three modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-time&lt;/strong&gt;: &lt;code&gt;delay_seconds=3600&lt;/code&gt; or &lt;code&gt;trigger_at=1717200000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recurring&lt;/strong&gt;: &lt;code&gt;interval=86400&lt;/code&gt; (daily), optionally &lt;code&gt;repeat_count=7&lt;/code&gt; to limit repeats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Management&lt;/strong&gt;: &lt;code&gt;action="list"&lt;/code&gt; to view, &lt;code&gt;action="cancel"&lt;/code&gt; to cancel&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;Survives Neovim restarts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max delay&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Min interval&lt;/td&gt;
&lt;td&gt;10 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Precision&lt;/td&gt;
&lt;td&gt;Second-level (Unix timestamp based)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependencies&lt;/td&gt;
&lt;td&gt;Zero external deps — pure Neovim + libuv&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The scheduled task system in chat.nvim proves that giving AI a sense of time doesn't require a complex architecture. The key design principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Unify the time model&lt;/strong&gt; — one abstraction, no branching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event-driven, not poll-driven&lt;/strong&gt; — zero overhead when idle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lock the rhythm&lt;/strong&gt; — anti-drift for recurring tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decouple scheduling from execution&lt;/strong&gt; — keep the engine simple&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persist everything&lt;/strong&gt; — survive restarts gracefully&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result: AI that can proactively reach out when you need it, not just respond when you ask.&lt;/p&gt;

</description>
      <category>neovim</category>
      <category>lua</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Multiple cursor support in SpaceVim</title>
      <dc:creator>Eric Wong</dc:creator>
      <pubDate>Fri, 08 Apr 2022 14:42:26 +0000</pubDate>
      <link>https://dev.to/wsdjeg/multiple-cursor-support-in-spacevim-42ah</link>
      <guid>https://dev.to/wsdjeg/multiple-cursor-support-in-spacevim-42ah</guid>
      <description>&lt;p&gt;&lt;a href="https://spacevim.org" rel="noopener noreferrer"&gt;SpaceVim&lt;/a&gt; is a preconfigured configuration for Vim and Neovim. It provides multiple cursor supportting via &lt;code&gt;iedit&lt;/code&gt; plugin which just same as &lt;code&gt;iedit-mode&lt;/code&gt; of emacs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fikilom107xx40658sq07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fikilom107xx40658sq07.png" alt="iedit-mode" width="799" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The default key binding of iedit is &lt;code&gt;SPC s e&lt;/code&gt;, &lt;code&gt;SPC&lt;/code&gt; is &lt;code&gt;&amp;lt;Space&amp;gt;&lt;/code&gt;. There are two mode of iedit, &lt;code&gt;iedit-normal&lt;/code&gt; mode and &lt;code&gt;iedit-insert&lt;/code&gt; mode. Here are the key bindings of these two modes.&lt;/p&gt;

&lt;h4&gt;
  
  
  iedit states key bindings
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;State transitions:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key Bindings&lt;/th&gt;
&lt;th&gt;From&lt;/th&gt;
&lt;th&gt;to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SPC s e&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;normal or visual&lt;/td&gt;
&lt;td&gt;iedit-Normal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;In iedit-Normal mode:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;iedit-Normal&lt;/code&gt; mode inherits from &lt;code&gt;Normal&lt;/code&gt; mode, the following key bindings are specific to &lt;code&gt;iedit-Normal&lt;/code&gt; mode.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key Binding&lt;/th&gt;
&lt;th&gt;Descriptions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Esc&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;go back to &lt;code&gt;Normal&lt;/code&gt; mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;i&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;switch to &lt;code&gt;iedit-Insert&lt;/code&gt; mode, same as &lt;code&gt;i&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;switch to &lt;code&gt;iedit-Insert&lt;/code&gt; mode, same as &lt;code&gt;a&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;I&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;go to the beginning of the current occurrence and switch to &lt;code&gt;iedit-Insert&lt;/code&gt; mode, same as &lt;code&gt;I&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;go to the end of the current occurrence and switch to &lt;code&gt;iedit-Insert&lt;/code&gt; mode, same as &lt;code&gt;A&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;Left&amp;gt;&lt;/code&gt;/&lt;code&gt;h&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Move cursor to left, same as &lt;code&gt;h&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;Right&amp;gt;&lt;/code&gt;/&lt;code&gt;l&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Move cursor to right, same as &lt;code&gt;l&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;0&lt;/code&gt;/&lt;code&gt;&amp;lt;Home&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;go to the beginning of the current occurrence, same as &lt;code&gt;0&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;$&lt;/code&gt;/&lt;code&gt;&amp;lt;End&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;go to the end of the current occurrence, same as &lt;code&gt;$&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;C&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;delete the characters from the cursor to the end in all occurrences and switch to iedit-Insert mode, same as &lt;code&gt;C&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;D&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;delete the occurrences, same as &lt;code&gt;D&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;delete the character under cursor and switch to iedit-Insert mode, same as &lt;code&gt;s&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;S&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;delete the occurrences and switch to iedit-Insert mode, same as &lt;code&gt;S&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;delete the character under cursor in all the occurrences, same as &lt;code&gt;x&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;delete the character before cursor in all the occurrences, same as &lt;code&gt;X&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;go to first occurrence, same as &lt;code&gt;gg&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;G&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;go to last occurrence, same as &lt;code&gt;G&lt;/code&gt; in &lt;code&gt;Normal&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;f{char}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Move the cursor to the right where the &lt;code&gt;{char}&lt;/code&gt; first appears in all the occurrences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;go to next occurrence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;go to previous occurrence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;replace occurrences with last yanked (copied) text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Tab&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;toggle current occurrence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;In iedit-Insert mode:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key Bindings&lt;/th&gt;
&lt;th&gt;Descriptions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Ctrl-g&lt;/code&gt; / &lt;code&gt;&amp;lt;Esc&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;go back to &lt;code&gt;iedit-Normal&lt;/code&gt; mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Ctrl-b&lt;/code&gt; / &lt;code&gt;&amp;lt;Left&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;move cursor to left&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Ctrl-f&lt;/code&gt; / &lt;code&gt;&amp;lt;Right&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;move cursor to right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Ctrl-a&lt;/code&gt; / &lt;code&gt;&amp;lt;Home&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;moves the cursor to the beginning of the current occurrence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Ctrl-e&lt;/code&gt; / &lt;code&gt;&amp;lt;End&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;moves the cursor to the end of the current occurrence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl-w&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;delete word before cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl-k&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;delete all words after cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl-u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;delete all characters before cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Ctrl-h&lt;/code&gt; / &lt;code&gt;&amp;lt;Backspace&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;delete character before cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Delete&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;delete character after cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;SPC s e&lt;/code&gt; will select all matchs by default, if you want to select the matchs one by one, you can use &lt;code&gt;SPC s E&lt;/code&gt; key binding and &lt;code&gt;Ctrl-n&lt;/code&gt; to select next one. &lt;/p&gt;

</description>
      <category>vim</category>
      <category>neovim</category>
      <category>spacevim</category>
      <category>emacs</category>
    </item>
    <item>
      <title>Tasks manager within SpaceVim</title>
      <dc:creator>Eric Wong</dc:creator>
      <pubDate>Sat, 22 Feb 2020 08:38:12 +0000</pubDate>
      <link>https://dev.to/wsdjeg/tasks-manager-within-spacevim-4b00</link>
      <guid>https://dev.to/wsdjeg/tasks-manager-within-spacevim-4b00</guid>
      <description>&lt;h3&gt;
  
  
  Tasks
&lt;/h3&gt;

&lt;p&gt;To integrate with external tools, &lt;a href="https://spacevim.org" rel="noopener noreferrer"&gt;SpaceVim&lt;/a&gt; introduce a task manager system,&lt;br&gt;
which is similar to vscode tasks-manager. There are two kinds of task configuration&lt;br&gt;
file: global tasks configuration(&lt;code&gt;~/.SpaceVim.d/tasks.toml&lt;/code&gt;) and local configuration(&lt;code&gt;.SpaceVim.d/tasks.toml&lt;/code&gt;).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key Bindings&lt;/th&gt;
&lt;th&gt;Descriptions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SPC p t e&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;edit tasks configuration file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SPC p t r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;select task to run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Task auto-detection
&lt;/h4&gt;

&lt;p&gt;SpaceVim currently auto-detects tasks for npm.&lt;br&gt;
the tasks manager will paser the &lt;code&gt;package.json&lt;/code&gt; file for npm systems.&lt;br&gt;
If you have cloned the &lt;a href="https://github.com/spicydonuts/eslint-starter" rel="noopener noreferrer"&gt;eslint-starter&lt;/a&gt; example,&lt;br&gt;
then pressing &lt;code&gt;SPC p t r&lt;/code&gt; shows the following list:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2r3qls3o3cgkcz8kwcd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2r3qls3o3cgkcz8kwcd.png" alt="task-auto-detection" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Custom tasks
&lt;/h4&gt;

&lt;p&gt;this is basic task configuration for running &lt;code&gt;echo hello world&lt;/code&gt;, and print results to runner windows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[my-task]&lt;/span&gt;
    &lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'echo'&lt;/span&gt;
    &lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'hello world'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vl12zx0qpxupd9e0tz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vl12zx0qpxupd9e0tz9.png" alt="task hello world" width="682" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To run task in the background, you need to set &lt;code&gt;isBackground&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[my-task]&lt;/span&gt;
    &lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'echo'&lt;/span&gt;
    &lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'hello world'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="py"&gt;isBackground&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The task's properties have the following semantic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;command&lt;/strong&gt;: the actual command to execute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;args&lt;/strong&gt;: the arguments passed to the command. can be omitted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;options&lt;/strong&gt;: override the defaults for &lt;code&gt;cwd&lt;/code&gt;,&lt;code&gt;env&lt;/code&gt; or &lt;code&gt;shell&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SpaceVim supports variable substitution in task, The following predefined variables are supported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;${workspaceFolder}&lt;/strong&gt;: - the project root directory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${workspaceFolderBasename}&lt;/strong&gt;: - the parent directory name of current project root&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${file}&lt;/strong&gt;: - the path of current file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${relativeFile}&lt;/strong&gt;: - the current file relative to project root&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${relativeFileDirname}&lt;/strong&gt;: - the current file's dirname relative to workspaceFolder&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${fileBasename}&lt;/strong&gt;: - the current file's basename&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${fileBasenameNoExtension}&lt;/strong&gt;: - the current file's basename without file extension&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${fileDirname}&lt;/strong&gt;: - the current file's dirname&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${fileExtname}&lt;/strong&gt;: - the current file's extension&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${cwd}&lt;/strong&gt;: - the task runner's current working directory on startup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${lineNumber}&lt;/strong&gt;: - the current selected line number in the active file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;for example: Supposing that you have the following requirements:&lt;/p&gt;

&lt;p&gt;A file located at &lt;code&gt;/home/your-username/your-project/folder/file.ext&lt;/code&gt; opened in your editor;&lt;br&gt;
The directory &lt;code&gt;/home/your-username/your-project&lt;/code&gt; opened as your root workspace.&lt;br&gt;
So you will have the following values for each variable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;${workspaceFolder}&lt;/strong&gt;: - &lt;code&gt;/home/your-username/your-project/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${workspaceFolderBasename}&lt;/strong&gt;: - &lt;code&gt;your-project&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${file}&lt;/strong&gt;: - &lt;code&gt;/home/your-username/your-project/folder/file.ext&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${relativeFile}&lt;/strong&gt;: - &lt;code&gt;folder/file.ext&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${relativeFileDirname}&lt;/strong&gt;: - &lt;code&gt;folder/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${fileBasename}&lt;/strong&gt;: - &lt;code&gt;file.ext&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${fileBasenameNoExtension}&lt;/strong&gt;: - &lt;code&gt;file&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${fileDirname}&lt;/strong&gt;: - &lt;code&gt;/home/your-username/your-project/folder/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${fileExtname}&lt;/strong&gt;: - &lt;code&gt;.ext&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;${lineNumber}&lt;/strong&gt;: - line number of the cursor&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>spacevim</category>
      <category>vim</category>
      <category>neovim</category>
    </item>
    <item>
      <title>Use Vim as a Java IDE</title>
      <dc:creator>Eric Wong</dc:creator>
      <pubDate>Mon, 24 Jun 2019 12:30:04 +0000</pubDate>
      <link>https://dev.to/wsdjeg/use-vim-as-a-java-ide-2l1k</link>
      <guid>https://dev.to/wsdjeg/use-vim-as-a-java-ide-2l1k</guid>
      <description>&lt;h1&gt;
  
  
  Use Vim as a Java IDE
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;why canonical_url do not word?!&lt;br&gt;
the origin URL is &lt;a href="https://spacevim.org/use-vim-as-a-java-ide/" rel="noopener noreferrer"&gt;https://spacevim.org/use-vim-as-a-java-ide/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a general guide for using SpaceVim as a Java IDE, including layer configuration and usage.&lt;br&gt;
Each of the following sections will be covered:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Installation&lt;/li&gt;
&lt;li&gt;Language server&lt;/li&gt;
&lt;li&gt;Code completion&lt;/li&gt;
&lt;li&gt;Code outline&lt;/li&gt;
&lt;li&gt;Rename symbol&lt;/li&gt;
&lt;li&gt;Javadoc hovers&lt;/li&gt;
&lt;li&gt;Syntax lint&lt;/li&gt;
&lt;li&gt;Import packages&lt;/li&gt;
&lt;li&gt;Jump to test file&lt;/li&gt;
&lt;li&gt;running code&lt;/li&gt;
&lt;li&gt;Code formatting&lt;/li&gt;
&lt;li&gt;REPL&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;SpaceVim is a Vim and neovim configuration, so you need to install vim or neovim,&lt;br&gt;
here are two guides for installing neovim and vim8 with &lt;code&gt;+python3&lt;/code&gt; feature.&lt;br&gt;
following the &lt;a href="https://spacevim.org/quick-start-guide/" rel="noopener noreferrer"&gt;quick start guide&lt;/a&gt; to install SpaceVim.&lt;/p&gt;

&lt;p&gt;SpaceVim do not enable language layer by default, so you need to enable &lt;code&gt;lang#java&lt;/code&gt; layer.&lt;br&gt;
Press &lt;code&gt;SPC f v d&lt;/code&gt; to open SpaceVim configuration file, and add following section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[[layers]]&lt;/span&gt;
  &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"lang#java"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Language server
&lt;/h3&gt;

&lt;p&gt;To enable language server protocol support, you may need to enable lsp layer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[[layers]]&lt;/span&gt;
  &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"lsp"&lt;/span&gt;
  &lt;span class="py"&gt;filetypes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;"java"&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nn"&gt;[layers.override_cmd]&lt;/span&gt;
    &lt;span class="py"&gt;java&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;"java"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="py"&gt;"-Declipse.application&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;org.eclipse.jdt.ls.core.id&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="s"&gt;",&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;    &lt;span class="py"&gt;"-Dosgi.bundles.defaultStartLevel&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="s"&gt;",&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;    &lt;span class="py"&gt;"-Declipse.product&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;org.eclipse.jdt.ls.core.product&lt;/span&gt;&lt;span class="s"&gt;",&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;    &lt;span class="py"&gt;"-Dlog.protocol&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="s"&gt;",&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;    &lt;span class="py"&gt;"-Dlog.level&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;NONE&lt;/span&gt;&lt;span class="s"&gt;",&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;    &lt;span class="s"&gt;"-noverify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"-Xmx1G"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"-jar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"D:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;dev&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;jdt-language-server-latest&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;plugins&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;org.eclipse.equinox.launcher_1.5.200.v20180922-1751.jar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"-configuration"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"D:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;dev&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;jdt-language-server-latest&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;config_win"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"-data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;Users&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;Administrator&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;.cache&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;javalsp"&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You need to replace &lt;code&gt;D:\dev\jdt-language-server-latest\plugins\org.eclipse.equinox.launcher_1.5.200.v20180922-1751.jar&lt;/code&gt; with the actual name of the org.eclipse.equinox.launcher jar&lt;/p&gt;

&lt;p&gt;The configuration flag can point to either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;config_win&lt;/code&gt;, for Windows&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;config_mac&lt;/code&gt;, for MacOS&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;config_linux&lt;/code&gt;, for Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The data flag value should be the absolute path to the working directory of the server.&lt;br&gt;
This should be different from the path of the user's project files (which is sent during the initialize handshake).&lt;/p&gt;
&lt;h3&gt;
  
  
  Code completion
&lt;/h3&gt;

&lt;p&gt;javacomplete2 which has been included in &lt;code&gt;lang#java&lt;/code&gt; layer provides omnifunc for java file and deoplete source.&lt;br&gt;
with this plugin and &lt;code&gt;autocomplete&lt;/code&gt; layer, the completion popup menu will be opened automatically。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3oauhdiqlt0eyi1i9ng7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3oauhdiqlt0eyi1i9ng7.png" alt="code complete" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Code outline
&lt;/h3&gt;

&lt;p&gt;The default outline plugin is tagbar, and the key binding is &lt;code&gt;F2&lt;/code&gt;. This key binding will open an outline sidebar on the left.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5jtgod3f5kkq86z6p3i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5jtgod3f5kkq86z6p3i.png" alt="java outline" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To fuzzy find outline in current buffer, you need to enable a fuzzy find layer, for example denite layer,&lt;br&gt;
then press &lt;code&gt;Leader f o&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb98lakt94iepcno9qxll.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb98lakt94iepcno9qxll.gif" alt="java fuzzy outline" width="760" height="381"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Rename symbol
&lt;/h3&gt;

&lt;p&gt;After enable lsp layer for java, you can use &lt;code&gt;SPC l e&lt;/code&gt; to rename symbol under the cursor:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feprdft5h96oersupl4gm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feprdft5h96oersupl4gm.gif" alt="rename java symblo" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Javadoc hovers
&lt;/h3&gt;

&lt;p&gt;The default key binding to get doc of cursor symbol is &lt;code&gt;SPC l d&lt;/code&gt; or &lt;code&gt;K&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fts7rjhfepzb023yte5xm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fts7rjhfepzb023yte5xm.gif" alt="javadoc" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Syntax lint
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;checkers&lt;/code&gt; layer provides asynchronous linting feature, this layer use &lt;a href="https://github.com/neomake/neomake" rel="noopener noreferrer"&gt;neomake&lt;/a&gt; by default.&lt;br&gt;
neomake support maven, gradle and eclipse project. it will generate classpath automatically for these project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fry41qek16wc8yu7s4y4w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fry41qek16wc8yu7s4y4w.png" alt="lint-java" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;within above picture, we can see the checkers layer provides following feature:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;list errors and warnings in quickfix windows&lt;/li&gt;
&lt;li&gt;sign error and warning position on the left side&lt;/li&gt;
&lt;li&gt;show numbers of errors and warnings on statusline&lt;/li&gt;
&lt;li&gt;show cursor error and warning information below current line&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Import packages
&lt;/h3&gt;

&lt;p&gt;There are two kind features for importing packages, import packages automatically and manually. SpaceVim will import the packages after selecting the class name on popmenu.&lt;br&gt;
Also, you can use key binding &lt;code&gt;&amp;lt;F4&amp;gt;&lt;/code&gt; to import the class at the cursor point. If there are more than one class, a menu will be shown below current windows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff20ru21jklio1gsvsb07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff20ru21jklio1gsvsb07.png" alt="import class" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Jump to test file
&lt;/h3&gt;

&lt;p&gt;SpaceVim use vim-project to manager the files in a project, you can add a &lt;code&gt;.projections.json&lt;/code&gt; to the root of your project with following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"src/main/java/*.java"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"alternate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/test/java/{dirname}/Test{basename}.java"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"src/test/java/**/Test*.java"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"alternate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/main/java/{}.java"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with this configuration, you can jump between the source code and test file via command &lt;code&gt;:A&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjzoo7wam8re2wmujbdz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjzoo7wam8re2wmujbdz.gif" alt="jump-test" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  running code
&lt;/h3&gt;

&lt;p&gt;Base on JavaUnite, you can use &lt;code&gt;SPC l r c&lt;/code&gt; to run current function or use &lt;code&gt;SPC l r m&lt;/code&gt; to run the main function of current Class.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6vfw7ynz932ygl2q9j9j.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6vfw7ynz932ygl2q9j9j.gif" alt="run-main" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code formatting
&lt;/h3&gt;

&lt;p&gt;For formatting java code, you also nEed have &lt;a href="https://github.com/uncrustify/uncrustify" rel="noopener noreferrer"&gt;uncrustify&lt;/a&gt; or &lt;a href="http://astyle.sourceforge.net/" rel="noopener noreferrer"&gt;astyle&lt;/a&gt; in your PATH.&lt;br&gt;
BTW, the google's &lt;a href="https://github.com/google/google-java-format" rel="noopener noreferrer"&gt;java formatter&lt;/a&gt; also works well with neoformat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp7owgdhwwg48jufqjrxv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp7owgdhwwg48jufqjrxv.gif" alt="format-java" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  REPL
&lt;/h3&gt;

&lt;p&gt;you need to install jdk9 which provide a build-in tools &lt;code&gt;jshell&lt;/code&gt;, and SpaceVim use the &lt;code&gt;jshell&lt;/code&gt; as default inferior REPL process:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1zsb6xgyaqlc279fysa.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1zsb6xgyaqlc279fysa.gif" alt="REPl-JAVA" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>vim</category>
      <category>spacevim</category>
    </item>
    <item>
      <title>Use Vim as a C/C++ IDE</title>
      <dc:creator>Eric Wong</dc:creator>
      <pubDate>Fri, 10 May 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/wsdjeg/use-vim-as-a-c-c-ide-525j</link>
      <guid>https://dev.to/wsdjeg/use-vim-as-a-c-c-ide-525j</guid>
      <description>&lt;h1&gt;
  
  
  Use Vim as a C/C++ IDE
&lt;/h1&gt;

&lt;p&gt;This is a general guide for using SpaceVim as a C/C++ IDE, including layer configuration and usage. Each of the following sections will be covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable language layer&lt;/li&gt;
&lt;li&gt;code completion&lt;/li&gt;
&lt;li&gt;alternate file jumping&lt;/li&gt;
&lt;li&gt;code running&lt;/li&gt;
&lt;li&gt;code format&lt;/li&gt;
&lt;li&gt;REPL support
&amp;lt;!-- vim-markdown-toc --&amp;gt;
### Enable language layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To add C/C++ language support in SpaceVim, you need to enable the &lt;code&gt;lang#c&lt;/code&gt; layer. Press &lt;code&gt;SPC f v d&lt;/code&gt; to openSpaceVim configuration file, and add following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[[layers]]
  name = "lang#c"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for more info, you can read the &lt;a href="https://spacevim.org/layers/lang/c/" rel="noopener noreferrer"&gt;lang#c&lt;/a&gt; layer documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  code completion
&lt;/h3&gt;

&lt;p&gt;By default the autocomplete layer has been enabled, so after loading &lt;code&gt;lang#c&lt;/code&gt; layer, the code completionfor C/C++ language should works well.&lt;/p&gt;

&lt;h3&gt;
  
  
  alternate file jumping
&lt;/h3&gt;

&lt;p&gt;To manage the alternate file for a project, you may need to create a &lt;code&gt;.project_alt.json&lt;/code&gt; file in the root of yourproject.&lt;/p&gt;

&lt;p&gt;for exmaple, add following content into the &lt;code&gt;.project_alt.json&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "*.c": {"alternate": "{}.h"},
  "*.h": {"alternate": "{}.c"}
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with this configuration, you can jump between the alternate file via command &lt;code&gt;:A&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  code running
&lt;/h3&gt;

&lt;p&gt;The default code running key binding is &lt;code&gt;SPC l r&lt;/code&gt;. It will compile and run current file asynchronously.And the stdout will be shown on a runner buffer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3f8bph4ti93jj1ztavwd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3f8bph4ti93jj1ztavwd.png" alt="c-cpp-runner" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  code format
&lt;/h3&gt;

&lt;p&gt;The format layer use neoformat as default tool to format code, it will format current file.And the default key binding is &lt;code&gt;SPC b f&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[[layers]]
  name = "format"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  REPL support
&lt;/h3&gt;

&lt;p&gt;Start a &lt;code&gt;igcc&lt;/code&gt; inferior REPL process with &lt;code&gt;SPC l s i&lt;/code&gt;. After the REPL process being started, you cansend code to inferior process, all key bindings prefix with &lt;code&gt;SPC l s&lt;/code&gt;, including sending line, sending selection or evensend whole buffer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fka0g6a10v118t57to306.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fka0g6a10v118t57to306.png" alt="c_repl" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vim</category>
      <category>spacevim</category>
      <category>c</category>
      <category>cpp</category>
    </item>
    <item>
      <title>Use Vim as a PHP IDE</title>
      <dc:creator>Eric Wong</dc:creator>
      <pubDate>Wed, 08 May 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/wsdjeg/use-vim-as-a-php-ide-1k7i</link>
      <guid>https://dev.to/wsdjeg/use-vim-as-a-php-ide-1k7i</guid>
      <description>&lt;h1&gt;
  
  
  Use Vim as a PHP IDE
&lt;/h1&gt;

&lt;p&gt;This is a general guide for using SpaceVim as a PHP IDE, including layer configuration and usage. Each of the following sections will be covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable language layer&lt;/li&gt;
&lt;li&gt;Code completion&lt;/li&gt;
&lt;li&gt;Syntax linting&lt;/li&gt;
&lt;li&gt;Jump to test file&lt;/li&gt;
&lt;li&gt;running code&lt;/li&gt;
&lt;li&gt;Code formatting&lt;/li&gt;
&lt;li&gt;REPL support
&amp;lt;!-- vim-markdown-toc --&amp;gt;
### Enable language layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To add PHP language support in SpaceVim, you need to enable the &lt;code&gt;lang#php&lt;/code&gt; layer. Press &lt;code&gt;SPC f v d&lt;/code&gt; to openSpaceVim configuration file, and add the following snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[[layers]]
  name = "lang#php"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more info, you can read the &lt;a href="https://spacevim.org/layers/lang/php/" rel="noopener noreferrer"&gt;lang#php&lt;/a&gt; layer documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code completion
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;lang#php&lt;/code&gt; layer will load the PHP plugin automatically, unless it’s overriden in your &lt;code&gt;init.toml&lt;/code&gt;.The completion menu will be opened as you type.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqyhea4kc06mcrh92fn9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqyhea4kc06mcrh92fn9k.png" alt="phpide" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Syntax linting
&lt;/h3&gt;

&lt;p&gt;The checkers layer is enabled by default. This layer provides asynchronous syntax linting via &lt;a href="https://github.com/neomake/neomake" rel="noopener noreferrer"&gt;neomake&lt;/a&gt;.It will run &lt;a href="https://github.com/vimeo/psalm" rel="noopener noreferrer"&gt;psalm&lt;/a&gt; asynchronously.&lt;/p&gt;

&lt;p&gt;To install psalm, you may need to run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer require --dev vimeo/psalm

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Jump to test file
&lt;/h3&gt;

&lt;p&gt;To manage the alternate file for a project, you may need to create a &lt;code&gt;.project_alt.json&lt;/code&gt; file in the root of yourproject.&lt;/p&gt;

&lt;p&gt;for exmaple, add following content into the &lt;code&gt;.project_alt.json&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "src/*.php": {"alternate": "test/{}.php"},
  "test/*.php": {"alternate": "src/{}.php"}
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with this configuration, you can jump between the source code and test file via command &lt;code&gt;:A&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  running code
&lt;/h3&gt;

&lt;p&gt;To run current script, you can press &lt;code&gt;SPC l r&lt;/code&gt;, and a split windowwill be openen, the output of the script will be shown in this window.It is running asynchronously, and will not block your Vim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjiyd2cjg2r6dhib7tqha.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjiyd2cjg2r6dhib7tqha.gif" alt="phpcoderunner" width="799" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code formatting
&lt;/h3&gt;

&lt;p&gt;The format layer is also enabled by default. With this layer you can use key binding &lt;code&gt;SPC b f&lt;/code&gt; to format current buffer.Before using this feature, please install php_beautifier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pear install PHP_Beautifier

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  REPL support
&lt;/h3&gt;

&lt;p&gt;Start a &lt;code&gt;php -a&lt;/code&gt; inferior REPL process with &lt;code&gt;SPC l s i&lt;/code&gt;. After the REPL process being started, you cansend code to inferior process. All key bindings prefix with &lt;code&gt;SPC l s&lt;/code&gt;, including sending line, sending selection or evensend whole buffer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2n3lbw27qeahh75ilrz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2n3lbw27qeahh75ilrz.gif" alt="phprepl" width="799" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>vim</category>
      <category>spacevim</category>
    </item>
    <item>
      <title>Use Vim as a Ruby IDE</title>
      <dc:creator>Eric Wong</dc:creator>
      <pubDate>Mon, 18 Feb 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/wsdjeg/use-vim-as-a-ruby-ide-2og5</link>
      <guid>https://dev.to/wsdjeg/use-vim-as-a-ruby-ide-2og5</guid>
      <description>&lt;h1&gt;
  
  
  Use Vim as a Ruby IDE
&lt;/h1&gt;

&lt;p&gt;This is a general guide for using SpaceVim as a Ruby IDE, including layer configuration and usage.Each of the following sections will be covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable language layer&lt;/li&gt;
&lt;li&gt;Code completion&lt;/li&gt;
&lt;li&gt;Syntax linting&lt;/li&gt;
&lt;li&gt;Jump to test file&lt;/li&gt;
&lt;li&gt;running code&lt;/li&gt;
&lt;li&gt;Code formatting&lt;/li&gt;
&lt;li&gt;REPL support
&amp;lt;!-- vim-markdown-toc --&amp;gt;
### Enable language layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To add Ruby language support in SpaceVim, you need to enable the &lt;code&gt;lang#ruby&lt;/code&gt; layer. Press &lt;code&gt;SPC f v d&lt;/code&gt; to openSpaceVim configuration file, and add the following snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[[layers]]
  name = "lang#ruby"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more info, you can read the &lt;a href="https://spacevim.org/layers/lang/ruby/" rel="noopener noreferrer"&gt;lang#ruby&lt;/a&gt; layer documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code completion
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;lang#ruby&lt;/code&gt; layer will load the Ruby plugin automatically, unless it’s overriden in your &lt;code&gt;init.toml&lt;/code&gt;.The completion menu will be opened as you type.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwn9p9h1961n3lkct9kdr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwn9p9h1961n3lkct9kdr.png" alt="rubycomplete" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Syntax linting
&lt;/h3&gt;

&lt;p&gt;The checkers layer is enabled by default. This layer provides asynchronous syntax linting via &lt;a href="https://github.com/neomake/neomake" rel="noopener noreferrer"&gt;neomake&lt;/a&gt;.It will run rubocop asynchronously.&lt;/p&gt;

&lt;p&gt;Install rubocop via gem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gem install rubocop

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx34p4j3hc1489s997r30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx34p4j3hc1489s997r30.png" alt="rubylint" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Jump to test file
&lt;/h3&gt;

&lt;p&gt;SpaceVim use built-in plugin to manager the files in a project, you can add a &lt;code&gt;.project_alt.json&lt;/code&gt; to the root of your project with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "src/*.rb": {"alternate": "test/{}.rb"},
  "test/*.rb": {"alternate": "src/{}.rb"}
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this configuration, you can jump between the source code and test file via command &lt;code&gt;:A&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  running code
&lt;/h3&gt;

&lt;p&gt;To run current script, you can press &lt;code&gt;SPC l r&lt;/code&gt;, and a split windowwill be openen, the output of the script will be shown in this window.It is running asynchronously, and will not block your Vim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwce8naxuq1kz2vm8qzpd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwce8naxuq1kz2vm8qzpd.gif" alt="rubyrunner" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code formatting
&lt;/h3&gt;

&lt;p&gt;The format layer is also enabled by default. With this layer you can use key binding &lt;code&gt;SPC b f&lt;/code&gt; to format current buffer.Before using this feature, please install rufo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gem install rufo

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8r7y5t6opjoecmj805af.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8r7y5t6opjoecmj805af.gif" alt="formatruby" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  REPL support
&lt;/h3&gt;

&lt;p&gt;Start a &lt;code&gt;irb&lt;/code&gt; inferior REPL process with &lt;code&gt;SPC l s i&lt;/code&gt;. After the REPL process being started, you cansend code to inferior process. All key bindings prefix with &lt;code&gt;SPC l s&lt;/code&gt;, including sending line, sending selection or evensend whole buffer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu92ygjsu0i5opt671qnv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu92ygjsu0i5opt671qnv.gif" alt="rubyrepl" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>vim</category>
      <category>spacevim</category>
    </item>
    <item>
      <title>Use Vim as a Perl IDE</title>
      <dc:creator>Eric Wong</dc:creator>
      <pubDate>Tue, 12 Feb 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/wsdjeg/use-vim-as-a-perl-ide-23ph</link>
      <guid>https://dev.to/wsdjeg/use-vim-as-a-perl-ide-23ph</guid>
      <description>&lt;h1&gt;
  
  
  Use Vim as a Perl IDE
&lt;/h1&gt;

&lt;p&gt;This is a general guide for using SpaceVim as a perl IDE, including layer configuration and usage. Each of the following sections will be covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable language layer&lt;/li&gt;
&lt;li&gt;Code completion&lt;/li&gt;
&lt;li&gt;Syntax linting&lt;/li&gt;
&lt;li&gt;Jump to test file&lt;/li&gt;
&lt;li&gt;running code&lt;/li&gt;
&lt;li&gt;Code formatting&lt;/li&gt;
&lt;li&gt;REPL support
&amp;lt;!-- vim-markdown-toc --&amp;gt;
### Enable language layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To add perl language support in SpaceVim, you need to enable the &lt;code&gt;lang#perl&lt;/code&gt; layer. Press &lt;code&gt;SPC f v d&lt;/code&gt; to openSpaceVim configuration file, and add following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[[layers]]
  name = "lang#perl"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for more info, you can read the &lt;a href="https://spacevim.org/layers/lang/perl/" rel="noopener noreferrer"&gt;lang#perl&lt;/a&gt; layer documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code completion
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;lang#perl&lt;/code&gt; layer will load the perl plugin automatically, unless overriden in your &lt;code&gt;init.toml&lt;/code&gt;.The completion menu will be opened as you type.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa644fbmaf2sqzl0r8sxb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa644fbmaf2sqzl0r8sxb.png" alt="perlcomplete" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Syntax linting
&lt;/h3&gt;

&lt;p&gt;The checkers layer is enabled by default. This layer provides asynchronous syntax linting via &lt;a href="https://github.com/neomake/neomake" rel="noopener noreferrer"&gt;neomake&lt;/a&gt;.It will run perl and perlcritic asynchronously.&lt;/p&gt;

&lt;p&gt;Install perlcritic via cpan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cpanm Perl::Critic

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hrjqasexwdttsjn357r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hrjqasexwdttsjn357r.png" alt="perllint" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Jump to test file
&lt;/h3&gt;

&lt;p&gt;SpaceVim use built-in plugin to manager the files in a project, you can add a &lt;code&gt;.project_alt.json&lt;/code&gt; to the root of your project with following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "src/*.pl": {"alternate": "test/{}.pl"},
  "test/*.pl": {"alternate": "src/{}.pl"}
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with this configuration, you can jump between the source code and test file via command &lt;code&gt;:A&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  running code
&lt;/h3&gt;

&lt;p&gt;To run current script, you can press &lt;code&gt;SPC l r&lt;/code&gt;, and a split windowswill be openen, the output of the script will be shown in this windows.It is running asynchronously, and will not block your vim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmeib8loyuntbaefnwmcl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmeib8loyuntbaefnwmcl.png" alt="perlrunner" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code formatting
&lt;/h3&gt;

&lt;p&gt;The format layer is also enabled by default, with this layer you can use key binding &lt;code&gt;SPC b f&lt;/code&gt; to format current buffer.Before using this feature, please install perltidy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cpanm Perl::Tidy

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  REPL support
&lt;/h3&gt;

&lt;p&gt;Start a &lt;code&gt;perli&lt;/code&gt; or &lt;code&gt;perl -del&lt;/code&gt; inferior REPL process with &lt;code&gt;SPC l s i&lt;/code&gt;. After the REPL process has been started. you can send code to inferior process, all key bindings are begin with &lt;code&gt;SPC l s&lt;/code&gt; prefix, including sending line, sending selection or evensend whole buffer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgscql9r8rwjjyg7v7g4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgscql9r8rwjjyg7v7g4.gif" alt="perlrepl" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Use Vim as a CoffeeScript IDE</title>
      <dc:creator>Eric Wong</dc:creator>
      <pubDate>Mon, 28 Jan 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/wsdjeg/use-vim-as-a-coffeescript-ide-4afl</link>
      <guid>https://dev.to/wsdjeg/use-vim-as-a-coffeescript-ide-4afl</guid>
      <description>&lt;h1&gt;
  
  
  &lt;a href="//../blog/"&gt;Blogs&lt;/a&gt; » Use Vim as a CoffeeScript IDE
&lt;/h1&gt;

&lt;p&gt;This is a general guide for using SpaceVim as a &lt;a href="https://coffeescript.org/" rel="noopener noreferrer"&gt;CoffeeScript&lt;/a&gt; IDE, including layer configuration and usage. Each of the following sections will be covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable language layer&lt;/li&gt;
&lt;li&gt;Code completion&lt;/li&gt;
&lt;li&gt;Syntax linting&lt;/li&gt;
&lt;li&gt;Jump to test file&lt;/li&gt;
&lt;li&gt;running code&lt;/li&gt;
&lt;li&gt;Code formatting
&amp;lt;!-- vim-markdown-toc --&amp;gt;
### Enable language layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By default &lt;code&gt;lang#coffeescript&lt;/code&gt; layer is not loaded. To add CoffeeScript language support in SpaceVim,you need to enable the &lt;code&gt;lang#coffeescript&lt;/code&gt; layer. Press &lt;code&gt;SPC f v d&lt;/code&gt; to openSpaceVim configuration file, and add following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[[layers]]
  name = "lang#coffeescript"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for more info, you can read the &lt;a href="//../layers/lang/coffeescript/"&gt;lang#coffeescript&lt;/a&gt; layer documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code completion
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;lang#coffeescript&lt;/code&gt; layer will load the vim-coffeescript plugin automatically, unless overriden in your &lt;code&gt;init.toml&lt;/code&gt;.The completion menu will be opened as you type.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj57prd4nhtaw2be7seot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj57prd4nhtaw2be7seot.png" alt="coffeeide" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Syntax linting
&lt;/h3&gt;

&lt;p&gt;The checkers layer is enabled by default. This layer provides asynchronous syntax linting via &lt;a href="https://github.com/neomake/neomake" rel="noopener noreferrer"&gt;neomake&lt;/a&gt;.It will run &lt;a href="https://github.com/clutchski/coffeelint" rel="noopener noreferrer"&gt;coffeelint&lt;/a&gt; asynchronously.&lt;/p&gt;

&lt;p&gt;The coffeelint is command line lint for coffeescript, currently is maintained by &lt;a href="https://github.com/swang" rel="noopener noreferrer"&gt;Shuan Wang&lt;/a&gt;.To install coffeelint, just run following command in terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g coffeelint

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: if no coffeelint is installed, neomake will ues default command &lt;code&gt;coffee&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F03sye1u5uyfzbm6sw23i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F03sye1u5uyfzbm6sw23i.png" alt="coffeecheckers" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Jump to test file
&lt;/h3&gt;

&lt;p&gt;SpaceVim use built-in plugin to manager the files in a project,you can add a &lt;code&gt;.project_alt.json&lt;/code&gt; to the root of your project with following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "src/*.coffee": {"alternate": "test/{}.coffee"},
  "test/*.coffee": {"alternate": "src/{}.coffee"}
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with this configuration, you can jump between the source code and test file via command &lt;code&gt;:A&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  running code
&lt;/h3&gt;

&lt;p&gt;To run current script, you can press &lt;code&gt;SPC l r&lt;/code&gt;, and a split windowswill be openen, the output of the script will be shown in this windows.It is running asynchronously, and will not block your vim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxnc0960p293u3cd0dzsf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxnc0960p293u3cd0dzsf.png" alt="coffeerunner" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code formatting
&lt;/h3&gt;

&lt;p&gt;The format layer is also enabled by default, with this layer you can use key binding &lt;code&gt;SPC b f&lt;/code&gt; to format current buffer.Before using this feature, please install coffee-fmt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g coffee-fmt

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Use Vim as a Python IDE</title>
      <dc:creator>Eric Wong</dc:creator>
      <pubDate>Thu, 27 Sep 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/wsdjeg/use-vim-as-a-python-ide-59n3</link>
      <guid>https://dev.to/wsdjeg/use-vim-as-a-python-ide-59n3</guid>
      <description>&lt;h1&gt;
  
  
  Use Vim as a Python IDE
&lt;/h1&gt;

&lt;p&gt;This is a general guide for using SpaceVim as a python IDE, including layer configuration and usage. Each of the following sections will be covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable language layer&lt;/li&gt;
&lt;li&gt;Code completion&lt;/li&gt;
&lt;li&gt;Syntax lint&lt;/li&gt;
&lt;li&gt;Import packages&lt;/li&gt;
&lt;li&gt;Jump to test file&lt;/li&gt;
&lt;li&gt;running code&lt;/li&gt;
&lt;li&gt;Code formatting&lt;/li&gt;
&lt;li&gt;REPL&lt;/li&gt;
&lt;li&gt;Debug
&amp;lt;!-- vim-markdown-toc --&amp;gt;
### Enable language layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To add python language support in SpaceVim, you need to enable &lt;code&gt;lang#python&lt;/code&gt; layer. Just press &lt;code&gt;SPC f v d&lt;/code&gt; to openSpaceVim configuration file, and add following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[[layers]]
  name = "lang#python"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for more info, you can read the &lt;a href="https://spacevim.org/layers/lang/python/" rel="noopener noreferrer"&gt;lang#python&lt;/a&gt; layer documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code completion
&lt;/h3&gt;

&lt;p&gt;Base on which completion engine is used, &lt;code&gt;lang#python&lt;/code&gt; layer load the jedi plugin automatically.The completion menu will be opened as you type.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3qaulsq23y3dx9f7jv0s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3qaulsq23y3dx9f7jv0s.png" alt="complete python code" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Syntax lint
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/neomake/neomake" rel="noopener noreferrer"&gt;neomake&lt;/a&gt; - Asynchronous linting and make framework for Neovim/Vim&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I am maintainer of javac maker in neomake, the javac maker support maven project, gradle project or eclipse project.also you can set the classpath.&lt;/p&gt;

&lt;h3&gt;
  
  
  Import packages
&lt;/h3&gt;

&lt;p&gt;When edit python file, you can import the package automatically, remove unused package and format package list.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install --user isort

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Jump to test file
&lt;/h3&gt;

&lt;p&gt;SpaceVim use vim-project to manager the files in a project, you can add a &lt;code&gt;.projections.json&lt;/code&gt; to the root of your project with following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "src/*.py": {"alternate": "test/{dirname}/{basename}Test.py"},
  "test/**/Test*.py": {"alternate": "src/{}.py"}
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with this configuration, you can jump between the source code and test file via command &lt;code&gt;:A&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  running code
&lt;/h3&gt;

&lt;p&gt;To run current script, you can press &lt;code&gt;SPC l r&lt;/code&gt;, and a split windowswill be openen, the output of the script will be shown in this windows.It is running asynchronously, and will not block your vim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fouxkn3hdb5vyfbq1e1ph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fouxkn3hdb5vyfbq1e1ph.png" alt="code runner" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code formatting
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/sbdchd/neoformat" rel="noopener noreferrer"&gt;neoformat&lt;/a&gt; - A (Neo)vim plugin for formatting code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For formatting java code, you also nEed have &lt;a href="http://astyle.sourceforge.net/" rel="noopener noreferrer"&gt;uncrustify&lt;/a&gt; or &lt;a href="http://astyle.sourceforge.net/" rel="noopener noreferrer"&gt;astyle&lt;/a&gt; in your PATH.BTW, the google’s &lt;a href="https://github.com/google/google-java-format" rel="noopener noreferrer"&gt;java formatter&lt;/a&gt; also works well with neoformat.&lt;/p&gt;

&lt;h3&gt;
  
  
  REPL
&lt;/h3&gt;

&lt;p&gt;you need to install jdk9 which provide a build-in tools &lt;code&gt;jshell&lt;/code&gt;, and SpaceVim use the &lt;code&gt;jshell&lt;/code&gt; as default inferior REPL process:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1zsb6xgyaqlc279fysa.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1zsb6xgyaqlc279fysa.gif" alt="REPl-JAVA" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Debug
&lt;/h3&gt;

</description>
      <category>python</category>
      <category>vim</category>
      <category>spacevim</category>
    </item>
    <item>
      <title>Grep on the fly in SpaceVim</title>
      <dc:creator>Eric Wong</dc:creator>
      <pubDate>Tue, 23 Jan 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/wsdjeg/grep-on-the-fly-in-spacevim-5aep</link>
      <guid>https://dev.to/wsdjeg/grep-on-the-fly-in-spacevim-5aep</guid>
      <description>&lt;h1&gt;
  
  
  Asynchronous grep on the fly
&lt;/h1&gt;

&lt;p&gt;FlyGrep means &lt;strong&gt;grep on the fly&lt;/strong&gt; , it will update the result as you type. Of course, it is runningasynchronously. Before using this feature, you need to install a searching tool. FlyGrep worksthrough search tools: &lt;code&gt;ag&lt;/code&gt;, &lt;code&gt;rg&lt;/code&gt;, &lt;code&gt;ack&lt;/code&gt;, &lt;code&gt;pt&lt;/code&gt; and &lt;code&gt;grep&lt;/code&gt;, Choose one you like.&lt;/p&gt;

&lt;p&gt;This ia a built-in plugin in SpaceVim, and we also separated a plugin : &lt;a href="https://github.com/wsdjeg/FlyGrep.vim" rel="noopener noreferrer"&gt;FlyGrep.vim&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search in a project&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In SpaceVim, you can use &lt;code&gt;SPC s p&lt;/code&gt; or &lt;code&gt;SPC s /&lt;/code&gt; to search in the current project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7p0v624wpc9xcnmsjhb.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7p0v624wpc9xcnmsjhb.gif" alt="searching project" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search in current file&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can use &lt;code&gt;SPC s s&lt;/code&gt; to search in the current file. To search word under the cursor, you can press &lt;code&gt;SPC s S&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2v8snplrkxm8t9wkjxrk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2v8snplrkxm8t9wkjxrk.gif" alt="searching current file" width="759" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search in all loaded buffers&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To searching in all loaded buffers, you need to press &lt;code&gt;SPC s b&lt;/code&gt;, and you can also use &lt;code&gt;SPC s B&lt;/code&gt; to search word under the point.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fatkq7lukh3kgap9iazm5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fatkq7lukh3kgap9iazm5.gif" alt="searching-loaded-buffer" width="759" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search in an arbitrary directory&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to searching in a different directory instead of current directory, you canuse &lt;code&gt;SPC s f&lt;/code&gt;. Then insert the path of the arbitrary directory.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search in a project in the background&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need background searching, you can press &lt;code&gt;SPC s j&lt;/code&gt;, after searching is done, the index will be displayed on statusline. you can use &lt;code&gt;SPC s l&lt;/code&gt; to list all the search results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key bindings
&lt;/h2&gt;

&lt;p&gt;The search commands in SpaceVim are organized under the &lt;code&gt;SPC s&lt;/code&gt; prefix with the next key is the tool to use and the last key is the scope. For instance &lt;code&gt;SPC s a b&lt;/code&gt; will search in all opened buffers using &lt;code&gt;ag&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If the last key (determining the scope) is uppercase then the current word under the cursor is used as default input for the search. For instance &lt;code&gt;SPC s a B&lt;/code&gt; will search with word under cursor.&lt;/p&gt;

&lt;p&gt;If the tool key is omitted then a default tool will be automatically selected for the search. This tool corresponds to the first tool found on the system of the list &lt;code&gt;g:spacevim_search_tools&lt;/code&gt;, the default calling sequence is &lt;code&gt;rg&lt;/code&gt;, &lt;code&gt;ag&lt;/code&gt;, &lt;code&gt;pt&lt;/code&gt;, &lt;code&gt;ack&lt;/code&gt; then &lt;code&gt;grep&lt;/code&gt;. For instance &lt;code&gt;SPC s b&lt;/code&gt; will search in the opened buffers using &lt;code&gt;pt&lt;/code&gt; if &lt;code&gt;rg&lt;/code&gt; and &lt;code&gt;ag&lt;/code&gt; have not been found on the system.&lt;/p&gt;

&lt;p&gt;The tool keys are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ag&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grep&lt;/td&gt;
&lt;td&gt;g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ack&lt;/td&gt;
&lt;td&gt;k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rg&lt;/td&gt;
&lt;td&gt;r&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pt&lt;/td&gt;
&lt;td&gt;t&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The available scopes and corresponding keys are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;opened buffers&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;files in a given directory&lt;/td&gt;
&lt;td&gt;f&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;current project&lt;/td&gt;
&lt;td&gt;p&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Within FlyGrep buffer:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key Binding&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Esc&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;close FlyGrep buffer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Enter&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;open file at the cursor line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Tab&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;move cursor line down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;C-j&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;move cursor line down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;S-Tab&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;move cursor line up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;C-k&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;move cursor line up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Bs&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;remove last character&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;C-w&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;remove the word before the cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;C-u&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;remove the line before the cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;C-k&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;remove the line after the cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;C-a&amp;gt;&lt;/code&gt;/&lt;code&gt;&amp;lt;Home&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Go to the beginning of the line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;C-e&amp;gt;&lt;/code&gt;/&lt;code&gt;&amp;lt;End&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Go to the end of the line&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
    </item>
  </channel>
</rss>
