Latest commit

History

39 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gothx.vim

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

The idea of this Experimental plugin is twofold:

  1. To provide features which are not currently supported by gopls.
  • You'll need to install a separate LSP client. See below
  • As gopls grows and matures, any overlapping features will be deprecated/removed from gothx.vim (deprecated and replaced with messages 'use your LSC for this').
  1. To focus on modules-aware tooling only.
  • Avoid tools which are not actively embracing modules support (such as guru, which is being abandoned).

Note that this plugin doesn't hope to cover the same featureset as vim-go, (nor govim, probably). In fact, a third aim is to have a 'lighter' feature-set. gothx.vim will hopefully remain kinda small and nimble, and :ThxUpdateBinaries will hope to stay reasonably fast. I prefer using the same LSP client across different languages, so I'd sooner only use plugins which expressly avoid LSP-supplied features. vim-go's large feature-set overlaps with [recent] LSPs. You can configure vim-go to disable those overlapping features - I have documented those vim-go configuration options below, just in case that's what you're really looking for.

Install in the usual way

Pre-requisites: Use vim8 or neovim. Set up an LSP client (with gopls), for all the usual goodies like go-to-definition, get-referrers, format-on-save, etc.

Install the plugin [along with async.vim] in the usual way (depending on what plugin manager you use).

For example, using vim-plug:

Plug 'prabirshrestha/async.vim'
Plug 'laher/gothx.vim'

Installing/updating go-based tooling

Install (once only)

:ThxInstallBinaries

Upgrade (periodically)

:ThxUpdateBinaries

NOTE: if you have async.vim installed, gothx.vim will install your go things asynchronously … if not, it'll let you know it's blocking your UI thread.

Configuration

If you want :Thx… commands to resemble vim-go's :Go commands instead:

let g:gothx_command_prefix = 'Go' (default = Thx)

Features and Planned Features

You're free to map these commands to the vim-go names if you're not using vim-go - I just avoided it for compatibility reaons.

FeatureDonevim-go featureRelated ToolNotes
:ThxKeyify[x]:GoKeyifykeyify
:ThxAlt[x]:GoAlternateThis is just vim-script
:ThxTest[x]:GoTestBasic version, no options
:ThxRun[x]:GoRunBasic version, no options
:ThxImpl[x]:GoImplimpl
gx on import[x]-In vim, gx opens urls in a browser. Use it to opek gopkg.dev on import statements
:ThxPlay[x]:GoPlayvim-go uses vim-script plus curl. I'm using a tool which doesn't support line selection (yet).
:ThxIfErr[x]:GoIfErriferrIs this something gopls plans to cover?
:ThxFillStruct[x]:GoFillStruct
PlannedStartedvim-go featureRelated ToolNotes
:ThxDoc[ ]:GoDocgogetdocSee gx, above. Seems like a good start.
:ThxAddTags[ ]:GoAddTagsgomodifytags

LSP notes

The Vim ecosystem offers several LSP clients, including LanguageClient-neovim, vim-lsc, coc.nvim. Some plugins offer LSP features too, such as ALE and vim-go. In theory you can use any of these, although I haven't tried them all myself.

For the time being I recommend vim-lsp, because in combination with vim-lsp-settings and asymcomplete-lsp, it offers easy installation of Language Servers, and LSP-based completion support.

Recommended LSP Setup

To use vim-lsp using vim-plug, I recommend the following plugins:

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
Plug 'laher/gothx.vim'

note that this assumes vim-plug. Plugin managers tend to use a different function name for specifying plugins.

Out of scope

  • GoReferrers, GoDef, GoInfo, GoFmt, GoRename, ...
  • The following features as supported by gopls (March 2020):
    • check : show diagnostic results for the specified file
    • folding_ranges : display selected file's folding ranges
    • format : format the code according to the go standard
    • highlight : display selected identifier's highlights
    • implementation : display selected identifier's implementation
    • imports : updates import statements
    • links : list links in a file
    • prepare_rename : test validity of a rename operation at location
    • query : answer queries about go source code
    • references : display selected identifier's references
    • rename : rename selected identifier
    • signature : display selected identifier's signature
    • fix : apply suggested fixes
    • symbols : display selected file's symbols
  • guru: various vim-go commands (e.g. :GoChannelPeers, GoCallees, GoPointsTo, …) use guru, which is not modules-aware.

NOTES

Special love for vim-go

I LOVE the vim-go project. I fell in love with vim through that project, and between 2012-2020, it got me using vim or nvim as my main editor. vim-go was light-years ahead of other editors during the early days, and I think its 'lego blocks' architecture allowed for other plugin-writers to copy its features easily. Many thanks to the vim-go team, especially fatih and bc.

In the spirit of giving back, I'll make sure to offer PRs to vim-go for any features developed in gothx.vim . Please hold me to that.

Disabling LSP-supported features in vim-go

If you'd prefer to stick with vim-go but still avoid those feature-overlaps, the main thing you should do is to set g:go_pls_enabled=0. Note that there are a number of other LSP-supported features which vim-go solves in its own way. It seems like you can disable all of these using configuration settings. The following should get you most of the way there. Please let me know if you find others:

let g:go_gopls_enabled=0
let g:go_def_mapping_enabled=0
let g:go_doc_keywordprg_enabled=0
let g:go_fmt_autosave=0

I discussed with bc about automating these defaults based on a single item, or based on the presence of other LSPs. Given the variety of ways people are already using vim-go, bc understandably thought it would make the vim-go code and the user experience become more confusing, surprising, and harder to support. So, he updated the vim-go docs, and I've updated these docs, to clarify.

okthxvi!

