<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-28 --> <p>Vim remains one of the most powerful and efficient text editors, favored by developers who value modal editing, extensive customization, and terminal-based workflows. The Geode GQL plugin for Vim brings comprehensive graph database development support including syntax highlighting, intelligent omni-completion, query execution, linting integration, and seamless workflow tools.</p> <p>While Neovim users may prefer the native LSP integration, classic Vim users can achieve excellent GQL development experiences through the Geode Vim plugin, which provides syntax files, filetype detection, omnicompletion via external tools, ALE linter integration, and convenient commands for query execution.</p> <p>This guide covers installation, configuration, features, key mappings, integration with popular Vim plugins, and best practices for productive GQL development in Vim.</p> <h3 id="installation" class="position-relative d-flex align-items-center group"> <span>Installation</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="installation" aria-haspopup="dialog" aria-label="Share link: Installation"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden> <div class="hsm-dialog" role="document"> <div class="hsm-header"> <h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2> <button type="button" class="hsm-close" aria-label="Close"> <i class="fa-solid fa-xmark"></i> </button> </div> <div class="hsm-body"> <label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label> <div class="input-group mb-4 hsm-url-group"> <input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" /> <button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy"> <i class="fa-duotone fa-clipboard" aria-hidden="true"></i> </button> </div> <div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div> <div class="hsm-share-grid"> <a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-twitter me-2"></i>Twitter </a> <a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-linkedin me-2"></i>LinkedIn </a> <a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-facebook me-2"></i>Facebook </a> </div> </div> </div> </div> <style> .heading-share-modal { position: fixed; inset: 0; display: flex; justify-content: center; align-items: center; background: rgba(0, 0, 0, 0.6); z-index: 1050; padding: 1rem; backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); } .heading-share-modal[hidden] { display: none !important; } .hsm-dialog { max-width: 420px; width: 100%; background: var(--bs-body-bg, #fff); color: var(--bs-body-color, #212529); border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); border-radius: 1rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); overflow: hidden; animation: hsm-fade-in 0.2s ease-out; } @keyframes hsm-fade-in { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } [data-bs-theme="dark"] .hsm-dialog { background: #1e293b; border-color: rgba(255,255,255,0.1); color: #f8f9fa; } .hsm-header { display: flex; justify-content: space-between; align-items: center; padding: 1rem 1.5rem; border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); background: rgba(0,0,0,0.02); } [data-bs-theme="dark"] .hsm-header { background: rgba(255,255,255,0.02); border-color: rgba(255,255,255,0.1); } .hsm-close { background: transparent; border: none; color: inherit; opacity: 0.5; padding: 0.25rem 0.5rem; border-radius: 0.25rem; font-size: 1.2rem; line-height: 1; transition: opacity 0.2s; } .hsm-close:hover { opacity: 1; } .hsm-body { padding: 1.5rem; } .hsm-url-group { display: flex !important; align-items: stretch; } .hsm-url-group .form-control { flex: 1; min-width: 0; margin: 0; background: var(--bs-secondary-bg, #f8f9fa); border-color: var(--bs-border-color, #dee2e6); border-top-right-radius: 0; border-bottom-right-radius: 0; height: 42px; } .hsm-url-group .btn { flex: 0 0 auto; margin: 0; margin-left: -1px; border-top-left-radius: 0; border-bottom-left-radius: 0; height: 42px; display: flex; align-items: center; justify-content: center; padding: 0 1.25rem; z-index: 2; } [data-bs-theme="dark"] .hsm-url-group .form-control { background: #0f172a; border-color: #334155; color: #e2e8f0; } .hsm-share-grid { display: flex; flex-direction: column; gap: 0.5rem; } .hsm-share-grid .btn { display: flex; align-items: center; justify-content: center; font-size: 0.9rem; padding: 0.6rem; border-color: var(--bs-border-color); width: 100%; } [data-bs-theme="dark"] .hsm-share-grid .btn { color: #e2e8f0; border-color: #475569; } [data-bs-theme="dark"] .hsm-share-grid .btn:hover { background: #334155; border-color: #cbd5e1; } </style> <script> (function(){ const modal = document.getElementById('headingShareModal'); if(!modal) return; const input = modal.querySelector('#headingShareInput'); const copyBtn = modal.querySelector('.hsm-copy'); const twitter = modal.querySelector('#share-twitter'); const linkedin = modal.querySelector('#share-linkedin'); const facebook = modal.querySelector('#share-facebook'); const closeBtn = modal.querySelector('.hsm-close'); let lastFocus=null; let trapBound=false; function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; } function isOpen(){ return !modal.hasAttribute('hidden'); } function hydrate(id){ const url=buildUrl(id); input.value=url; const enc=encodeURIComponent(url); const text=encodeURIComponent(document.title); if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`; if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`; if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`; } function openModal(id){ lastFocus=document.activeElement; hydrate(id); if(!isOpen()){ modal.removeAttribute('hidden'); } requestAnimationFrame(()=>{ input.focus(); }); trapFocus(); } function closeModal(){ if(!isOpen()) return; modal.setAttribute('hidden',''); if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus(); } function copyCurrent(){ try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); } catch(e){ fallback(); } } function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} } function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); } function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); } function bindShareButtons(){ document.querySelectorAll('.h-share').forEach(btn=>{ if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; } }); } bindShareButtons(); if(document.readyState==='loading'){ document.addEventListener('DOMContentLoaded', bindShareButtons); } else { requestAnimationFrame(bindShareButtons); } document.addEventListener('click', function(e){ const shareBtn=e.target.closest && e.target.closest('.h-share'); if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); } }, true); document.addEventListener('click', e=>{ if(e.target===modal) closeModal(); if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); } if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); } }); document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); }); function trapFocus(){ if(trapBound) return; trapBound=true; modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } }); } if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); }); })(); </script> <h4 id="prerequisites" class="position-relative d-flex align-items-center group"> <span>Prerequisites</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="prerequisites" aria-haspopup="dialog" aria-label="Share link: Prerequisites"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Ensure you have the following installed:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Vim 8.0+ required (or Vim 7.4 with patches)</span> </span></span><span class="line"><span class="cl">vim --version <span class="p">|</span> head -1 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Geode CLI must be in PATH</span> </span></span><span class="line"><span class="cl">which geode </span></span><span class="line"><span class="cl">geode --version </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Optional: ctags for tag generation</span> </span></span><span class="line"><span class="cl">which ctags </span></span></code></pre></div> <h4 id="using-vim-plug" class="position-relative d-flex align-items-center group"> <span>Using vim-plug</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="using-vim-plug" aria-haspopup="dialog" aria-label="Share link: Using vim-plug"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>The most popular Vim plugin manager:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; ~/.vimrc</span> </span></span><span class="line"><span class="cl"><span class="nx">call</span> <span class="nx">plug</span>#<span class="nx">begin</span><span class="p">(</span><span class="s1">&#39;~/.vim/plugged&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Geode GQL plugin</span> </span></span><span class="line"><span class="cl"><span class="nx">Plug</span> <span class="s1">&#39;geodedb/vim-geode-gql&#39;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Recommended companion plugins</span> </span></span><span class="line"><span class="cl"><span class="nx">Plug</span> <span class="s1">&#39;dense-analysis/ale&#39;</span> <span class="c">&#34; Async linting</span> </span></span><span class="line"><span class="cl"><span class="nx">Plug</span> <span class="s1">&#39;prabirshrestha/vim-lsp&#39;</span> <span class="c">&#34; LSP support (optional)</span> </span></span><span class="line"><span class="cl"><span class="nx">Plug</span> <span class="s1">&#39;prabirshrestha/asyncomplete.vim&#39;</span> <span class="c">&#34; Async completion</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nx">call</span> <span class="nx">plug</span>#<span class="nx">end</span><span class="p">()</span> </span></span></code></pre></div><p>Install plugins:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="p">:</span><span class="nx">PlugInstall</span> </span></span></code></pre></div> <h4 id="using-vundle" class="position-relative d-flex align-items-center group"> <span>Using Vundle</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="using-vundle" aria-haspopup="dialog" aria-label="Share link: Using Vundle"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; ~/.vimrc</span> </span></span><span class="line"><span class="cl"><span class="k">set</span> <span class="nx">nocompatible</span> </span></span><span class="line"><span class="cl"><span class="k">filetype</span> <span class="nx">off</span> </span></span><span class="line"><span class="cl"><span class="k">set</span> <span class="nx">rtp</span><span class="p">+=~</span><span class="sr">/.vim/</span><span class="nx">bundle</span>/<span class="nx">Vundle</span>.<span class="nx">vim</span> </span></span><span class="line"><span class="cl"><span class="nx">call</span> <span class="nx">vundle</span>#<span class="nx">begin</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nx">Plugin</span> <span class="s1">&#39;VundleVim/Vundle.vim&#39;</span> </span></span><span class="line"><span class="cl"><span class="nx">Plugin</span> <span class="s1">&#39;geodedb/vim-geode-gql&#39;</span> </span></span><span class="line"><span class="cl"><span class="nx">Plugin</span> <span class="s1">&#39;dense-analysis/ale&#39;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nx">call</span> <span class="nx">vundle</span>#<span class="nx">end</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="k">filetype</span> <span class="nx">plugin</span> <span class="nx">indent</span> <span class="nx">on</span> </span></span></code></pre></div><p>Install:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="p">:</span><span class="nx">PluginInstall</span> </span></span></code></pre></div> <h4 id="using-pathogen" class="position-relative d-flex align-items-center group"> <span>Using Pathogen</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="using-pathogen" aria-haspopup="dialog" aria-label="Share link: Using Pathogen"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Clone to bundle directory</span> </span></span><span class="line"><span class="cl"><span class="nb">cd</span> ~/.vim/bundle </span></span><span class="line"><span class="cl">git clone https://github.com/geodedb/vim-geode-gql.git </span></span></code></pre></div> <h4 id="using-native-vim-packages-vim-8" class="position-relative d-flex align-items-center group"> <span>Using Native Vim Packages (Vim 8&#43;)</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="using-native-vim-packages-vim-8" aria-haspopup="dialog" aria-label="Share link: Using Native Vim Packages (Vim 8&amp;#43;)"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Create pack directory</span> </span></span><span class="line"><span class="cl">mkdir -p ~/.vim/pack/geode/start </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Clone plugin</span> </span></span><span class="line"><span class="cl">git clone https://github.com/geodedb/vim-geode-gql.git <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> ~/.vim/pack/geode/start/vim-geode-gql </span></span></code></pre></div> <h4 id="manual-installation" class="position-relative d-flex align-items-center group"> <span>Manual Installation</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="manual-installation" aria-haspopup="dialog" aria-label="Share link: Manual Installation"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Download and extract</span> </span></span><span class="line"><span class="cl">curl -LO https://github.com/geodedb/vim-geode-gql/archive/main.tar.gz </span></span><span class="line"><span class="cl">tar xzf main.tar.gz </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Copy files</span> </span></span><span class="line"><span class="cl">cp -r vim-geode-gql-main/syntax/* ~/.vim/syntax/ </span></span><span class="line"><span class="cl">cp -r vim-geode-gql-main/ftplugin/* ~/.vim/ftplugin/ </span></span><span class="line"><span class="cl">cp -r vim-geode-gql-main/ftdetect/* ~/.vim/ftdetect/ </span></span><span class="line"><span class="cl">cp -r vim-geode-gql-main/autoload/* ~/.vim/autoload/ </span></span><span class="line"><span class="cl">cp -r vim-geode-gql-main/plugin/* ~/.vim/plugin/ </span></span></code></pre></div> <h3 id="configuration" class="position-relative d-flex align-items-center group"> <span>Configuration</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="configuration" aria-haspopup="dialog" aria-label="Share link: Configuration"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="basic-setup" class="position-relative d-flex align-items-center group"> <span>Basic Setup</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="basic-setup" aria-haspopup="dialog" aria-label="Share link: Basic Setup"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Add to your <code>.vimrc</code>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; ~/.vimrc</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Enable file type detection and plugins</span> </span></span><span class="line"><span class="cl"><span class="k">filetype</span> <span class="nx">plugin</span> <span class="nx">indent</span> <span class="nx">on</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">on</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Geode GQL configuration</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_server_host</span> <span class="p">=</span> <span class="s1">&#39;localhost&#39;</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_server_port</span> <span class="p">=</span> <span class="m">3141</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_default_database</span> <span class="p">=</span> <span class="s1">&#39;default&#39;</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_auto_connect</span> <span class="p">=</span> <span class="m">1</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Query execution settings</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_execution_timeout</span> <span class="p">=</span> <span class="m">30000</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_max_rows</span> <span class="p">=</span> <span class="m">1000</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_auto_commit</span> <span class="p">=</span> <span class="m">0</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Formatting settings</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_format_on_save</span> <span class="p">=</span> <span class="m">1</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_keyword_case</span> <span class="p">=</span> <span class="s1">&#39;UPPER&#39;</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_indent_size</span> <span class="p">=</span> <span class="m">2</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Results display</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_results_position</span> <span class="p">=</span> <span class="s1">&#39;bottom&#39;</span> <span class="c">&#34; bottom, right, tab</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_results_height</span> <span class="p">=</span> <span class="m">15</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_results_width</span> <span class="p">=</span> <span class="m">80</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; UI options</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_show_line_numbers</span> <span class="p">=</span> <span class="m">1</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_highlight_current_row</span> <span class="p">=</span> <span class="m">1</span> </span></span></code></pre></div> <h4 id="gql-file-settings" class="position-relative d-flex align-items-center group"> <span>GQL File Settings</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="gql-file-settings" aria-haspopup="dialog" aria-label="Share link: GQL File Settings"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Create filetype-specific settings:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; ~/.vim/ftplugin/gql.vim</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Indentation</span> </span></span><span class="line"><span class="cl"><span class="nx">setlocal</span> <span class="nx">tabstop</span><span class="p">=</span><span class="m">2</span> </span></span><span class="line"><span class="cl"><span class="nx">setlocal</span> <span class="nx">shiftwidth</span><span class="p">=</span><span class="m">2</span> </span></span><span class="line"><span class="cl"><span class="nx">setlocal</span> <span class="nx">softtabstop</span><span class="p">=</span><span class="m">2</span> </span></span><span class="line"><span class="cl"><span class="nx">setlocal</span> <span class="nx">expandtab</span> </span></span><span class="line"><span class="cl"><span class="nx">setlocal</span> <span class="nx">smartindent</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Text width for formatting</span> </span></span><span class="line"><span class="cl"><span class="nx">setlocal</span> <span class="nx">textwidth</span><span class="p">=</span><span class="m">100</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Enable omni-completion</span> </span></span><span class="line"><span class="cl"><span class="nx">setlocal</span> <span class="nx">omnifunc</span><span class="p">=</span><span class="nx">geode</span>#<span class="nx">Complete</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Folding (fold on query boundaries)</span> </span></span><span class="line"><span class="cl"><span class="nx">setlocal</span> <span class="nx">foldmethod</span><span class="p">=</span><span class="k">syntax</span> </span></span><span class="line"><span class="cl"><span class="nx">setlocal</span> <span class="nx">foldlevel</span><span class="p">=</span><span class="m">99</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Comments</span> </span></span><span class="line"><span class="cl"><span class="nx">setlocal</span> <span class="nx">commentstring</span><span class="p">=--</span>\ %<span class="nx">s</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Key mappings (buffer local)</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">ge</span> :<span class="nx">GeodeExecute</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">gx</span> :<span class="nx">GeodeExplain</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">gp</span> :<span class="nx">GeodeProfile</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">gf</span> :<span class="nx">GeodeFormat</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">gc</span> :<span class="nx">GeodeConnect</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">gr</span> :<span class="nx">GeodeToggleResults</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nx">vnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">ge</span> :<span class="nx">GeodeExecuteSelection</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Execute with Ctrl+Enter</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">C</span><span class="p">-</span><span class="nx">CR</span><span class="p">&gt;</span> :<span class="nx">GeodeExecute</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">inoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">C</span><span class="p">-</span><span class="nx">CR</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">Esc</span><span class="p">&gt;</span>:<span class="nx">GeodeExecute</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">vnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">C</span><span class="p">-</span><span class="nx">CR</span><span class="p">&gt;</span> :<span class="nx">GeodeExecuteSelection</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span></code></pre></div> <h4 id="connection-profiles" class="position-relative d-flex align-items-center group"> <span>Connection Profiles</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="connection-profiles" aria-haspopup="dialog" aria-label="Share link: Connection Profiles"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Define multiple connection profiles:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; ~/.vimrc</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Connection profiles</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_connections</span> <span class="p">=</span> { </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;development&#39;</span>: { </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;host&#39;</span>: <span class="s1">&#39;localhost&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;port&#39;</span>: <span class="m">3141</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;database&#39;</span>: <span class="s1">&#39;dev&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ }<span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;staging&#39;</span>: { </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;host&#39;</span>: <span class="s1">&#39;staging.example.com&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;port&#39;</span>: <span class="m">3141</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;database&#39;</span>: <span class="s1">&#39;staging&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;tls&#39;</span>: <span class="m">1</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ }<span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;production&#39;</span>: { </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;host&#39;</span>: <span class="s1">&#39;prod.example.com&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;port&#39;</span>: <span class="m">3141</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;database&#39;</span>: <span class="s1">&#39;production&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;tls&#39;</span>: <span class="m">1</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;read_only&#39;</span>: <span class="m">1</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ }<span class="p">,</span> </span></span><span class="line"><span class="cl"> \ } </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Default connection</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_default_connection</span> <span class="p">=</span> <span class="s1">&#39;development&#39;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Quick connection switching</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">c1</span> :<span class="nx">GeodeUseConnection</span> <span class="nx">development</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">c2</span> :<span class="nx">GeodeUseConnection</span> <span class="nx">staging</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">c3</span> :<span class="nx">GeodeUseConnection</span> <span class="nx">production</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span></code></pre></div> <h3 id="features" class="position-relative d-flex align-items-center group"> <span>Features</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="features" aria-haspopup="dialog" aria-label="Share link: Features"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="syntax-highlighting" class="position-relative d-flex align-items-center group"> <span>Syntax Highlighting</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="syntax-highlighting" aria-haspopup="dialog" aria-label="Share link: Syntax Highlighting"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>The plugin provides comprehensive syntax highlighting:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; ~/.vim/syntax/gql.vim (excerpt)</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Keywords</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlKeyword</span> <span class="nx">MATCH</span> <span class="nx">WHERE</span> <span class="nx">RETURN</span> <span class="nx">CREATE</span> <span class="nx">DELETE</span> <span class="nx">MERGE</span> <span class="nx">SET</span> <span class="nx">REMOVE</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlKeyword</span> <span class="nx">WITH</span> <span class="nx">UNWIND</span> <span class="nx">CALL</span> <span class="nx">YIELD</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">SKIP</span> <span class="nx">LIMIT</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlKeyword</span> <span class="nx">AND</span> <span class="nx">OR</span> <span class="nx">NOT</span> <span class="nx">IN</span> <span class="nx">IS</span> <span class="nx">NULL</span> <span class="nx">TRUE</span> <span class="nx">FALSE</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlKeyword</span> <span class="nx">CASE</span> <span class="nx">WHEN</span> <span class="nx">THEN</span> <span class="nx">ELSE</span> <span class="nx">END</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlKeyword</span> <span class="nx">OPTIONAL</span> <span class="nx">DISTINCT</span> <span class="nx">AS</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlKeyword</span> <span class="nx">BEGIN</span> <span class="nx">COMMIT</span> <span class="nx">ROLLBACK</span> <span class="nx">TRANSACTION</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Functions</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlFunction</span> <span class="nx">COUNT</span> <span class="nx">SUM</span> <span class="nx">AVG</span> <span class="nx">MIN</span> <span class="nx">MAX</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlFunction</span> <span class="nx">COLLECT</span> <span class="nx">REDUCE</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlFunction</span> <span class="nx">UPPER</span> <span class="nx">LOWER</span> <span class="nx">TRIM</span> <span class="nx">SUBSTRING</span> <span class="nx">REPLACE</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlFunction</span> <span class="nx">SIZE</span> <span class="nx">LENGTH</span> <span class="nx">TYPE</span> <span class="nx">ID</span> <span class="nx">LABELS</span> <span class="nx">PROPERTIES</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlFunction</span> <span class="nx">COALESCE</span> <span class="nx">NULLIF</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlFunction</span> <span class="nx">DATE</span> <span class="nx">DATETIME</span> <span class="nx">TIME</span> <span class="nx">DURATION</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Types</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlType</span> <span class="nx">Integer</span> <span class="nx">Float</span> <span class="nx">String</span> <span class="nx">Boolean</span> <span class="nx">Date</span> <span class="nx">DateTime</span> <span class="nx">Duration</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlType</span> <span class="nx">Point</span> <span class="nx">List</span> <span class="nx">Map</span> <span class="nx">Node</span> <span class="nx">Relationship</span> <span class="nx">Path</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Labels (:Label)</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">match</span> <span class="nx">gqlLabel</span> <span class="s2">&#34;:\w\+&#34;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Properties (.property)</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">match</span> <span class="nx">gqlProperty</span> <span class="s2">&#34;\.\w\+&#34;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Variables</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">match</span> <span class="nx">gqlVariable</span> <span class="s2">&#34;\$\w\+&#34;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Strings</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">region</span> <span class="nx">gqlString</span> <span class="nx">start</span><span class="p">=</span><span class="sr">/&#34;/</span> <span class="nx">skip</span><span class="p">=</span><span class="sr">/\\&#34;/</span> <span class="nx">end</span><span class="p">=</span><span class="sr">/&#34;/</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">region</span> <span class="nx">gqlString</span> <span class="nx">start</span><span class="p">=</span><span class="sr">/&#39;/</span> <span class="nx">skip</span><span class="p">=</span><span class="sr">/\\&#39;/</span> <span class="nx">end</span><span class="p">=</span><span class="sr">/&#39;/</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Comments</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">match</span> <span class="nx">gqlComment</span> <span class="s2">&#34;--.*$&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">region</span> <span class="nx">gqlComment</span> <span class="nx">start</span><span class="p">=</span><span class="s2">&#34;/\*&#34;</span> <span class="nx">end</span><span class="p">=</span><span class="s2">&#34;\*/&#34;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Numbers</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">match</span> <span class="nx">gqlNumber</span> <span class="s2">&#34;\&lt;\d\+\&gt;&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">match</span> <span class="nx">gqlNumber</span> <span class="s2">&#34;\&lt;\d\+\.\d\+\&gt;&#34;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Highlighting groups</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlKeyword</span> <span class="nx">Keyword</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlFunction</span> <span class="nx">Function</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlType</span> <span class="nx">Type</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlLabel</span> <span class="nx">Structure</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlProperty</span> <span class="nx">Identifier</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlVariable</span> <span class="nx">Special</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlString</span> <span class="nx">String</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlComment</span> <span class="nx">Comment</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlNumber</span> <span class="nx">Number</span> </span></span></code></pre></div> <h4 id="omni-completion" class="position-relative d-flex align-items-center group"> <span>Omni-Completion</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="omni-completion" aria-haspopup="dialog" aria-label="Share link: Omni-Completion"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Intelligent completion via <code>&lt;C-x&gt;&lt;C-o&gt;</code>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; Completion function in autoload/geode.vim</span> </span></span><span class="line"><span class="cl"><span class="k">function</span><span class="p">!</span> <span class="nx">geode</span>#<span class="nx">Complete</span><span class="p">(</span><span class="nx">findstart</span><span class="p">,</span> <span class="nx">base</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">a</span>:<span class="nx">findstart</span> </span></span><span class="line"><span class="cl"><span class="c"> &#34; Find start of word</span> </span></span><span class="line"><span class="cl"> <span class="k">let</span> <span class="nx">line</span> <span class="p">=</span> <span class="nx">getline</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">let</span> <span class="nx">start</span> <span class="p">=</span> <span class="nx">col</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)</span> <span class="p">-</span> <span class="m">1</span> </span></span><span class="line"><span class="cl"> <span class="nx">while</span> <span class="nx">start</span> <span class="p">&gt;</span> <span class="m">0</span> &amp;&amp; <span class="nx">line</span>[<span class="nx">start</span> <span class="p">-</span> <span class="m">1</span>] <span class="p">=~</span> <span class="s1">&#39;\w&#39;</span> </span></span><span class="line"><span class="cl"> <span class="k">let</span> <span class="nx">start</span> <span class="p">-=</span> <span class="m">1</span> </span></span><span class="line"><span class="cl"> <span class="nx">endwhile</span> </span></span><span class="line"><span class="cl"> <span class="nx">return</span> <span class="nx">start</span> </span></span><span class="line"><span class="cl"> <span class="k">else</span> </span></span><span class="line"><span class="cl"><span class="c"> &#34; Get completions from LSP or cache</span> </span></span><span class="line"><span class="cl"> <span class="k">let</span> <span class="nx">completions</span> <span class="p">=</span> [] </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c"> &#34; Context-aware completions</span> </span></span><span class="line"><span class="cl"> <span class="k">let</span> <span class="nx">context</span> <span class="p">=</span> <span class="nx">geode</span>#<span class="nx">GetContext</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">context</span>.<span class="nx">after_colon</span> </span></span><span class="line"><span class="cl"><span class="c"> &#34; Complete labels</span> </span></span><span class="line"><span class="cl"> <span class="k">let</span> <span class="nx">completions</span> <span class="p">=</span> <span class="nx">geode</span>#<span class="nx">GetLabels</span><span class="p">(</span><span class="nx">a</span>:<span class="nx">base</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">elseif</span> <span class="nx">context</span>.<span class="nx">after_dot</span> </span></span><span class="line"><span class="cl"><span class="c"> &#34; Complete properties</span> </span></span><span class="line"><span class="cl"> <span class="k">let</span> <span class="nx">completions</span> <span class="p">=</span> <span class="nx">geode</span>#<span class="nx">GetProperties</span><span class="p">(</span><span class="nx">context</span>.<span class="nx">label</span><span class="p">,</span> <span class="nx">a</span>:<span class="nx">base</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">elseif</span> <span class="nx">context</span>.<span class="nx">after_bracket</span> </span></span><span class="line"><span class="cl"><span class="c"> &#34; Complete relationship types</span> </span></span><span class="line"><span class="cl"> <span class="k">let</span> <span class="nx">completions</span> <span class="p">=</span> <span class="nx">geode</span>#<span class="nx">GetRelationships</span><span class="p">(</span><span class="nx">a</span>:<span class="nx">base</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">else</span> </span></span><span class="line"><span class="cl"><span class="c"> &#34; Complete keywords and functions</span> </span></span><span class="line"><span class="cl"> <span class="k">let</span> <span class="nx">completions</span> <span class="p">=</span> <span class="nx">geode</span>#<span class="nx">GetKeywordsAndFunctions</span><span class="p">(</span><span class="nx">a</span>:<span class="nx">base</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">endif</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nx">return</span> <span class="nx">completions</span> </span></span><span class="line"><span class="cl"> <span class="k">endif</span> </span></span><span class="line"><span class="cl"><span class="k">endfunction</span> </span></span></code></pre></div><p><strong>Using Completion</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; In insert mode:</span> </span></span><span class="line"><span class="cl"><span class="c">&#34; &lt;C-x&gt;&lt;C-o&gt; - Trigger omni-completion</span> </span></span><span class="line"><span class="cl"><span class="c">&#34; &lt;C-n&gt; - Next completion item</span> </span></span><span class="line"><span class="cl"><span class="c">&#34; &lt;C-p&gt; - Previous completion item</span> </span></span><span class="line"><span class="cl"><span class="c">&#34; &lt;C-y&gt; - Accept completion</span> </span></span><span class="line"><span class="cl"><span class="c">&#34; &lt;C-e&gt; - Cancel completion</span> </span></span></code></pre></div> <h4 id="query-execution" class="position-relative d-flex align-items-center group"> <span>Query Execution</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="query-execution" aria-haspopup="dialog" aria-label="Share link: Query Execution"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Execute queries directly from Vim:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; Execute entire buffer</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">GeodeExecute</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Execute current query (query under cursor)</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">GeodeExecuteCurrent</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Execute visual selection</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="s1">&#39;&lt;,&#39;</span><span class="p">&gt;</span><span class="nx">GeodeExecuteSelection</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Execute with EXPLAIN</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">GeodeExplain</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Execute with PROFILE</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">GeodeProfile</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Cancel running query</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">GeodeCancel</span> </span></span></code></pre></div><p><strong>Results Window</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">┌─ Geode Results ──────────────────────────────────────────┐ </span></span><span class="line"><span class="cl">│ Query: MATCH (u:User) WHERE u.active = true RETURN u... │ </span></span><span class="line"><span class="cl">│ Status: Success | Time: 12ms | Rows: 3 │ </span></span><span class="line"><span class="cl">├──────────────────────────────────────────────────────────┤ </span></span><span class="line"><span class="cl">│ name │ email │ created_at │ </span></span><span class="line"><span class="cl">├───────────────┼──────────────────────┼───────────────────┤ </span></span><span class="line"><span class="cl">│ Alice Johnson │ [email protected] │ 2024-01-15 │ </span></span><span class="line"><span class="cl">│ Bob Smith │ [email protected] │ 2024-02-20 │ </span></span><span class="line"><span class="cl">│ Carol Davis │ [email protected] │ 2024-03-10 │ </span></span><span class="line"><span class="cl">├──────────────────────────────────────────────────────────┤ </span></span><span class="line"><span class="cl">│ [j/k] navigate | [y] yank row | [Y] yank all | [q] close │ </span></span><span class="line"><span class="cl">└──────────────────────────────────────────────────────────┘ </span></span></code></pre></div><p><strong>Results Window Keys</strong>:</p> <table> <thead> <tr> <th>Key</th> <th>Action</th> </tr> </thead> <tbody> <tr> <td><code>j</code> / <code>k</code></td> <td>Navigate rows</td> </tr> <tr> <td><code>h</code> / <code>l</code></td> <td>Scroll horizontally</td> </tr> <tr> <td><code>gg</code> / <code>G</code></td> <td>Go to first/last row</td> </tr> <tr> <td><code>y</code></td> <td>Yank current row</td> </tr> <tr> <td><code>Y</code></td> <td>Yank all results</td> </tr> <tr> <td><code>/</code></td> <td>Search results</td> </tr> <tr> <td><code>n</code> / <code>N</code></td> <td>Next/previous search match</td> </tr> <tr> <td><code>q</code></td> <td>Close results window</td> </tr> <tr> <td><code>&lt;CR&gt;</code></td> <td>Expand row details</td> </tr> </tbody> </table> <h4 id="code-formatting" class="position-relative d-flex align-items-center group"> <span>Code Formatting</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="code-formatting" aria-haspopup="dialog" aria-label="Share link: Code Formatting"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Format GQL queries for consistency:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; Format entire buffer</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">GeodeFormat</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Format visual selection</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="s1">&#39;&lt;,&#39;</span><span class="p">&gt;</span><span class="nx">GeodeFormatSelection</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Format on save (if enabled)</span> </span></span><span class="line"><span class="cl"><span class="k">autocmd</span> <span class="nx">BufWritePre</span> *.<span class="nx">gql</span> :<span class="nx">GeodeFormat</span> </span></span></code></pre></div><p><strong>Before/After Formatting</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="s">&#34; Before </span></span></span><span class="line"><span class="cl"><span class="s">match(u:User)-[:FOLLOWS]-&gt;(f) where u.active=true and u.created&gt;&#39;2024-01-01&#39; return f.name,count(*) as cnt group by f.name order by cnt desc limit 10; </span></span></span><span class="line"><span class="cl"><span class="s"> </span></span></span><span class="line"><span class="cl"><span class="s">&#34;</span><span class="w"> </span><span class="py">After</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">f</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">active</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">created</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="err">&#39;</span><span class="py">2024</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">01</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">f</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">cnt</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">GROUP</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">f</span><span class="err">.</span><span class="py">name</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">cnt</span><span class="w"> </span><span class="py">DESC</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">10</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h4 id="ale-integration" class="position-relative d-flex align-items-center group"> <span>ALE Integration</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="ale-integration" aria-haspopup="dialog" aria-label="Share link: ALE Integration"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Integrate with ALE for asynchronous linting:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; ~/.vimrc</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Enable ALE for GQL</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">ale_linters</span> <span class="p">=</span> { </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;gql&#39;</span>: [<span class="s1">&#39;geode&#39;</span>]<span class="p">,</span> </span></span><span class="line"><span class="cl"> \ } </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; ALE Geode linter settings</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">ale_gql_geode_executable</span> <span class="p">=</span> <span class="s1">&#39;geode&#39;</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">ale_gql_geode_options</span> <span class="p">=</span> <span class="s1">&#39;lint --format=ale&#39;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; ALE display settings</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">ale_sign_error</span> <span class="p">=</span> <span class="s1">&#39;✗&#39;</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">ale_sign_warning</span> <span class="p">=</span> <span class="s1">&#39;⚠&#39;</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">ale_echo_msg_error_str</span> <span class="p">=</span> <span class="s1">&#39;E&#39;</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">ale_echo_msg_warning_str</span> <span class="p">=</span> <span class="s1">&#39;W&#39;</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">ale_echo_msg_format</span> <span class="p">=</span> <span class="s1">&#39;[%linter%] %s [%severity%]&#39;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Navigate errors</span> </span></span><span class="line"><span class="cl"><span class="nx">nmap</span> <span class="p">&lt;</span><span class="nx">silent</span><span class="p">&gt;</span> [<span class="nx">e</span> <span class="p">&lt;</span><span class="nx">Plug</span><span class="p">&gt;(</span><span class="nx">ale_previous_wrap</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="nx">nmap</span> <span class="p">&lt;</span><span class="nx">silent</span><span class="p">&gt;</span> ]<span class="nx">e</span> <span class="p">&lt;</span><span class="nx">Plug</span><span class="p">&gt;(</span><span class="nx">ale_next_wrap</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Fix on save</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">ale_fix_on_save</span> <span class="p">=</span> <span class="m">1</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">ale_fixers</span> <span class="p">=</span> { </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;gql&#39;</span>: [<span class="s1">&#39;geode_format&#39;</span>]<span class="p">,</span> </span></span><span class="line"><span class="cl"> \ } </span></span></code></pre></div><p><strong>Error Display</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"> 1 │ MATCH (u:User) </span></span><span class="line"><span class="cl"> 2 │ WHER u.email = &#39;[email protected]&#39; </span></span><span class="line"><span class="cl"> │ ✗ E: Unknown keyword &#39;WHER&#39;. Did you mean &#39;WHERE&#39;? </span></span><span class="line"><span class="cl"> 3 │ RETURN u; </span></span></code></pre></div> <h4 id="vim-lsp-integration" class="position-relative d-flex align-items-center group"> <span>vim-lsp Integration</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="vim-lsp-integration" aria-haspopup="dialog" aria-label="Share link: vim-lsp Integration"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>For LSP support in classic Vim:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; ~/.vimrc</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Register Geode LSP</span> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nx">executable</span><span class="p">(</span><span class="s1">&#39;geode&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="nx">au</span> <span class="nx">User</span> <span class="nx">lsp_setup</span> <span class="nx">call</span> <span class="nx">lsp</span>#<span class="nx">register_server</span><span class="p">(</span>{ </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;name&#39;</span>: <span class="s1">&#39;geode-gql&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;cmd&#39;</span>: {<span class="nx">server_info</span><span class="p">-&gt;</span>[<span class="s1">&#39;geode&#39;</span><span class="p">,</span> <span class="s1">&#39;lsp&#39;</span><span class="p">,</span> <span class="s1">&#39;--stdio&#39;</span>]}<span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;allowlist&#39;</span>: [<span class="s1">&#39;gql&#39;</span>]<span class="p">,</span> </span></span><span class="line"><span class="cl"> \ }<span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="k">endif</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; LSP keymaps</span> </span></span><span class="line"><span class="cl"><span class="k">function</span><span class="p">!</span> <span class="nx">s</span>:<span class="nx">on_lsp_buffer_enabled</span><span class="p">()</span> <span class="nx">abort</span> </span></span><span class="line"><span class="cl"> <span class="nx">setlocal</span> <span class="nx">omnifunc</span><span class="p">=</span><span class="nx">lsp</span>#<span class="nx">complete</span> </span></span><span class="line"><span class="cl"> <span class="nx">setlocal</span> <span class="nx">signcolumn</span><span class="p">=</span><span class="nx">yes</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nx">nmap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="nx">gd</span> <span class="p">&lt;</span><span class="nx">plug</span><span class="p">&gt;(</span><span class="nx">lsp</span><span class="p">-</span><span class="nx">definition</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="nx">nmap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="nx">gr</span> <span class="p">&lt;</span><span class="nx">plug</span><span class="p">&gt;(</span><span class="nx">lsp</span><span class="p">-</span><span class="nx">references</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="nx">nmap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="nx">K</span> <span class="p">&lt;</span><span class="nx">plug</span><span class="p">&gt;(</span><span class="nx">lsp</span><span class="p">-</span><span class="nx">hover</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="nx">nmap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">rn</span> <span class="p">&lt;</span><span class="nx">plug</span><span class="p">&gt;(</span><span class="nx">lsp</span><span class="p">-</span><span class="nx">rename</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="nx">nmap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> [<span class="nx">g</span> <span class="p">&lt;</span><span class="nx">plug</span><span class="p">&gt;(</span><span class="nx">lsp</span><span class="p">-</span><span class="nx">previous</span><span class="p">-</span><span class="nx">diagnostic</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="nx">nmap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> ]<span class="nx">g</span> <span class="p">&lt;</span><span class="nx">plug</span><span class="p">&gt;(</span><span class="nx">lsp</span><span class="p">-</span><span class="nx">next</span><span class="p">-</span><span class="nx">diagnostic</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="k">endfunction</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nx">augroup</span> <span class="nx">lsp_install</span> </span></span><span class="line"><span class="cl"> <span class="nx">au</span><span class="p">!</span> </span></span><span class="line"><span class="cl"> <span class="k">autocmd</span> <span class="nx">User</span> <span class="nx">lsp_buffer_enabled</span> <span class="nx">call</span> <span class="nx">s</span>:<span class="nx">on_lsp_buffer_enabled</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="nx">augroup</span> <span class="nx">END</span> </span></span></code></pre></div> <h4 id="asyncomplete-integration" class="position-relative d-flex align-items-center group"> <span>asyncomplete Integration</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="asyncomplete-integration" aria-haspopup="dialog" aria-label="Share link: asyncomplete Integration"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Async completion for better performance:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; ~/.vimrc</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Register Geode source</span> </span></span><span class="line"><span class="cl"><span class="nx">au</span> <span class="nx">User</span> <span class="nx">asyncomplete_setup</span> <span class="nx">call</span> <span class="nx">asyncomplete</span>#<span class="nx">register_source</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> \ <span class="nx">asyncomplete</span>#<span class="nx">sources</span>#<span class="nx">geode</span>#<span class="nx">get_source_options</span><span class="p">(</span>{ </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;name&#39;</span>: <span class="s1">&#39;geode&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;allowlist&#39;</span>: [<span class="s1">&#39;gql&#39;</span>]<span class="p">,</span> </span></span><span class="line"><span class="cl"> \ <span class="s1">&#39;completor&#39;</span>: <span class="k">function</span><span class="p">(</span><span class="s1">&#39;asyncomplete#sources#geode#completor&#39;</span><span class="p">),</span> </span></span><span class="line"><span class="cl"> \ }<span class="p">))</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Tab completion</span> </span></span><span class="line"><span class="cl"><span class="nx">inoremap</span> <span class="p">&lt;</span><span class="nx">expr</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">Tab</span><span class="p">&gt;</span> <span class="nx">pumvisible</span><span class="p">()</span> ? <span class="s2">&#34;\&lt;C-n&gt;&#34;</span> : <span class="s2">&#34;\&lt;Tab&gt;&#34;</span> </span></span><span class="line"><span class="cl"><span class="nx">inoremap</span> <span class="p">&lt;</span><span class="nx">expr</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">S</span><span class="p">-</span><span class="nx">Tab</span><span class="p">&gt;</span> <span class="nx">pumvisible</span><span class="p">()</span> ? <span class="s2">&#34;\&lt;C-p&gt;&#34;</span> : <span class="s2">&#34;\&lt;S-Tab&gt;&#34;</span> </span></span><span class="line"><span class="cl"><span class="nx">inoremap</span> <span class="p">&lt;</span><span class="nx">expr</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> <span class="nx">pumvisible</span><span class="p">()</span> ? <span class="s2">&#34;\&lt;C-y&gt;&#34;</span> : <span class="s2">&#34;\&lt;CR&gt;&#34;</span> </span></span></code></pre></div> <h3 id="key-mappings" class="position-relative d-flex align-items-center group"> <span>Key Mappings</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="key-mappings" aria-haspopup="dialog" aria-label="Share link: Key Mappings"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="default-mappings" class="position-relative d-flex align-items-center group"> <span>Default Mappings</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="default-mappings" aria-haspopup="dialog" aria-label="Share link: Default Mappings"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Action</th> <th>Mapping</th> <th>Mode</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td>Execute Query</td> <td><code>&lt;leader&gt;ge</code></td> <td>n</td> <td>Execute query under cursor</td> </tr> <tr> <td>Execute Selection</td> <td><code>&lt;leader&gt;ge</code></td> <td>v</td> <td>Execute selected text</td> </tr> <tr> <td>Explain Query</td> <td><code>&lt;leader&gt;gx</code></td> <td>n</td> <td>Show execution plan</td> </tr> <tr> <td>Profile Query</td> <td><code>&lt;leader&gt;gp</code></td> <td>n</td> <td>Execute with profiling</td> </tr> <tr> <td>Format Buffer</td> <td><code>&lt;leader&gt;gf</code></td> <td>n</td> <td>Format entire buffer</td> </tr> <tr> <td>Toggle Results</td> <td><code>&lt;leader&gt;gr</code></td> <td>n</td> <td>Toggle results window</td> </tr> <tr> <td>Connect</td> <td><code>&lt;leader&gt;gc</code></td> <td>n</td> <td>Connect to server</td> </tr> <tr> <td>Schema Explorer</td> <td><code>&lt;leader&gt;gS</code></td> <td>n</td> <td>Open schema browser</td> </tr> <tr> <td>Next Error</td> <td><code>]e</code></td> <td>n</td> <td>Go to next error</td> </tr> <tr> <td>Prev Error</td> <td><code>[e</code></td> <td>n</td> <td>Go to previous error</td> </tr> </tbody> </table> <h4 id="custom-mappings" class="position-relative d-flex align-items-center group"> <span>Custom Mappings</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="custom-mappings" aria-haspopup="dialog" aria-label="Share link: Custom Mappings"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; ~/.vim/ftplugin/gql.vim</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Quick execute with Ctrl+Enter</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">C</span><span class="p">-</span><span class="nx">CR</span><span class="p">&gt;</span> :<span class="nx">GeodeExecute</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">inoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">C</span><span class="p">-</span><span class="nx">CR</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">Esc</span><span class="p">&gt;</span>:<span class="nx">GeodeExecute</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span><span class="nx">a</span> </span></span><span class="line"><span class="cl"><span class="nx">vnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">C</span><span class="p">-</span><span class="nx">CR</span><span class="p">&gt;</span> :<span class="nx">GeodeExecuteSelection</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Execute and stay in insert mode</span> </span></span><span class="line"><span class="cl"><span class="nx">inoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">C</span><span class="p">-</span><span class="nx">S</span><span class="p">-</span><span class="nx">CR</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">C</span><span class="p">-</span><span class="nx">o</span><span class="p">&gt;</span>:<span class="nx">GeodeExecute</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Format with = (like other languages)</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">=</span> :<span class="nx">GeodeFormat</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Quick explain</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">e</span> :<span class="nx">GeodeExplain</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Quick profile</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">p</span> :<span class="nx">GeodeProfile</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Navigate queries in buffer</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> [<span class="nx">q</span> :<span class="nx">GeodePrevQuery</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> ]<span class="nx">q</span> :<span class="nx">GeodeNextQuery</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Copy results to clipboard</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">yy</span> :<span class="nx">GeodeYankResults</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">yj</span> :<span class="nx">GeodeYankResultsJSON</span><span class="p">&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Insert common patterns</span> </span></span><span class="line"><span class="cl"><span class="nx">inoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">C</span><span class="p">-</span><span class="nx">g</span><span class="p">&gt;</span><span class="nx">m</span> <span class="nx">MATCH</span> <span class="p">()&lt;</span><span class="nx">Left</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="nx">inoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">C</span><span class="p">-</span><span class="nx">g</span><span class="p">&gt;</span><span class="nx">w</span> <span class="nx">WHERE</span> </span></span><span class="line"><span class="cl"><span class="nx">inoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">C</span><span class="p">-</span><span class="nx">g</span><span class="p">&gt;</span><span class="nx">r</span> <span class="nx">RETURN</span> </span></span><span class="line"><span class="cl"><span class="nx">inoremap</span> <span class="p">&lt;</span><span class="nx">buffer</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">C</span><span class="p">-</span><span class="nx">g</span><span class="p">&gt;</span><span class="nx">c</span> <span class="nx">CREATE</span> <span class="p">()&lt;</span><span class="nx">Left</span><span class="p">&gt;</span> </span></span></code></pre></div> <h3 id="snippets" class="position-relative d-flex align-items-center group"> <span>Snippets</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="snippets" aria-haspopup="dialog" aria-label="Share link: Snippets"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="ultisnips-integration" class="position-relative d-flex align-items-center group"> <span>UltiSnips Integration</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="ultisnips-integration" aria-haspopup="dialog" aria-label="Share link: UltiSnips Integration"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; ~/.vim/UltiSnips/gql.snippets</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"># <span class="nx">Basic</span> <span class="nx">MATCH</span> <span class="nx">query</span> </span></span><span class="line"><span class="cl"><span class="nx">snippet</span> <span class="nx">match</span> <span class="s2">&#34;MATCH query&#34;</span> <span class="nx">b</span> </span></span><span class="line"><span class="cl"><span class="nx">MATCH</span> <span class="p">(</span>${<span class="m">1</span>:<span class="nx">n</span>}:${<span class="m">2</span>:<span class="nx">Label</span>}<span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="nx">WHERE</span> ${<span class="m">3</span>:<span class="nx">condition</span>} </span></span><span class="line"><span class="cl"><span class="nx">RETURN</span> ${<span class="m">4</span>:$<span class="m">1</span>}; </span></span><span class="line"><span class="cl"><span class="nx">endsnippet</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"># <span class="nx">CREATE</span> <span class="nx">node</span> </span></span><span class="line"><span class="cl"><span class="nx">snippet</span> <span class="nx">create</span> <span class="s2">&#34;CREATE node&#34;</span> <span class="nx">b</span> </span></span><span class="line"><span class="cl"><span class="nx">CREATE</span> <span class="p">(</span>${<span class="m">1</span>:<span class="nx">n</span>}:${<span class="m">2</span>:<span class="nx">Label</span>} { </span></span><span class="line"><span class="cl"> ${<span class="m">3</span>:<span class="nx">property</span>}: ${<span class="m">4</span>:<span class="nx">value</span>} </span></span><span class="line"><span class="cl">}<span class="p">)</span>; </span></span><span class="line"><span class="cl"><span class="nx">endsnippet</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"># <span class="nx">CREATE</span> <span class="nx">relationship</span> </span></span><span class="line"><span class="cl"><span class="nx">snippet</span> <span class="nx">rel</span> <span class="s2">&#34;CREATE relationship&#34;</span> <span class="nx">b</span> </span></span><span class="line"><span class="cl"><span class="nx">MATCH</span> <span class="p">(</span><span class="nx">a</span>:${<span class="m">1</span>:<span class="nx">Label</span>} {${<span class="m">2</span>:<span class="nx">prop</span>}: ${<span class="m">3</span>:<span class="nx">value</span>}}<span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="nx">MATCH</span> <span class="p">(</span><span class="nx">b</span>:${<span class="m">4</span>:<span class="nx">Label</span>} {${<span class="m">5</span>:<span class="nx">prop</span>}: ${<span class="m">6</span>:<span class="nx">value</span>}}<span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="nx">CREATE</span> <span class="p">(</span><span class="nx">a</span><span class="p">)-</span>[:${<span class="m">7</span>:<span class="nx">REL_TYPE</span>} {${<span class="m">8</span>:}}]<span class="p">-&gt;(</span><span class="nx">b</span><span class="p">)</span>; </span></span><span class="line"><span class="cl"><span class="nx">endsnippet</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"># <span class="nx">MERGE</span> <span class="nx">pattern</span> </span></span><span class="line"><span class="cl"><span class="nx">snippet</span> <span class="nx">merge</span> <span class="s2">&#34;MERGE pattern&#34;</span> <span class="nx">b</span> </span></span><span class="line"><span class="cl"><span class="nx">MERGE</span> <span class="p">(</span>${<span class="m">1</span>:<span class="nx">n</span>}:${<span class="m">2</span>:<span class="nx">Label</span>} {${<span class="m">3</span>:<span class="nx">id</span>}: ${<span class="m">4</span>:<span class="nx">value</span>}}<span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="nx">ON</span> <span class="nx">CREATE</span> <span class="nx">SET</span> ${<span class="m">5</span>:$<span class="m">1</span>.<span class="nx">created_at</span> <span class="p">=</span> <span class="nx">datetime</span><span class="p">()</span>} </span></span><span class="line"><span class="cl"><span class="nx">ON</span> <span class="nx">MATCH</span> <span class="nx">SET</span> ${<span class="m">6</span>:$<span class="m">1</span>.<span class="nx">updated_at</span> <span class="p">=</span> <span class="nx">datetime</span><span class="p">()</span>} </span></span><span class="line"><span class="cl"><span class="nx">RETURN</span> $<span class="m">1</span>; </span></span><span class="line"><span class="cl"><span class="nx">endsnippet</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"># <span class="nx">Path</span> <span class="nx">query</span> </span></span><span class="line"><span class="cl"><span class="nx">snippet</span> <span class="nx">path</span> <span class="s2">&#34;Path query&#34;</span> <span class="nx">b</span> </span></span><span class="line"><span class="cl"><span class="nx">MATCH</span> <span class="nx">path</span> <span class="p">=</span> <span class="p">(</span>${<span class="m">1</span>:<span class="nx">start</span>}:${<span class="m">2</span>:<span class="nx">Label</span>}<span class="p">)-</span>[:${<span class="m">3</span>:<span class="nx">REL</span>}*${<span class="m">4</span>:<span class="m">1</span>..<span class="m">3</span>}]<span class="p">-&gt;(</span>${<span class="m">5</span>:<span class="nx">end</span>}:${<span class="m">6</span>:<span class="nx">Label</span>}<span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="nx">WHERE</span> ${<span class="m">7</span>:<span class="nx">condition</span>} </span></span><span class="line"><span class="cl"><span class="nx">RETURN</span> <span class="nx">path</span>; </span></span><span class="line"><span class="cl"><span class="nx">endsnippet</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"># <span class="nx">Aggregation</span> </span></span><span class="line"><span class="cl"><span class="nx">snippet</span> <span class="nx">agg</span> <span class="s2">&#34;Aggregation query&#34;</span> <span class="nx">b</span> </span></span><span class="line"><span class="cl"><span class="nx">MATCH</span> <span class="p">(</span>${<span class="m">1</span>:<span class="nx">n</span>}:${<span class="m">2</span>:<span class="nx">Label</span>}<span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="nx">WHERE</span> ${<span class="m">3</span>:<span class="nx">condition</span>} </span></span><span class="line"><span class="cl"><span class="nx">RETURN</span> ${<span class="m">4</span>:<span class="nx">n</span>.<span class="nx">property</span>}<span class="p">,</span> ${<span class="m">5</span>:<span class="nx">COUNT</span>}<span class="p">(</span>*<span class="p">)</span> <span class="nx">AS</span> ${<span class="m">6</span>:<span class="nx">count</span>} </span></span><span class="line"><span class="cl"><span class="nx">GROUP</span> <span class="nx">BY</span> $<span class="m">4</span> </span></span><span class="line"><span class="cl"><span class="nx">ORDER</span> <span class="nx">BY</span> $<span class="m">6</span> <span class="nx">DESC</span> </span></span><span class="line"><span class="cl"><span class="nx">LIMIT</span> ${<span class="m">7</span>:<span class="m">10</span>}; </span></span><span class="line"><span class="cl"><span class="nx">endsnippet</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"># <span class="nx">Transaction</span> <span class="nx">block</span> </span></span><span class="line"><span class="cl"><span class="nx">snippet</span> <span class="nx">tx</span> <span class="s2">&#34;Transaction block&#34;</span> <span class="nx">b</span> </span></span><span class="line"><span class="cl"><span class="nx">BEGIN</span> <span class="nx">TRANSACTION</span>; </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">${<span class="m">1</span>:<span class="p">--</span> <span class="nx">Your</span> <span class="nx">GQL</span> <span class="nx">statements</span> <span class="nx">here</span>} </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nx">COMMIT</span>; </span></span><span class="line"><span class="cl"><span class="nx">endsnippet</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"># <span class="nx">CASE</span> <span class="nx">expression</span> </span></span><span class="line"><span class="cl"><span class="nx">snippet</span> <span class="nx">case</span> <span class="s2">&#34;CASE expression&#34;</span> <span class="nx">b</span> </span></span><span class="line"><span class="cl"><span class="nx">CASE</span> </span></span><span class="line"><span class="cl"> <span class="nx">WHEN</span> ${<span class="m">1</span>:<span class="nx">condition</span>} <span class="nx">THEN</span> ${<span class="m">2</span>:<span class="nx">result</span>} </span></span><span class="line"><span class="cl"> <span class="nx">WHEN</span> ${<span class="m">3</span>:<span class="nx">condition</span>} <span class="nx">THEN</span> ${<span class="m">4</span>:<span class="nx">result</span>} </span></span><span class="line"><span class="cl"> <span class="nx">ELSE</span> ${<span class="m">5</span>:<span class="nx">default</span>} </span></span><span class="line"><span class="cl"><span class="nx">END</span> </span></span><span class="line"><span class="cl"><span class="nx">endsnippet</span> </span></span></code></pre></div> <h4 id="snipmate-snippets" class="position-relative d-flex align-items-center group"> <span>SnipMate Snippets</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="snipmate-snippets" aria-haspopup="dialog" aria-label="Share link: SnipMate Snippets"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># ~/.vim/snippets/gql.snippets </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">snippet match </span></span><span class="line"><span class="cl"> MATCH (${1:n}:${2:Label}) </span></span><span class="line"><span class="cl"> WHERE ${3:condition} </span></span><span class="line"><span class="cl"> RETURN ${4:$1}; </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">snippet create </span></span><span class="line"><span class="cl"> CREATE (${1:n}:${2:Label} { </span></span><span class="line"><span class="cl"> ${3:property}: ${4:value} </span></span><span class="line"><span class="cl"> }); </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">snippet path </span></span><span class="line"><span class="cl"> MATCH path = (${1:start}:${2:Label})-[:${3:REL}*${4:1..3}]-&gt;(${5:end}:${6:Label}) </span></span><span class="line"><span class="cl"> RETURN path; </span></span></code></pre></div> <h3 id="commands-reference" class="position-relative d-flex align-items-center group"> <span>Commands Reference</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="commands-reference" aria-haspopup="dialog" aria-label="Share link: Commands Reference"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="execution-commands" class="position-relative d-flex align-items-center group"> <span>Execution Commands</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="execution-commands" aria-haspopup="dialog" aria-label="Share link: Execution Commands"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Command</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>:GeodeExecute</code></td> <td>Execute query under cursor or entire buffer</td> </tr> <tr> <td><code>:GeodeExecuteSelection</code></td> <td>Execute visual selection</td> </tr> <tr> <td><code>:GeodeExecuteCurrent</code></td> <td>Execute current query only</td> </tr> <tr> <td><code>:GeodeExplain</code></td> <td>Show execution plan</td> </tr> <tr> <td><code>:GeodeProfile</code></td> <td>Execute with profiling</td> </tr> <tr> <td><code>:GeodeCancel</code></td> <td>Cancel running query</td> </tr> </tbody> </table> <h4 id="connection-commands" class="position-relative d-flex align-items-center group"> <span>Connection Commands</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="connection-commands" aria-haspopup="dialog" aria-label="Share link: Connection Commands"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Command</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>:GeodeConnect</code></td> <td>Connect to server</td> </tr> <tr> <td><code>:GeodeDisconnect</code></td> <td>Disconnect from server</td> </tr> <tr> <td><code>:GeodeReconnect</code></td> <td>Reconnect to server</td> </tr> <tr> <td><code>:GeodeUseConnection {name}</code></td> <td>Switch to named connection</td> </tr> <tr> <td><code>:GeodeUseDatabase {name}</code></td> <td>Switch database</td> </tr> <tr> <td><code>:GeodeConnectionStatus</code></td> <td>Show connection status</td> </tr> </tbody> </table> <h4 id="formatting-commands" class="position-relative d-flex align-items-center group"> <span>Formatting Commands</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="formatting-commands" aria-haspopup="dialog" aria-label="Share link: Formatting Commands"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Command</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>:GeodeFormat</code></td> <td>Format entire buffer</td> </tr> <tr> <td><code>:GeodeFormatSelection</code></td> <td>Format visual selection</td> </tr> <tr> <td><code>:GeodeSetIndent {n}</code></td> <td>Set indent size</td> </tr> <tr> <td><code>:GeodeSetKeywordCase {case}</code></td> <td>Set keyword case (UPPER/lower)</td> </tr> </tbody> </table> <h4 id="schema-commands" class="position-relative d-flex align-items-center group"> <span>Schema Commands</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="schema-commands" aria-haspopup="dialog" aria-label="Share link: Schema Commands"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Command</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>:GeodeSchema</code></td> <td>Open schema explorer</td> </tr> <tr> <td><code>:GeodeLabels</code></td> <td>List all labels</td> </tr> <tr> <td><code>:GeodeRelationships</code></td> <td>List relationship types</td> </tr> <tr> <td><code>:GeodeProperties {label}</code></td> <td>List properties for label</td> </tr> <tr> <td><code>:GeodeIndexes</code></td> <td>List all indexes</td> </tr> <tr> <td><code>:GeodeRefreshSchema</code></td> <td>Refresh schema cache</td> </tr> </tbody> </table> <h4 id="results-commands" class="position-relative d-flex align-items-center group"> <span>Results Commands</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="results-commands" aria-haspopup="dialog" aria-label="Share link: Results Commands"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Command</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>:GeodeToggleResults</code></td> <td>Toggle results window</td> </tr> <tr> <td><code>:GeodeShowResults</code></td> <td>Show results window</td> </tr> <tr> <td><code>:GeodeHideResults</code></td> <td>Hide results window</td> </tr> <tr> <td><code>:GeodeYankResults</code></td> <td>Copy results to clipboard</td> </tr> <tr> <td><code>:GeodeYankResultsJSON</code></td> <td>Copy results as JSON</td> </tr> <tr> <td><code>:GeodeExportResults {file}</code></td> <td>Export to file</td> </tr> </tbody> </table> <h3 id="troubleshooting" class="position-relative d-flex align-items-center group"> <span>Troubleshooting</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="troubleshooting" aria-haspopup="dialog" aria-label="Share link: Troubleshooting"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="common-issues" class="position-relative d-flex align-items-center group"> <span>Common Issues</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="common-issues" aria-haspopup="dialog" aria-label="Share link: Common Issues"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p><strong>Syntax Highlighting Not Working</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; Check filetype detection</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="k">set</span> <span class="nx">ft</span>? </span></span><span class="line"><span class="cl"><span class="c">&#34; Should show: filetype=gql</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Force filetype</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="k">set</span> <span class="nx">ft</span><span class="p">=</span><span class="nx">gql</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Check syntax loaded</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="k">syntax</span> <span class="nx">list</span> </span></span></code></pre></div><p><strong>Completion Not Working</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; Check omnifunc</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="k">set</span> <span class="nx">omnifunc</span>? </span></span><span class="line"><span class="cl"><span class="c">&#34; Should show: omnifunc=geode#Complete</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Test completion manually</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">call</span> <span class="nx">geode</span>#<span class="nx">Complete</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> </span></span></code></pre></div><p><strong>Connection Failures</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; Check connection status</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">GeodeConnectionStatus</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Test connection</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">GeodeTestConnection</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; View connection log</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">GeodeConnectionLog</span> </span></span></code></pre></div><p><strong>Plugin Not Loading</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; Check plugin loaded</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">scriptnames</span> <span class="p">|</span> <span class="nx">grep</span> <span class="nx">geode</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Check for errors</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">messages</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Reload plugin</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">source</span> <span class="p">~</span><span class="sr">/.vim/</span><span class="nx">plugged</span><span class="sr">/vim-geode-gql/</span><span class="nx">plugin</span>/<span class="nx">geode</span>.<span class="nx">vim</span> </span></span></code></pre></div> <h4 id="debug-mode" class="position-relative d-flex align-items-center group"> <span>Debug Mode</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="debug-mode" aria-haspopup="dialog" aria-label="Share link: Debug Mode"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Enable debug logging:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; Enable debug mode</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_debug</span> <span class="p">=</span> <span class="m">1</span> </span></span><span class="line"><span class="cl"><span class="k">let</span> <span class="nx">g</span>:<span class="nx">geode_log_file</span> <span class="p">=</span> <span class="s1">&#39;/tmp/geode-vim.log&#39;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; View debug log</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">edit</span> <span class="sr">/tmp/</span><span class="nx">geode</span><span class="p">-</span><span class="nx">vim</span>.<span class="nx">log</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Or tail in terminal</span> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nx">terminal</span> <span class="nx">tail</span> <span class="p">-</span><span class="nx">f</span> <span class="sr">/tmp/</span><span class="nx">geode</span><span class="p">-</span><span class="nx">vim</span>.<span class="nx">log</span> </span></span></code></pre></div> <h3 id="best-practices" class="position-relative d-flex align-items-center group"> <span>Best Practices</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="best-practices" aria-haspopup="dialog" aria-label="Share link: Best Practices"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Organize Query Files</strong>: Keep <code>.gql</code> files in version control for collaboration.</p> <p><strong>Use Connection Profiles</strong>: Define profiles for different environments.</p> <p><strong>Enable Format on Save</strong>: Ensure consistent code style.</p> <p><strong>Leverage Snippets</strong>: Create snippets for common query patterns.</p> <p><strong>Use ALE for Linting</strong>: Get real-time feedback on syntax errors.</p> <p><strong>Set Up Key Mappings</strong>: Create efficient mappings for frequent operations.</p> <p><strong>Profile Complex Queries</strong>: Always profile before running expensive queries.</p> <p><strong>Use Read-Only for Production</strong>: Mark production connections as read-only.</p> <p><strong>Check Schema Before Writing</strong>: Use schema explorer to verify labels and properties.</p> <p><strong>Document Custom Mappings</strong>: Comment your mappings for future reference.</p> <h3 id="related-topics" class="position-relative d-flex align-items-center group"> <span>Related Topics</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="related-topics" aria-haspopup="dialog" aria-label="Share link: Related Topics"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li><a href="/tags/editor/" >Editor Integrations</a> - Overview of all editor integrations</li> <li><a href="/tags/neovim/" >Neovim Plugin</a> - Modern Neovim integration with LSP</li> <li><a href="/tags/vscode/" >VS Code Extension</a> - VS Code integration</li> <li><a href="/tags/ide/" >IDE Integration</a> - General IDE support</li> <li><a href="/tags/plugin/" >Plugin Development</a> - Creating editor plugins</li> <li><a href="/docs/development/lsp-guide/" >LSP Guide</a> - Language Server Protocol details</li> </ul> <h3 id="further-reading" class="position-relative d-flex align-items-center group"> <span>Further Reading</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="further-reading" aria-haspopup="dialog" aria-label="Share link: Further Reading"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li>Vim Script Documentation</li> <li>ALE Documentation</li> <li>vim-lsp Configuration Guide</li> <li>UltiSnips Documentation</li> <li>Vim Plugin Development Guide</li> <li>Modal Editing Best Practices</li> </ul>

Related Articles