<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: lijing00333</title>
    <description>The latest articles on DEV Community by lijing00333 (@jayli).</description>
    <link>https://dev.to/jayli</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F764078%2Fd62af948-69d9-4c58-ae9a-167ff1dc799c.png</url>
      <title>DEV Community: lijing00333</title>
      <link>https://dev.to/jayli</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jayli"/>
    <language>en</language>
    <item>
      <title>How to improve your vim/nvim coding experience with vim-easycomplete?</title>
      <dc:creator>lijing00333</dc:creator>
      <pubDate>Wed, 02 Mar 2022 03:44:31 +0000</pubDate>
      <link>https://dev.to/jayli/how-to-improve-your-vimnvim-coding-experience-with-vim-easycomplete-29o0</link>
      <guid>https://dev.to/jayli/how-to-improve-your-vimnvim-coding-experience-with-vim-easycomplete-29o0</guid>
      <description>&lt;h3&gt;
  
  
  Why
&lt;/h3&gt;

&lt;p&gt;There are many excellent vim auto-completion plugins such as &lt;a href="https://github.com/hrsh7th/nvim-cmp" rel="noopener noreferrer"&gt;nvim-cmp&lt;/a&gt;, &lt;a href="https://github.com/prabirshrestha/vim-lsp" rel="noopener noreferrer"&gt;vim-lsp&lt;/a&gt;, &lt;a href="https://github.com/ycm-core/YouCompleteMe" rel="noopener noreferrer"&gt;YouCompleteMe&lt;/a&gt; and &lt;a href="https://github.com/neoclide/coc.nvim" rel="noopener noreferrer"&gt;coc.nvim&lt;/a&gt; etc. I used coc.nvim for a long time. It’s experience is good. But there are a few things I don’t like. These plugins tend to have too much dependencies and do not have minimal configuration. For example, I don't want to install Node when programming c++ or golang. In my opinion vim is more lightweight than vscode so I don’t need the fully integrated features of it. Besides other completion plugins neither have good experiences enough nor compatible with vim and nvim at the same time. Therefor I created &lt;a href="https://github.com/jayli/vim-easycomplete" rel="noopener noreferrer"&gt;vim-easycomplete&lt;/a&gt; according to my personal habits.&lt;/p&gt;

&lt;h3&gt;
  
  
  What
&lt;/h3&gt;

&lt;p&gt;Vim-easycomplete is a fast and minimalism style completion plugin for vim/nvim. The goal is to work everywhere out of the box with high-speed performance. It requires pure vim script. You don’t need to configure anything. Especially, You don’t have to install Node and a bunch of Node modules unless you’re a javascript/typescript programmer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi3%2FO1CN01dGIJZW204A0MpESbI_%21%216000000006795-1-tps-750-477.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi3%2FO1CN01dGIJZW204A0MpESbI_%21%216000000006795-1-tps-750-477.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is easy to install and use. It contains these features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buffer Keywords/Directory support&lt;/li&gt;
&lt;li&gt;LSP(&lt;a href="https://github.com/microsoft/language-server-protocol" rel="noopener noreferrer"&gt;language-server-protocol&lt;/a&gt;) support&lt;/li&gt;
&lt;li&gt;
TabNine support. (Highly Recommend!)&lt;/li&gt;
&lt;li&gt;Easy to install LSP Server with one command&lt;/li&gt;
&lt;li&gt;Written in pure vim script for vim8 and neovim&lt;/li&gt;
&lt;li&gt;Snippet support with ultisnips.&lt;/li&gt;
&lt;li&gt;Fast performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reason I decided to use pure vim script instead of lua or python is that I want a wider range of compatibility. And I made a lot of async handling with vim script to avoid the block of vim.&lt;/p&gt;

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

&lt;p&gt;Easycomplete requires Vim 8.2 and higher version with MacOS/Linux/FreeBSD. For neovim users, 0.4.4 and higher is required.&lt;/p&gt;

&lt;p&gt;For vim-plug:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;Plug &lt;span class="s1"&gt;'jayli/vim-easycomplete'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;:PlugInstall&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For dein.vim&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;call&lt;/span&gt; dein#&lt;span class="nb"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'jayli/vim-easycomplete'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;p&gt;The plugin is out of box and config noghting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Useage
&lt;/h3&gt;