About

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

39 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gothx.vim

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

The idea of this Experimental plugin is twofold:

  1. To provide features which are not currently supported by gopls.
  • You'll need to install a separate LSP client. See below
  • As gopls grows and matures, any overlapping features will be deprecated/removed from gothx.vim (deprecated and replaced with messages 'use your LSC for this').
  1. To focus on modules-aware tooling only.
  • Avoid tools which are not actively embracing modules support (such as guru, which is being abandoned).

Note that this plugin doesn't hope to cover the same featureset as vim-go, (nor govim, probably). In fact, a third aim is to have a 'lighter' feature-set. gothx.vim will hopefully remain kinda small and nimble, and :ThxUpdateBinaries will hope to stay reasonably fast. I prefer using the same LSP client across different languages, so I'd sooner only use plugins which expressly avoid LSP-supplied features. vim-go's large feature-set overlaps with [recent] LSPs. You can configure vim-go to disable those overlapping features - I have documented those vim-go configuration options below, just in case that's what you're really looking for.

Install in the usual way

Pre-requisites: Use vim8 or neovim. Set up an LSP client (with gopls), for all the usual goodies like go-to-definition, get-referrers, format-on-save, etc.

Install the plugin [along with async.vim] in the usual way (depending on what plugin manager you use).

For example, using vim-plug:

Plug 'prabirshrestha/async.vim'
Plug 'laher/gothx.vim'

Installing/updating go-based tooling

Install (once only)

:ThxInstallBinaries

Upgrade (periodically)

:ThxUpdateBinaries

NOTE: if you have async.vim installed, gothx.vim will install your go things asynchronously … if not, it'll let you know it's blocking your UI thread.

Configuration

If you want :Thx… commands to resemble vim-go's :Go commands instead:

let g:gothx_command_prefix = 'Go' (default = Thx)

Features and Planned Features

You're free to map these commands to the vim-go names if you're not using vim-go - I just avoided it for compatibility reaons.

FeatureDonevim-go featureRelated ToolNotes
:ThxKeyify[x]:GoKeyifykeyify
:ThxAlt[x]:GoAlternateThis is just vim-script
:ThxTest[x]:GoTestBasic version, no options
:ThxRun[x]:GoRunBasic version, no options
:ThxImpl[x]:GoImplimpl
gx on import[x]-In vim, gx opens urls in a browser. Use it to opek gopkg.dev on import statements
:ThxPlay[x]:GoPlayvim-go uses vim-script plus curl. I'm using a tool which doesn't support line selection (yet).
:ThxIfErr[x]:GoIfErriferrIs this something gopls plans to cover?
:ThxFillStruct[x]:GoFillStruct
PlannedStartedvim-go featureRelated ToolNotes
:ThxDoc[ ]:GoDocgogetdocSee gx, above. Seems like a good start.
:ThxAddTags[ ]:GoAddTagsgomodifytags

LSP notes

The Vim ecosystem offers several LSP clients, including LanguageClient-neovim, vim-lsc, coc.nvim. Some plugins offer LSP features too, such as ALE and vim-go. In theory you can use any of these, although I haven't tried them all myself.

For the time being I recommend vim-lsp, because in combination with vim-lsp-settings and asymcomplete-lsp, it offers easy installation of Language Servers, and LSP-based completion support.

Recommended LSP Setup

To use vim-lsp using vim-plug, I recommend the following plugins:

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
Plug 'laher/gothx.vim'

note that this assumes vim-plug. Plugin managers tend to use a different function name for specifying plugins.

Out of scope

  • GoReferrers, GoDef, GoInfo, GoFmt, GoRename, ...
  • The following features as supported by gopls (March 2020):
    • check : show diagnostic results for the specified file
    • folding_ranges : display selected file's folding ranges
    • format : format the code according to the go standard
    • highlight : display selected identifier's highlights
    • implementation : display selected identifier's implementation
    • imports : updates import statements
    • links : list links in a file
    • prepare_rename : test validity of a rename operation at location
    • query : answer queries about go source code
    • references : display selected identifier's references
    • rename : rename selected identifier
    • signature : display selected identifier's signature
    • fix : apply suggested fixes
    • symbols : display selected file's symbols
  • guru: various vim-go commands (e.g. :GoChannelPeers, GoCallees, GoPointsTo, …) use guru, which is not modules-aware.

NOTES

Special love for vim-go

I LOVE the vim-go project. I fell in love with vim through that project, and between 2012-2020, it got me using vim or nvim as my main editor. vim-go was light-years ahead of other editors during the early days, and I think its 'lego blocks' architecture allowed for other plugin-writers to copy its features easily. Many thanks to the vim-go team, especially fatih and bc.

In the spirit of giving back, I'll make sure to offer PRs to vim-go for any features developed in gothx.vim . Please hold me to that.

Disabling LSP-supported features in vim-go

If you'd prefer to stick with vim-go but still avoid those feature-overlaps, the main thing you should do is to set g:go_pls_enabled=0. Note that there are a number of other LSP-supported features which vim-go solves in its own way. It seems like you can disable all of these using configuration settings. The following should get you most of the way there. Please let me know if you find others:

let g:go_gopls_enabled=0
let g:go_def_mapping_enabled=0
let g:go_doc_keywordprg_enabled=0
let g:go_fmt_autosave=0

I discussed with bc about automating these defaults based on a single item, or based on the presence of other LSPs. Given the variety of ways people are already using vim-go, bc understandably thought it would make the vim-go code and the user experience become more confusing, surprising, and harder to support. So, he updated the vim-go docs, and I've updated these docs, to clarify.

okthxvi!

About

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

39 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gothx.vim

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

The idea of this Experimental plugin is twofold:

  1. To provide features which are not currently supported by gopls.
  • You'll need to install a separate LSP client. See below
  • As gopls grows and matures, any overlapping features will be deprecated/removed from gothx.vim (deprecated and replaced with messages 'use your LSC for this').
  1. To focus on modules-aware tooling only.
  • Avoid tools which are not actively embracing modules support (such as guru, which is being abandoned).

Note that this plugin doesn't hope to cover the same featureset as vim-go, (nor govim, probably). In fact, a third aim is to have a 'lighter' feature-set. gothx.vim will hopefully remain kinda small and nimble, and :ThxUpdateBinaries will hope to stay reasonably fast. I prefer using the same LSP client across different languages, so I'd sooner only use plugins which expressly avoid LSP-supplied features. vim-go's large feature-set overlaps with [recent] LSPs. You can configure vim-go to disable those overlapping features - I have documented those vim-go configuration options below, just in case that's what you're really looking for.

Install in the usual way

Pre-requisites: Use vim8 or neovim. Set up an LSP client (with gopls), for all the usual goodies like go-to-definition, get-referrers, format-on-save, etc.

Install the plugin [along with async.vim] in the usual way (depending on what plugin manager you use).

For example, using vim-plug:

Plug 'prabirshrestha/async.vim'
Plug 'laher/gothx.vim'

Installing/updating go-based tooling

Install (once only)

:ThxInstallBinaries

Upgrade (periodically)

:ThxUpdateBinaries

NOTE: if you have async.vim installed, gothx.vim will install your go things asynchronously … if not, it'll let you know it's blocking your UI thread.

Configuration

If you want :Thx… commands to resemble vim-go's :Go commands instead:

let g:gothx_command_prefix = 'Go' (default = Thx)

Features and Planned Features

You're free to map these commands to the vim-go names if you're not using vim-go - I just avoided it for compatibility reaons.

FeatureDonevim-go featureRelated ToolNotes
:ThxKeyify[x]:GoKeyifykeyify
:ThxAlt[x]:GoAlternateThis is just vim-script
:ThxTest[x]:GoTestBasic version, no options
:ThxRun[x]:GoRunBasic version, no options
:ThxImpl[x]:GoImplimpl
gx on import[x]-In vim, gx opens urls in a browser. Use it to opek gopkg.dev on import statements
:ThxPlay[x]:GoPlayvim-go uses vim-script plus curl. I'm using a tool which doesn't support line selection (yet).
:ThxIfErr[x]:GoIfErriferrIs this something gopls plans to cover?
:ThxFillStruct[x]:GoFillStruct
PlannedStartedvim-go featureRelated ToolNotes
:ThxDoc[ ]:GoDocgogetdocSee gx, above. Seems like a good start.
:ThxAddTags[ ]:GoAddTagsgomodifytags

LSP notes

The Vim ecosystem offers several LSP clients, including LanguageClient-neovim, vim-lsc, coc.nvim. Some plugins offer LSP features too, such as ALE and vim-go. In theory you can use any of these, although I haven't tried them all myself.

For the time being I recommend vim-lsp, because in combination with vim-lsp-settings and asymcomplete-lsp, it offers easy installation of Language Servers, and LSP-based completion support.

Recommended LSP Setup

To use vim-lsp using vim-plug, I recommend the following plugins:

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
Plug 'laher/gothx.vim'

note that this assumes vim-plug. Plugin managers tend to use a different function name for specifying plugins.

Out of scope

  • GoReferrers, GoDef, GoInfo, GoFmt, GoRename, ...
  • The following features as supported by gopls (March 2020):
    • check : show diagnostic results for the specified file
    • folding_ranges : display selected file's folding ranges
    • format : format the code according to the go standard
    • highlight : display selected identifier's highlights
    • implementation : display selected identifier's implementation
    • imports : updates import statements
    • links : list links in a file
    • prepare_rename : test validity of a rename operation at location
    • query : answer queries about go source code
    • references : display selected identifier's references
    • rename : rename selected identifier
    • signature : display selected identifier's signature
    • fix : apply suggested fixes
    • symbols : display selected file's symbols
  • guru: various vim-go commands (e.g. :GoChannelPeers, GoCallees, GoPointsTo, …) use guru, which is not modules-aware.

NOTES

Special love for vim-go

I LOVE the vim-go project. I fell in love with vim through that project, and between 2012-2020, it got me using vim or nvim as my main editor. vim-go was light-years ahead of other editors during the early days, and I think its 'lego blocks' architecture allowed for other plugin-writers to copy its features easily. Many thanks to the vim-go team, especially fatih and bc.

In the spirit of giving back, I'll make sure to offer PRs to vim-go for any features developed in gothx.vim . Please hold me to that.

Disabling LSP-supported features in vim-go

If you'd prefer to stick with vim-go but still avoid those feature-overlaps, the main thing you should do is to set g:go_pls_enabled=0. Note that there are a number of other LSP-supported features which vim-go solves in its own way. It seems like you can disable all of these using configuration settings. The following should get you most of the way there. Please let me know if you find others:

let g:go_gopls_enabled=0
let g:go_def_mapping_enabled=0
let g:go_doc_keywordprg_enabled=0
let g:go_fmt_autosave=0

I discussed with bc about automating these defaults based on a single item, or based on the presence of other LSPs. Given the variety of ways people are already using vim-go, bc understandably thought it would make the vim-go code and the user experience become more confusing, surprising, and harder to support. So, he updated the vim-go docs, and I've updated these docs, to clarify.

okthxvi!

About

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

39 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gothx.vim

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