&lt;p&gt;By default it use Tab to trigger the completion suggestions. Alse use Tab and Shift-Tab to select matched items. Use &lt;code&gt;Ctrl-]&lt;/code&gt; for definition jumping, &lt;code&gt;Ctrl-t&lt;/code&gt; for jumping back (Same as tags jumping). Or you can map &lt;code&gt;:EasyCompleteGotoDefinition&lt;/code&gt; by yourself.&lt;/p&gt;

&lt;p&gt;If you don't want use &lt;code&gt;Tab&lt;/code&gt; to trigger completion suggestions. You can change this setting by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:easycomplete_tab_trigger&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;c-space&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;:EasyCompleteNextDiagnostic&lt;/code&gt; and &lt;code&gt;:EasyCompletePreviousDiagnostic&lt;/code&gt; for diagnostics jumping. The plugin has already map diagnostic jumping to &lt;code&gt;&amp;lt;C-j&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;C-k&amp;gt;&lt;/code&gt;. You can change these mapping via:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;nnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="k"&gt;n&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;EasyCompleteNextDiagnostic&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
nnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="k"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;EasyCompletePreviousDiagnostic&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You only have to set custom diagnostic HOTKEYs manually in case of there was a conflict. By default press &lt;code&gt;&amp;lt;C-j&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;C-k&amp;gt;&lt;/code&gt; for diagnostics jumping like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi1%2FO1CN01g7PWjZ1q7EVKVpxno_%21%216000000005448-1-tps-902-188.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi1%2FO1CN01g7PWjZ1q7EVKVpxno_%21%216000000005448-1-tps-902-188.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;let g:easycomplete_diagnostics_enable = 0&lt;/code&gt; to disable lsp diagnostics.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;let g:easycomplete_lsp_checking = 0&lt;/code&gt; to disable lsp checking for installation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Checking if LSP server is installed via &lt;code&gt;:EasyCompleteCheck&lt;/code&gt;. If current LSP Server is not ready, Use &lt;code&gt;:EasyCompleteInstallServer&lt;/code&gt; to install.&lt;/p&gt;

&lt;p&gt;Typing &lt;code&gt;./&lt;/code&gt; or &lt;code&gt;../&lt;/code&gt; to trigger directory completion suggestion.&lt;/p&gt;

&lt;p&gt;Dictionary suggestion support via &lt;code&gt;set dictionary=${Your_Dictionary_File}&lt;/code&gt; if you need.&lt;/p&gt;

&lt;p&gt;Vim-Easycomplete also support signature popup (Use &lt;code&gt;let g:easycomplete_signature_enable = 0&lt;/code&gt; to disable):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi4%2FO1CN01kNd19n1k7nINy4SQT_%21%216000000004637-1-tps-862-228.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi4%2FO1CN01kNd19n1k7nINy4SQT_%21%216000000004637-1-tps-862-228.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Typing &lt;code&gt;:h easycomplete&lt;/code&gt; for help.&lt;/p&gt;

&lt;p&gt;All commands:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:EasyCompleteInstallServer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Install LSP server for current fileytpe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:InstallLspServer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same as &lt;code&gt;EasyCompleteInstallServer&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:EasyCompleteDisable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Disable EasyComplete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:EasyCompleteEnable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enable EasyComplete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:EasyCompleteGotoDefinition&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Goto definition position&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:EasyCompleteCheck&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Checking LSP server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:EasyCompletePreviousDiagnostic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Goto Previous diagnostic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:EasyCompleteNextDiagnostic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Goto Next diagnostic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:EasyCompleteProfileStart&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start record diagnostics message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:EasyCompleteProfileStop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stop record diagnostics  message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:EasyCompleteLint&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Do diagnostic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:LintEasyComplete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Do diagnostic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:DenoCache&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Do Deno Cache for downloading modules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Language Support
&lt;/h3&gt;

&lt;p&gt;EasyComplete support keywords/dictionary/directory completion by default.&lt;/p&gt;

&lt;h4&gt;
  
  
  Semantic Completion for Other Languages
&lt;/h4&gt;