The idea of this Experimental plugin is twofold:

  1. To provide features which are not currently supported by gopls.
  • You'll need to install a separate LSP client. See below
  • As gopls grows and matures, any overlapping features will be deprecated/removed from gothx.vim (deprecated and replaced with messages 'use your LSC for this').
  1. To focus on modules-aware tooling only.
  • Avoid tools which are not actively embracing modules support (such as guru, which is being abandoned).

Note that this plugin doesn't hope to cover the same featureset as vim-go, (nor govim, probably). In fact, a third aim is to have a 'lighter' feature-set. gothx.vim will hopefully remain kinda small and nimble, and :ThxUpdateBinaries will hope to stay reasonably fast. I prefer using the same LSP client across different languages, so I'd sooner only use plugins which expressly avoid LSP-supplied features. vim-go's large feature-set overlaps with [recent] LSPs. You can configure vim-go to disable those overlapping features - I have documented those vim-go configuration options below, just in case that's what you're really looking for.

Install in the usual way

Pre-requisites: Use vim8 or neovim. Set up an LSP client (with gopls), for all the usual goodies like go-to-definition, get-referrers, format-on-save, etc.

Install the plugin [along with async.vim] in the usual way (depending on what plugin manager you use).

For example, using vim-plug:

Plug 'prabirshrestha/async.vim'
Plug 'laher/gothx.vim'

Installing/updating go-based tooling

Install (once only)

:ThxInstallBinaries

Upgrade (periodically)

:ThxUpdateBinaries

NOTE: if you have async.vim installed, gothx.vim will install your go things asynchronously … if not, it'll let you know it's blocking your UI thread.

Configuration

If you want :Thx… commands to resemble vim-go's :Go commands instead:

let g:gothx_command_prefix = 'Go' (default = Thx)

Features and Planned Features

You're free to map these commands to the vim-go names if you're not using vim-go - I just avoided it for compatibility reaons.

FeatureDonevim-go featureRelated ToolNotes
:ThxKeyify[x]:GoKeyifykeyify
:ThxAlt[x]:GoAlternateThis is just vim-script
:ThxTest[x]:GoTestBasic version, no options
:ThxRun[x]:GoRunBasic version, no options
:ThxImpl[x]:GoImplimpl
gx on import[x]-In vim, gx opens urls in a browser. Use it to opek gopkg.dev on import statements
:ThxPlay[x]:GoPlayvim-go uses vim-script plus curl. I'm using a tool which doesn't support line selection (yet).
:ThxIfErr[x]:GoIfErriferrIs this something gopls plans to cover?
:ThxFillStruct[x]:GoFillStruct
PlannedStartedvim-go featureRelated ToolNotes
:ThxDoc[ ]:GoDocgogetdocSee gx, above. Seems like a good start.
:ThxAddTags[ ]:GoAddTagsgomodifytags

LSP notes

The Vim ecosystem offers several LSP clients, including LanguageClient-neovim, vim-lsc, coc.nvim. Some plugins offer LSP features too, such as ALE and vim-go. In theory you can use any of these, although I haven't tried them all myself.

For the time being I recommend vim-lsp, because in combination with vim-lsp-settings and asymcomplete-lsp, it offers easy installation of Language Servers, and LSP-based completion support.

Recommended LSP Setup

To use vim-lsp using vim-plug, I recommend the following plugins:

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
Plug 'laher/gothx.vim'

note that this assumes vim-plug. Plugin managers tend to use a different function name for specifying plugins.

Out of scope

  • GoReferrers, GoDef, GoInfo, GoFmt, GoRename, ...
  • The following features as supported by gopls (March 2020):
    • check : show diagnostic results for the specified file
    • folding_ranges : display selected file's folding ranges
    • format : format the code according to the go standard
    • highlight : display selected identifier's highlights
    • implementation : display selected identifier's implementation
    • imports : updates import statements
    • links : list links in a file
    • prepare_rename : test validity of a rename operation at location
    • query : answer queries about go source code
    • references : display selected identifier's references
    • rename : rename selected identifier
    • signature : display selected identifier's signature
    • fix : apply suggested fixes
    • symbols : display selected file's symbols
  • guru: various vim-go commands (e.g. :GoChannelPeers, GoCallees, GoPointsTo, …) use guru, which is not modules-aware.

NOTES

Special love for vim-go

I LOVE the vim-go project. I fell in love with vim through that project, and between 2012-2020, it got me using vim or nvim as my main editor. vim-go was light-years ahead of other editors during the early days, and I think its 'lego blocks' architecture allowed for other plugin-writers to copy its features easily. Many thanks to the vim-go team, especially fatih and bc.

In the spirit of giving back, I'll make sure to offer PRs to vim-go for any features developed in gothx.vim . Please hold me to that.

Disabling LSP-supported features in vim-go

If you'd prefer to stick with vim-go but still avoid those feature-overlaps, the main thing you should do is to set g:go_pls_enabled=0. Note that there are a number of other LSP-supported features which vim-go solves in its own way. It seems like you can disable all of these using configuration settings. The following should get you most of the way there. Please let me know if you find others:

let g:go_gopls_enabled=0
let g:go_def_mapping_enabled=0
let g:go_doc_keywordprg_enabled=0
let g:go_fmt_autosave=0

I discussed with bc about automating these defaults based on a single item, or based on the presence of other LSPs. Given the variety of ways people are already using vim-go, bc understandably thought it would make the vim-go code and the user experience become more confusing, surprising, and harder to support. So, he updated the vim-go docs, and I've updated these docs, to clarify.

okthxvi!

About

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

39 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gothx.vim

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

The idea of this Experimental plugin is twofold:

  1. To provide features which are not currently supported by gopls.
  • You'll need to install a separate LSP client. See below
  • As gopls grows and matures, any overlapping features will be deprecated/removed from gothx.vim (deprecated and replaced with messages 'use your LSC for this').
  1. To focus on modules-aware tooling only.
  • Avoid tools which are not actively embracing modules support (such as guru, which is being abandoned).

Note that this plugin doesn't hope to cover the same featureset as vim-go, (nor govim, probably). In fact, a third aim is to have a 'lighter' feature-set. gothx.vim will hopefully remain kinda small and nimble, and :ThxUpdateBinaries will hope to stay reasonably fast. I prefer using the same LSP client across different languages, so I'd sooner only use plugins which expressly avoid LSP-supplied features. vim-go's large feature-set overlaps with [recent] LSPs. You can configure vim-go to disable those overlapping features - I have documented those vim-go configuration options below, just in case that's what you're really looking for.

Install in the usual way

Pre-requisites: Use vim8 or neovim. Set up an LSP client (with gopls), for all the usual goodies like go-to-definition, get-referrers, format-on-save, etc.

Install the plugin [along with async.vim] in the usual way (depending on what plugin manager you use).

For example, using vim-plug:

Plug 'prabirshrestha/async.vim'
Plug 'laher/gothx.vim'

Installing/updating go-based tooling

Install (once only)

:ThxInstallBinaries

Upgrade (periodically)

:ThxUpdateBinaries

NOTE: if you have async.vim installed, gothx.vim will install your go things asynchronously … if not, it'll let you know it's blocking your UI thread.

Configuration

If you want :Thx… commands to resemble vim-go's :Go commands instead:

let g:gothx_command_prefix = 'Go' (default = Thx)

Features and Planned Features

You're free to map these commands to the vim-go names if you're not using vim-go - I just avoided it for compatibility reaons.

FeatureDonevim-go featureRelated ToolNotes
:ThxKeyify[x]:GoKeyifykeyify
:ThxAlt[x]:GoAlternateThis is just vim-script
:ThxTest[x]:GoTestBasic version, no options
:ThxRun[x]:GoRunBasic version, no options
:ThxImpl[x]:GoImplimpl
gx on import[x]-In vim, gx opens urls in a browser. Use it to opek gopkg.dev on import statements
:ThxPlay[x]:GoPlayvim-go uses vim-script plus curl. I'm using a tool which doesn't support line selection (yet).
:ThxIfErr[x]:GoIfErriferrIs this something gopls plans to cover?
:ThxFillStruct[x]:GoFillStruct
PlannedStartedvim-go featureRelated ToolNotes
:ThxDoc[ ]:GoDocgogetdocSee gx, above. Seems like a good start.
:ThxAddTags[ ]:GoAddTagsgomodifytags

LSP notes

The Vim ecosystem offers several LSP clients, including LanguageClient-neovim, vim-lsc, coc.nvim. Some plugins offer LSP features too, such as ALE and vim-go. In theory you can use any of these, although I haven't tried them all myself.

For the time being I recommend vim-lsp, because in combination with vim-lsp-settings and asymcomplete-lsp, it offers easy installation of Language Servers, and LSP-based completion support.

Recommended LSP Setup

To use vim-lsp using vim-plug, I recommend the following plugins:

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
Plug 'laher/gothx.vim'

note that this assumes vim-plug. Plugin managers tend to use a different function name for specifying plugins.

Out of scope

  • GoReferrers, GoDef, GoInfo, GoFmt, GoRename, ...
  • The following features as supported by gopls (March 2020):
    • check : show diagnostic results for the specified file
    • folding_ranges : display selected file's folding ranges
    • format : format the code according to the go standard
    • highlight : display selected identifier's highlights
    • implementation : display selected identifier's implementation
    • imports : updates import statements
    • links : list links in a file
    • prepare_rename : test validity of a rename operation at location
    • query : answer queries about go source code
    • references : display selected identifier's references
    • rename : rename selected identifier
    • signature : display selected identifier's signature
    • fix : apply suggested fixes
    • symbols : display selected file's symbols
  • guru: various vim-go commands (e.g. :GoChannelPeers, GoCallees, GoPointsTo, …) use guru, which is not modules-aware.

NOTES

Special love for vim-go

I LOVE the vim-go project. I fell in love with vim through that project, and between 2012-2020, it got me using vim or nvim as my main editor. vim-go was light-years ahead of other editors during the early days, and I think its 'lego blocks' architecture allowed for other plugin-writers to copy its features easily. Many thanks to the vim-go team, especially fatih and bc.

In the spirit of giving back, I'll make sure to offer PRs to vim-go for any features developed in gothx.vim . Please hold me to that.

Disabling LSP-supported features in vim-go

If you'd prefer to stick with vim-go but still avoid those feature-overlaps, the main thing you should do is to set g:go_pls_enabled=0. Note that there are a number of other LSP-supported features which vim-go solves in its own way. It seems like you can disable all of these using configuration settings. The following should get you most of the way there. Please let me know if you find others:

let g:go_gopls_enabled=0
let g:go_def_mapping_enabled=0
let g:go_doc_keywordprg_enabled=0
let g:go_fmt_autosave=0

I discussed with bc about automating these defaults based on a single item, or based on the presence of other LSPs. Given the variety of ways people are already using vim-go, bc understandably thought it would make the vim-go code and the user experience become more confusing, surprising, and harder to support. So, he updated the vim-go docs, and I've updated these docs, to clarify.

okthxvi!

About

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

39 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gothx.vim

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