&lt;p&gt;Most Language require LSP Server. Install missing LSP Server with &lt;code&gt;:InstallLspServer&lt;/code&gt; for current filetype (recommended). LSP Server will be installed in &lt;code&gt;~/.config/vim-easycomplete/servers&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Or you can install a lsp server with specified plugin name (not recommended). Take typescript/javascript for example:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;All supported languages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin Name&lt;/th&gt;
&lt;th&gt;Languages&lt;/th&gt;
&lt;th&gt;Language Server&lt;/th&gt;
&lt;th&gt;Installer&lt;/th&gt;
&lt;th&gt;Env requirements&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;directory&lt;/td&gt;
&lt;td&gt;directory suggestion&lt;/td&gt;
&lt;td&gt;No Need&lt;/td&gt;
&lt;td&gt;Integrated&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;buf&lt;/td&gt;
&lt;td&gt;keywords &amp;amp; dictionary&lt;/td&gt;
&lt;td&gt;No Need&lt;/td&gt;
&lt;td&gt;Integrated&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;snips&lt;/td&gt;
&lt;td&gt;Snippets Support&lt;/td&gt;
&lt;td&gt;ultisnips&lt;/td&gt;
&lt;td&gt;Manually&lt;/td&gt;
&lt;td&gt;python3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ts&lt;/td&gt;
&lt;td&gt;JavaScript/TypeScript&lt;/td&gt;
&lt;td&gt;tsserver&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;node/npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deno&lt;/td&gt;
&lt;td&gt;JavaScript/TypeScript&lt;/td&gt;
&lt;td&gt;deno&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;deno&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tn&lt;/td&gt;
&lt;td&gt;TabNine&lt;/td&gt;
&lt;td&gt;TabNine&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vim&lt;/td&gt;
&lt;td&gt;Vim&lt;/td&gt;
&lt;td&gt;vim-language-server&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;node/npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cpp&lt;/td&gt;
&lt;td&gt;C/C++&lt;/td&gt;
&lt;td&gt;ccls&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;ruby/brew&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;css&lt;/td&gt;
&lt;td&gt;CSS&lt;/td&gt;
&lt;td&gt;css-languageserver&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;node/npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;html&lt;/td&gt;
&lt;td&gt;HTML&lt;/td&gt;
&lt;td&gt;html-languageserver&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;node/npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;yml&lt;/td&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;td&gt;yaml-language-server&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;node/npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;xml&lt;/td&gt;
&lt;td&gt;Xml&lt;/td&gt;
&lt;td&gt;lemminx&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;java/jdk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sh&lt;/td&gt;
&lt;td&gt;Bash&lt;/td&gt;
&lt;td&gt;bash-language-server&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;node/npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;json&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;json-languageserver&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;node/npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;php&lt;/td&gt;
&lt;td&gt;php&lt;/td&gt;
&lt;td&gt;intelephense&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;node/npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dart&lt;/td&gt;
&lt;td&gt;dart&lt;/td&gt;
&lt;td&gt;analysis-server-dart-snapshot&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;py&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;pyls&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;python3/pip3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;java&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;eclipse-jdt-ls&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;java11/jdk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;go&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;gopls&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;r&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;td&gt;r-languageserver&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rb&lt;/td&gt;
&lt;td&gt;Ruby&lt;/td&gt;
&lt;td&gt;solargraph&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;ruby/bundle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lua&lt;/td&gt;
&lt;td&gt;Lua&lt;/td&gt;
&lt;td&gt;emmylua-ls&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;java/jdk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nim&lt;/td&gt;
&lt;td&gt;Nim&lt;/td&gt;
&lt;td&gt;nimlsp&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;nim/nimble&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rust&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;rust-analyzer&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kt&lt;/td&gt;
&lt;td&gt;Kotlin&lt;/td&gt;
&lt;td&gt;kotlin-language-server&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;java/jdk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grvy&lt;/td&gt;
&lt;td&gt;Groovy&lt;/td&gt;
&lt;td&gt;groovy-language-server&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;java/jdk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cmake&lt;/td&gt;
&lt;td&gt;cmake&lt;/td&gt;
&lt;td&gt;cmake-language-server&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;python3/pip3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cs&lt;/td&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td&gt;omnisharp-lsp&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;More info about semantic completion for each supported language:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript &amp;amp; TypeScript: &lt;a href="https://github.com/microsoft/TypeScript" rel="noopener noreferrer"&gt;tsserver&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;Python: &lt;a href="https://github.com/palantir/python-language-server" rel="noopener noreferrer"&gt;pyls&lt;/a&gt; required. (&lt;code&gt;pip install python-language-server&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Go: &lt;a href="https://github.com/golang/tools/tree/master/gopls" rel="noopener noreferrer"&gt;gopls&lt;/a&gt; required. (&lt;code&gt;go get golang.org/x/tools/gopls&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Vim Script: &lt;a href="https://github.com/iamcco/vim-language-server" rel="noopener noreferrer"&gt;vim-language-server&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;C++/C：Install ccls with &lt;code&gt;brew install ccls&lt;/code&gt;. If you want to install latest version. Please install it manually &lt;a href="https://github.com/MaskRay/ccls" rel="noopener noreferrer"&gt;following this guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;CSS: &lt;a href="https://github.com/vscode-langservers/vscode-css-languageserver-bin" rel="noopener noreferrer"&gt;vscode-css-languageserver-bin&lt;/a&gt; required. (css-languageserver)，Css-languageserver dose not support CompletionProvider by default as it requires &lt;a href="https://github.com/neovim/nvim-lspconfig/wiki/Snippets-support" rel="noopener noreferrer"&gt;Snippets&lt;/a&gt;，You must install it manually.&lt;/li&gt;
&lt;li&gt;JSON: &lt;a href="https://github.com/vscode-langservers/vscode-json-languageserver-bin" rel="noopener noreferrer"&gt;json-languageserver&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;PHP: &lt;a href="https://www.npmjs.com/package/intelephense" rel="noopener noreferrer"&gt;intelephense&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dart: &lt;a href="https://storage.googleapis.com/dart-archive/" rel="noopener noreferrer"&gt;analysis-server-dart-snapshot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;HTML: &lt;a href="https://github.com/vscode-langservers/vscode-html-languageserver-bin" rel="noopener noreferrer"&gt;html-languageserver&lt;/a&gt; required. html-languageserver dose not support CompletionProvider by default. You must install &lt;a href="https://github.com/neovim/nvim-lspconfig/wiki/Snippets-support" rel="noopener noreferrer"&gt;Snippets&lt;/a&gt; manually.&lt;/li&gt;
&lt;li&gt;Shell: &lt;a href="https://github.com/bash-lsp/bash-language-server" rel="noopener noreferrer"&gt;bash-language-server&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;Java: &lt;a href="https://github.com/eclipse/eclipse.jdt.ls/" rel="noopener noreferrer"&gt;eclipse-jdt-ls&lt;/a&gt;, java 11 and upper version required.&lt;/li&gt;
&lt;li&gt;Cmake: &lt;a href="https://github.com/regen100/cmake-language-server" rel="noopener noreferrer"&gt;cmake-language-server&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;Kotlin: &lt;a href="https://github.com/fwcd/kotlin-language-server" rel="noopener noreferrer"&gt;kotlin-language-server&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;Rust: &lt;a href="https://github.com/rust-analyzer/rust-analyzer" rel="noopener noreferrer"&gt;rust-analyzer&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;Lua: &lt;a href="https://github.com/EmmyLua/EmmyLua-LanguageServer" rel="noopener noreferrer"&gt;emmylua-ls&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;Xml: &lt;a href="https://github.com/eclipse/lemminx" rel="noopener noreferrer"&gt;lemminx&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;Groovy: &lt;a href="https://github.com/prominic/groovy-language-server" rel="noopener noreferrer"&gt;groovy-language-server&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;Yaml: &lt;a href="https://github.com/redhat-developer/yaml-language-server" rel="noopener noreferrer"&gt;yaml-language-server&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;Ruby: &lt;a href="https://github.com/castwide/solargraph" rel="noopener noreferrer"&gt;solargraph&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;Nim: &lt;a href="https://github.com/PMunch/nimlsp" rel="noopener noreferrer"&gt;nimlsp&lt;/a&gt; required. &lt;a href="https://github.com/nim-lang/packages/blob/master/packages.json" rel="noopener noreferrer"&gt;packages.json&lt;/a&gt; downloading is very slow, You'd better intall minlsp manually via &lt;code&gt;choosenim&lt;/code&gt; follow &lt;a href="https://github.com/jayli/vim-easycomplete/issues/155#issuecomment-1041581629" rel="noopener noreferrer"&gt;this guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Deno: &lt;a href="https://morioh.com/p/84a54d70a7fa" rel="noopener noreferrer"&gt;Deno&lt;/a&gt; required. Use &lt;code&gt;:DenoCache&lt;/code&gt; command for &lt;code&gt;deno cache&lt;/code&gt; current ts/js file.&lt;/li&gt;
&lt;li&gt;C# : &lt;a href="http://www.omnisharp.net/" rel="noopener noreferrer"&gt;omnisharp&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;R: &lt;a href="https://github.com/REditorSupport/languageserver" rel="noopener noreferrer"&gt;r-languageserver&lt;/a&gt; required.&lt;/li&gt;
&lt;li&gt;TabNine: &lt;a href="https://www.tabnine.com/" rel="noopener noreferrer"&gt;TabNine&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Snippet Support
&lt;/h4&gt;

&lt;p&gt;Vim-EasyComplete does not support snippets by default. If you want snippet integration, you will first have to install &lt;code&gt;ultisnips&lt;/code&gt;. UltiSnips is compatible with Vim-EasyComplete out of the box. UltiSnips required python3 installed. Install with vim-plug:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;Plug &lt;span class="s1"&gt;'SirVer/ultisnips'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/jayli/vim-easycomplete/issues/171" rel="noopener noreferrer"&gt;Solution of "E319: No python3 provider found" Error in neovim 0.4.4 with ultisnips&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  TabNine Support
&lt;/h4&gt;

&lt;p&gt;Install TabNine: &lt;code&gt;:InstallLspServer tabnine&lt;/code&gt;. Then restart your vim/nvim.&lt;/p&gt;

&lt;p&gt;Set &lt;code&gt;let g:easycomplete_tabnine_enable = 0&lt;/code&gt; to disable TabNine. You can config TabNine by &lt;code&gt;g:easycomplete_tabnine_config&lt;/code&gt; witch contains two properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;line_limit&lt;/em&gt;: The number of lines before and after the cursor to send to TabNine. If the option is smaller, the performance may be improved. (default: 1000)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;max_num_result&lt;/em&gt;: Max results from TabNine. (default: 10)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:easycomplete_tabnine_config&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="s1"&gt;'line_limit'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="s1"&gt;'max_num_result'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, an API key is not required to use TabNine in vim-easycomplete. If you have a Tabnine's Pro API key or purchased a subscription license. To configure, you'll need to use the &lt;a href="https://www.tabnine.com/faq#special_commands" rel="noopener noreferrer"&gt;TabNine' magic string&lt;/a&gt;. Type &lt;code&gt;Tabnine::config&lt;/code&gt; in insert mode to open the configuration panel.&lt;/p&gt;




&lt;h3&gt;
  
  
  Add custom completion plugin
&lt;/h3&gt;

&lt;p&gt;Take snip as an example (&lt;a href="https://github.com/jayli/vim-easycomplete/blob/master/autoload/easycomplete/sources/snips.vim" rel="noopener noreferrer"&gt;source file&lt;/a&gt;) without lsp server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;au&lt;/span&gt; &lt;span class="nb"&gt;User&lt;/span&gt; easycomplete_custom_plugin &lt;span class="k"&gt;call&lt;/span&gt; easycomplete#RegisterSource&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;        &lt;span class="s1"&gt;'snips'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="s1"&gt;'whitelist'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'*'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="s1"&gt;'completor'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="s1"&gt;'easycomplete#sources#snips#completor'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="s1"&gt;'constructor'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'easycomplete#sources#snips#constructor'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt;  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another example with lsp server support is easier. &lt;a href="https://github.com/jayli/vim-easycomplete/blob/master/autoload/easycomplete/sources/py.vim" rel="noopener noreferrer"&gt;source file&lt;/a&gt;. By the way, you don't have to writing an omnifunc for Vim's omnicomplete.&lt;/p&gt;

&lt;p&gt;You can redefine a completion plugin via &lt;code&gt;easycomplete_custom_plugin&lt;/code&gt; event with the same name of default lsp plugin. For example. We replace &lt;code&gt;ts&lt;/code&gt; plugin's lsp server &lt;code&gt;tsserver&lt;/code&gt; by &lt;code&gt;typescript-language-server&lt;/code&gt;. Copy this code in your &lt;code&gt;.vimrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;au&lt;/span&gt; &lt;span class="nb"&gt;User&lt;/span&gt; easycomplete_custom_plugin &lt;span class="k"&gt;call&lt;/span&gt; easycomplete#RegisterSource&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="s1"&gt;'whitelist'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'javascript'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'typescript'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'javascript.jsx'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt;               &lt;span class="s1"&gt;'typescript.tsx'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'javascriptreact'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'typescriptreact'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="s1"&gt;'completor'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'g:Tss_Completor'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="s1"&gt;'constructor'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'g:Tss_Constructor'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="s1"&gt;'gotodefinition'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'g:Tss_GotoDefinition'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt; &lt;span class="s1"&gt;'command'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'typescript-language-server'&lt;/span&gt;
&lt;span class="se"&gt;    \&lt;/span&gt;  &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;g:Tss_Constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; ctx&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;executable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'typescript-language-server'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;call&lt;/span&gt; easycomplete#&lt;span class="nb"&gt;lsp&lt;/span&gt;#register_server&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="se"&gt;          \&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'typescript-language-server'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;          \&lt;/span&gt; &lt;span class="s1"&gt;'cmd'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;server_info&lt;span class="p"&gt;-&amp;gt;[&lt;/span&gt;&lt;span class="s1"&gt;'typescript-language-server'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'--stdio'&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;span class="se"&gt;          \&lt;/span&gt; &lt;span class="s1"&gt;'root_uri'&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;server_info&lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"file://"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;fnamemodify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;':p:h'&lt;/span&gt;&lt;span class="p"&gt;)},&lt;/span&gt;
&lt;span class="se"&gt;          \&lt;/span&gt; &lt;span class="s1"&gt;'initialization_options'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'diagnostics'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'true'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="se"&gt;          \&lt;/span&gt; &lt;span class="s1"&gt;'whitelist'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'javascript'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'typescript'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'javascript.jsx'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'typescript.tsx'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="se"&gt;          \&lt;/span&gt; &lt;span class="s1"&gt;'workspace_config'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
&lt;span class="se"&gt;          \&lt;/span&gt; &lt;span class="s1"&gt;'semantic_highlight'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
&lt;span class="se"&gt;          \&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="k"&gt;call&lt;/span&gt; easycomplete#util#&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"'typescript-language-server'"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="se"&gt;          \&lt;/span&gt; &lt;span class="s2"&gt;"is not avilable, Please install: '%s'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;          \&lt;/span&gt; &lt;span class="s1"&gt;'npm -g install typescript-language-server'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;endfunction&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;g:Tss_Completor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; ctx&lt;span class="p"&gt;)&lt;/span&gt; abort
  &lt;span class="k"&gt;return&lt;/span&gt; easycomplete#DoLspComplete&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;a:opt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;a:ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;endfunction&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;g:Tss_GotoDefinition&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; easycomplete#DoLspDefinition&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;"js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"jsx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"tsx"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;endfunction&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So you should redefine at least three functions &lt;code&gt;completor&lt;/code&gt;/&lt;code&gt;constructor&lt;/code&gt;/&lt;code&gt;gotodefinition&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beautify the vim completion menu
&lt;/h3&gt;

&lt;p&gt;There are four build-in popup menu themes in cterm: &lt;code&gt;blue&lt;/code&gt;,&lt;code&gt;light&lt;/code&gt;,&lt;code&gt;rider&lt;/code&gt; and &lt;code&gt;sharp&lt;/code&gt;. (&lt;code&gt;let g:easycomplete_scheme="sharp"&lt;/code&gt;). Customise vim completion menu via these configurations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;let g:easycomplete_menuflag_buf = '[B]'&lt;/code&gt; for keywords menu flag.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;let g:easycomplete_kindflag_buf = ''&lt;/code&gt; for keywords kind flag.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;let g:easycomplete_menuflag_dict = '[D]'&lt;/code&gt; for dictionary menu flag.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;let g:easycomplete_kindflag_dict = ''&lt;/code&gt; for dictionary kind flag.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;let g:easycomplete_menuflag_snip = '[S]'&lt;/code&gt; for snippets menu flag.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;let g:easycomplete_kindflag_snip = 's'&lt;/code&gt; for snippets kind flag.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;let g:easycomplete_kindflag_tabnine = ''&lt;/code&gt; for TabNine kind flag.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;let g:easycomplete_lsp_type_font = {...}&lt;/code&gt; for custom fonts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example configuration with &lt;a href="https://nerdfonts.com" rel="noopener noreferrer"&gt;https://nerdfonts.com&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:easycomplete_menuflag_buf&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:easycomplete_kindflag_buf&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"⚯"&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:easycomplete_menuflag_snip&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:easycomplete_kindflag_snip&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ട"&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:easycomplete_kindflag_dict&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"≡"&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:easycomplete_menuflag_dict&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:easycomplete_kindflag_tabnine&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:easycomplete_lsp_type_font&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'text'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'⚯'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="s1"&gt;'method'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'m'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="s1"&gt;'function'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'f'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'constructor'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'≡'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="s1"&gt;'field'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'f'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="s1"&gt;'default'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'d'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'variable'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'𝘤'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="s1"&gt;'class'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'c'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="s1"&gt;'interface'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'i'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'module'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'m'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="s1"&gt;'property'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'p'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'unit'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'u'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'value'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'𝘧'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="s1"&gt;'enum'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'e'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="s1"&gt;'keyword'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'k'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'snippet'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'𝘧'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="s1"&gt;'color'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'c'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="s1"&gt;'file'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'f'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'reference'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="s1"&gt;'folder'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'f'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'enummember'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'e'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'constant'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'c'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="s1"&gt;'struct'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'s'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'event'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'e'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'typeparameter'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'t'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'var'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'v'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="s1"&gt;'const'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'c'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'operator'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'o'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'t'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘵'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'f'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘧'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'c'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘤'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'m'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘮'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'u'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘶'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'e'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘦'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'s'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘴'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'v'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘷'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'i'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘪'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'p'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘱'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'k'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘬'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘳'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="s1"&gt;'o'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"𝘰"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'l'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"𝘭"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"𝘢"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="s1"&gt;'d'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'𝘥'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;      \&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can define icon alias via giving fullnames and shortname.&lt;/p&gt;

&lt;p&gt;screenshots:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgw.alicdn.com%2Fimgextra%2Fi4%2FO1CN01IZzToV1iOccEVRsqm_%21%216000000004403-2-tps-1720-1026.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgw.alicdn.com%2Fimgextra%2Fi4%2FO1CN01IZzToV1iOccEVRsqm_%21%216000000004403-2-tps-1720-1026.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Issues
&lt;/h3&gt;

&lt;p&gt;[WIP] If you have bug reports or feature suggestions, please use the &lt;a href="https://github.com/jayli/vim-easycomplete/issues/new" rel="noopener noreferrer"&gt;issue tracker&lt;/a&gt;. In the meantime feel free to read some of my thoughts at &lt;a href="https://zhuanlan.zhihu.com/p/366496399" rel="noopener noreferrer"&gt;https://zhuanlan.zhihu.com/p/366496399&lt;/a&gt;, &lt;a href="https://zhuanlan.zhihu.com/p/425555993" rel="noopener noreferrer"&gt;https://zhuanlan.zhihu.com/p/425555993&lt;/a&gt;, &lt;a href="https://medium.com/@lijing00333/how-to-improve-your-vim-coding-experience-with-vim-easycomplete-6a01be6d8a77" rel="noopener noreferrer"&gt;https://medium.com/@lijing00333/vim-easycomplete&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  More Examples:
&lt;/h3&gt;

&lt;p&gt;Update Deno Cache via &lt;code&gt;:DenoCache&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi4%2FO1CN01kjPu4M1FVNbRKVrUD_%21%216000000000492-1-tps-943-607.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi4%2FO1CN01kjPu4M1FVNbRKVrUD_%21%216000000000492-1-tps-943-607.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Directory selecting:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi2%2FO1CN01FciC1Q1WHV4HJ79qn_%21%216000000002763-1-tps-1027-663.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi2%2FO1CN01FciC1Q1WHV4HJ79qn_%21%216000000002763-1-tps-1027-663.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Handle backsapce typing&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi3%2FO1CN01obuQnJ1tIAoUNv8Up_%21%216000000005878-1-tps-880-689.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi3%2FO1CN01obuQnJ1tIAoUNv8Up_%21%216000000005878-1-tps-880-689.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TabNine supporting:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi3%2FO1CN013nBG6n1WjRE8rgMNi_%21%216000000002824-1-tps-933-364.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi3%2FO1CN013nBG6n1WjRE8rgMNi_%21%216000000002824-1-tps-933-364.gif"&gt;&lt;/a&gt;&lt;/p&gt;

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