The idea of this Experimental plugin is twofold:

  1. To provide features which are not currently supported by gopls.
  • You'll need to install a separate LSP client. See below
  • As gopls grows and matures, any overlapping features will be deprecated/removed from gothx.vim (deprecated and replaced with messages 'use your LSC for this').
  1. To focus on modules-aware tooling only.
  • Avoid tools which are not actively embracing modules support (such as guru, which is being abandoned).

Note that this plugin doesn't hope to cover the same featureset as vim-go, (nor govim, probably). In fact, a third aim is to have a 'lighter' feature-set. gothx.vim will hopefully remain kinda small and nimble, and :ThxUpdateBinaries will hope to stay reasonably fast. I prefer using the same LSP client across different languages, so I'd sooner only use plugins which expressly avoid LSP-supplied features. vim-go's large feature-set overlaps with [recent] LSPs. You can configure vim-go to disable those overlapping features - I have documented those vim-go configuration options below, just in case that's what you're really looking for.

Install in the usual way

Pre-requisites: Use vim8 or neovim. Set up an LSP client (with gopls), for all the usual goodies like go-to-definition, get-referrers, format-on-save, etc.

Install the plugin [along with async.vim] in the usual way (depending on what plugin manager you use).

For example, using vim-plug:

Plug 'prabirshrestha/async.vim'
Plug 'laher/gothx.vim'

Installing/updating go-based tooling

Install (once only)

:ThxInstallBinaries

Upgrade (periodically)

:ThxUpdateBinaries

NOTE: if you have async.vim installed, gothx.vim will install your go things asynchronously … if not, it'll let you know it's blocking your UI thread.

Configuration

If you want :Thx… commands to resemble vim-go's :Go commands instead:

let g:gothx_command_prefix = 'Go' (default = Thx)

Features and Planned Features

You're free to map these commands to the vim-go names if you're not using vim-go - I just avoided it for compatibility reaons.

FeatureDonevim-go featureRelated ToolNotes
:ThxKeyify[x]:GoKeyifykeyify
:ThxAlt[x]:GoAlternateThis is just vim-script
:ThxTest[x]:GoTestBasic version, no options
:ThxRun[x]:GoRunBasic version, no options
:ThxImpl[x]:GoImplimpl
gx on import[x]-In vim, gx opens urls in a browser. Use it to opek gopkg.dev on import statements
:ThxPlay[x]:GoPlayvim-go uses vim-script plus curl. I'm using a tool which doesn't support line selection (yet).
:ThxIfErr[x]:GoIfErriferrIs this something gopls plans to cover?
:ThxFillStruct[x]:GoFillStruct
PlannedStartedvim-go featureRelated ToolNotes
:ThxDoc[ ]:GoDocgogetdocSee gx, above. Seems like a good start.
:ThxAddTags[ ]:GoAddTagsgomodifytags

LSP notes

The Vim ecosystem offers several LSP clients, including LanguageClient-neovim, vim-lsc, coc.nvim. Some plugins offer LSP features too, such as ALE and vim-go. In theory you can use any of these, although I haven't tried them all myself.

For the time being I recommend vim-lsp, because in combination with vim-lsp-settings and asymcomplete-lsp, it offers easy installation of Language Servers, and LSP-based completion support.

Recommended LSP Setup

To use vim-lsp using vim-plug, I recommend the following plugins:

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
Plug 'laher/gothx.vim'

note that this assumes vim-plug. Plugin managers tend to use a different function name for specifying plugins.

Out of scope

  • GoReferrers, GoDef, GoInfo, GoFmt, GoRename, ...
  • The following features as supported by gopls (March 2020):
    • check : show diagnostic results for the specified file
    • folding_ranges : display selected file's folding ranges
    • format : format the code according to the go standard
    • highlight : display selected identifier's highlights
    • implementation : display selected identifier's implementation
    • imports : updates import statements
    • links : list links in a file
    • prepare_rename : test validity of a rename operation at location
    • query : answer queries about go source code
    • references : display selected identifier's references
    • rename : rename selected identifier
    • signature : display selected identifier's signature
    • fix : apply suggested fixes
    • symbols : display selected file's symbols
  • guru: various vim-go commands (e.g. :GoChannelPeers, GoCallees, GoPointsTo, …) use guru, which is not modules-aware.

NOTES

Special love for vim-go

I LOVE the vim-go project. I fell in love with vim through that project, and between 2012-2020, it got me using vim or nvim as my main editor. vim-go was light-years ahead of other editors during the early days, and I think its 'lego blocks' architecture allowed for other plugin-writers to copy its features easily. Many thanks to the vim-go team, especially fatih and bc.

In the spirit of giving back, I'll make sure to offer PRs to vim-go for any features developed in gothx.vim . Please hold me to that.

Disabling LSP-supported features in vim-go

If you'd prefer to stick with vim-go but still avoid those feature-overlaps, the main thing you should do is to set g:go_pls_enabled=0. Note that there are a number of other LSP-supported features which vim-go solves in its own way. It seems like you can disable all of these using configuration settings. The following should get you most of the way there. Please let me know if you find others:

let g:go_gopls_enabled=0
let g:go_def_mapping_enabled=0
let g:go_doc_keywordprg_enabled=0
let g:go_fmt_autosave=0

I discussed with bc about automating these defaults based on a single item, or based on the presence of other LSPs. Given the variety of ways people are already using vim-go, bc understandably thought it would make the vim-go code and the user experience become more confusing, surprising, and harder to support. So, he updated the vim-go docs, and I've updated these docs, to clarify.

okthxvi!

About

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

39 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gothx.vim

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

The idea of this Experimental plugin is twofold:

  1. To provide features which are not currently supported by gopls.
  • You'll need to install a separate LSP client. See below
  • As gopls grows and matures, any overlapping features will be deprecated/removed from gothx.vim (deprecated and replaced with messages 'use your LSC for this').
  1. To focus on modules-aware tooling only.
  • Avoid tools which are not actively embracing modules support (such as guru, which is being abandoned).

Note that this plugin doesn't hope to cover the same featureset as vim-go, (nor govim, probably). In fact, a third aim is to have a 'lighter' feature-set. gothx.vim will hopefully remain kinda small and nimble, and :ThxUpdateBinaries will hope to stay reasonably fast. I prefer using the same LSP client across different languages, so I'd sooner only use plugins which expressly avoid LSP-supplied features. vim-go's large feature-set overlaps with [recent] LSPs. You can configure vim-go to disable those overlapping features - I have documented those vim-go configuration options below, just in case that's what you're really looking for.

Install in the usual way

Pre-requisites: Use vim8 or neovim. Set up an LSP client (with gopls), for all the usual goodies like go-to-definition, get-referrers, format-on-save, etc.

Install the plugin [along with async.vim] in the usual way (depending on what plugin manager you use).

For example, using vim-plug:

Plug 'prabirshrestha/async.vim'
Plug 'laher/gothx.vim'

Installing/updating go-based tooling

Install (once only)

:ThxInstallBinaries

Upgrade (periodically)

:ThxUpdateBinaries

NOTE: if you have async.vim installed, gothx.vim will install your go things asynchronously … if not, it'll let you know it's blocking your UI thread.

Configuration

If you want :Thx… commands to resemble vim-go's :Go commands instead:

let g:gothx_command_prefix = 'Go' (default = Thx)

Features and Planned Features

You're free to map these commands to the vim-go names if you're not using vim-go - I just avoided it for compatibility reaons.

FeatureDonevim-go featureRelated ToolNotes
:ThxKeyify[x]:GoKeyifykeyify
:ThxAlt[x]:GoAlternateThis is just vim-script
:ThxTest[x]:GoTestBasic version, no options
:ThxRun[x]:GoRunBasic version, no options
:ThxImpl[x]:GoImplimpl
gx on import[x]-In vim, gx opens urls in a browser. Use it to opek gopkg.dev on import statements
:ThxPlay[x]:GoPlayvim-go uses vim-script plus curl. I'm using a tool which doesn't support line selection (yet).
:ThxIfErr[x]:GoIfErriferrIs this something gopls plans to cover?
:ThxFillStruct[x]:GoFillStruct
PlannedStartedvim-go featureRelated ToolNotes
:ThxDoc[ ]:GoDocgogetdocSee gx, above. Seems like a good start.
:ThxAddTags[ ]:GoAddTagsgomodifytags

LSP notes

The Vim ecosystem offers several LSP clients, including LanguageClient-neovim, vim-lsc, coc.nvim. Some plugins offer LSP features too, such as ALE and vim-go. In theory you can use any of these, although I haven't tried them all myself.

For the time being I recommend vim-lsp, because in combination with vim-lsp-settings and asymcomplete-lsp, it offers easy installation of Language Servers, and LSP-based completion support.

Recommended LSP Setup

To use vim-lsp using vim-plug, I recommend the following plugins:

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
Plug 'laher/gothx.vim'

note that this assumes vim-plug. Plugin managers tend to use a different function name for specifying plugins.

Out of scope

  • GoReferrers, GoDef, GoInfo, GoFmt, GoRename, ...
  • The following features as supported by gopls (March 2020):
    • check : show diagnostic results for the specified file
    • folding_ranges : display selected file's folding ranges
    • format : format the code according to the go standard
    • highlight : display selected identifier's highlights
    • implementation : display selected identifier's implementation
    • imports : updates import statements
    • links : list links in a file
    • prepare_rename : test validity of a rename operation at location
    • query : answer queries about go source code
    • references : display selected identifier's references
    • rename : rename selected identifier
    • signature : display selected identifier's signature
    • fix : apply suggested fixes
    • symbols : display selected file's symbols
  • guru: various vim-go commands (e.g. :GoChannelPeers, GoCallees, GoPointsTo, …) use guru, which is not modules-aware.

NOTES

Special love for vim-go

I LOVE the vim-go project. I fell in love with vim through that project, and between 2012-2020, it got me using vim or nvim as my main editor. vim-go was light-years ahead of other editors during the early days, and I think its 'lego blocks' architecture allowed for other plugin-writers to copy its features easily. Many thanks to the vim-go team, especially fatih and bc.

In the spirit of giving back, I'll make sure to offer PRs to vim-go for any features developed in gothx.vim . Please hold me to that.

Disabling LSP-supported features in vim-go

If you'd prefer to stick with vim-go but still avoid those feature-overlaps, the main thing you should do is to set g:go_pls_enabled=0. Note that there are a number of other LSP-supported features which vim-go solves in its own way. It seems like you can disable all of these using configuration settings. The following should get you most of the way there. Please let me know if you find others:

let g:go_gopls_enabled=0
let g:go_def_mapping_enabled=0
let g:go_doc_keywordprg_enabled=0
let g:go_fmt_autosave=0

I discussed with bc about automating these defaults based on a single item, or based on the presence of other LSPs. Given the variety of ways people are already using vim-go, bc understandably thought it would make the vim-go code and the user experience become more confusing, surprising, and harder to support. So, he updated the vim-go docs, and I've updated these docs, to clarify.

okthxvi!

About

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

39 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

gothx.vim

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

The idea of this Experimental plugin is twofold:

  1. To provide features which are not currently supported by gopls.
  • You'll need to install a separate LSP client. See below
  • As gopls grows and matures, any overlapping features will be deprecated/removed from gothx.vim (deprecated and replaced with messages 'use your LSC for this').
  1. To focus on modules-aware tooling only.
  • Avoid tools which are not actively embracing modules support (such as guru, which is being abandoned).

Note that this plugin doesn't hope to cover the same featureset as vim-go, (nor govim, probably). In fact, a third aim is to have a 'lighter' feature-set. gothx.vim will hopefully remain kinda small and nimble, and :ThxUpdateBinaries will hope to stay reasonably fast. I prefer using the same LSP client across different languages, so I'd sooner only use plugins which expressly avoid LSP-supplied features. vim-go's large feature-set overlaps with [recent] LSPs. You can configure vim-go to disable those overlapping features - I have documented those vim-go configuration options below, just in case that's what you're really looking for.

Install in the usual way

Pre-requisites: Use vim8 or neovim. Set up an LSP client (with gopls), for all the usual goodies like go-to-definition, get-referrers, format-on-save, etc.

Install the plugin [along with async.vim] in the usual way (depending on what plugin manager you use).

For example, using vim-plug:

Plug 'prabirshrestha/async.vim'
Plug 'laher/gothx.vim'

Installing/updating go-based tooling

Install (once only)

:ThxInstallBinaries

Upgrade (periodically)

:ThxUpdateBinaries

NOTE: if you have async.vim installed, gothx.vim will install your go things asynchronously … if not, it'll let you know it's blocking your UI thread.

Configuration

If you want :Thx… commands to resemble vim-go's :Go commands instead:

let g:gothx_command_prefix = 'Go' (default = Thx)

Features and Planned Features

You're free to map these commands to the vim-go names if you're not using vim-go - I just avoided it for compatibility reaons.

FeatureDonevim-go featureRelated ToolNotes
:ThxKeyify[x]:GoKeyifykeyify
:ThxAlt[x]:GoAlternateThis is just vim-script
:ThxTest[x]:GoTestBasic version, no options
:ThxRun[x]:GoRunBasic version, no options
:ThxImpl[x]:GoImplimpl
gx on import[x]-In vim, gx opens urls in a browser. Use it to opek gopkg.dev on import statements
:ThxPlay[x]:GoPlayvim-go uses vim-script plus curl. I'm using a tool which doesn't support line selection (yet).
:ThxIfErr[x]:GoIfErriferrIs this something gopls plans to cover?
:ThxFillStruct[x]:GoFillStruct
PlannedStartedvim-go featureRelated ToolNotes
:ThxDoc[ ]:GoDocgogetdocSee gx, above. Seems like a good start.
:ThxAddTags[ ]:GoAddTagsgomodifytags

LSP notes

The Vim ecosystem offers several LSP clients, including LanguageClient-neovim, vim-lsc, coc.nvim. Some plugins offer LSP features too, such as ALE and vim-go. In theory you can use any of these, although I haven't tried them all myself.

For the time being I recommend vim-lsp, because in combination with vim-lsp-settings and asymcomplete-lsp, it offers easy installation of Language Servers, and LSP-based completion support.

Recommended LSP Setup

To use vim-lsp using vim-plug, I recommend the following plugins:

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
Plug 'laher/gothx.vim'

note that this assumes vim-plug. Plugin managers tend to use a different function name for specifying plugins.

Out of scope

  • GoReferrers, GoDef, GoInfo, GoFmt, GoRename, ...
  • The following features as supported by gopls (March 2020):
    • check : show diagnostic results for the specified file
    • folding_ranges : display selected file's folding ranges
    • format : format the code according to the go standard
    • highlight : display selected identifier's highlights
    • implementation : display selected identifier's implementation
    • imports : updates import statements
    • links : list links in a file
    • prepare_rename : test validity of a rename operation at location
    • query : answer queries about go source code
    • references : display selected identifier's references
    • rename : rename selected identifier
    • signature : display selected identifier's signature
    • fix : apply suggested fixes
    • symbols : display selected file's symbols
  • guru: various vim-go commands (e.g. :GoChannelPeers, GoCallees, GoPointsTo, …) use guru, which is not modules-aware.

NOTES

Special love for vim-go

I LOVE the vim-go project. I fell in love with vim through that project, and between 2012-2020, it got me using vim or nvim as my main editor. vim-go was light-years ahead of other editors during the early days, and I think its 'lego blocks' architecture allowed for other plugin-writers to copy its features easily. Many thanks to the vim-go team, especially fatih and bc.

In the spirit of giving back, I'll make sure to offer PRs to vim-go for any features developed in gothx.vim . Please hold me to that.

Disabling LSP-supported features in vim-go

If you'd prefer to stick with vim-go but still avoid those feature-overlaps, the main thing you should do is to set g:go_pls_enabled=0. Note that there are a number of other LSP-supported features which vim-go solves in its own way. It seems like you can disable all of these using configuration settings. The following should get you most of the way there. Please let me know if you find others:

let g:go_gopls_enabled=0
let g:go_def_mapping_enabled=0
let g:go_doc_keywordprg_enabled=0
let g:go_fmt_autosave=0

I discussed with bc about automating these defaults based on a single item, or based on the presence of other LSPs. Given the variety of ways people are already using vim-go, bc understandably thought it would make the vim-go code and the user experience become more confusing, surprising, and harder to support. So, he updated the vim-go docs, and I've updated these docs, to clarify.

okthxvi!

About

A go plugin for vim/nvim, which only tries to do things that gopls doesn't do. thx.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages