Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

https://github.com/rmagatti/goto-preview

A small Neovim plugin for previewing definitions using floating windows.
https://github.com/rmagatti/goto-preview

hacktoberfest lua neovim neovim-plugin

Last synced: 2 months ago
JSON representation

A small Neovim plugin for previewing definitions using floating windows.

Lists

README

        

## ⭐ Goto Preview
A small Neovim plugin for previewing native LSP's goto definition, type definition, implementation, declaration and references calls in floating windows.

### 🚀 Showcase

#### 🔗 References

### ⚠️ IMPORTANT NOTE
Make sure you use Neovim `0.5.1` or GUIs like [Goneovim](https://github.com/akiyosi/goneovim) and [Uivonim](https://github.com/smolck/uivonim).

There is a bug in [Neovim `0.5`](https://github.com/neovim/neovim/issues/14735) that prevents the correct positioning of more than one preview window.

### 📦 Installation
[Packer.nvim](https://github.com/wbthomason/packer.nvim)
```lua
use {
'rmagatti/goto-preview',
config = function()
require('goto-preview').setup {}
end
}
```
[vim-plug](https://github.com/junegunn/vim-plug)
```vim
Plug 'rmagatti/goto-preview'

" Then at some later point (outside of the plug block):
:lua require('goto-preview').setup {}
```

### ⚙️ Configuration

**Default**
```lua
require('goto-preview').setup {
width = 120; -- Width of the floating window
height = 15; -- Height of the floating window
border = {"↖", "─" ,"┐", "│", "┘", "─", "└", "│"}; -- Border characters of the floating window
default_mappings = false; -- Bind default mappings
debug = false; -- Print debug information
opacity = nil; -- 0-100 opacity level of the floating window where 100 is fully transparent.
resizing_mappings = false; -- Binds arrow keys to resizing the floating window.
post_open_hook = nil; -- A function taking two arguments, a buffer and a window to be ran as a hook.
post_close_hook = nil; -- A function taking two arguments, a buffer and a window to be ran as a hook.
references = { -- Configure the telescope UI for slowing the references cycling window.
telescope = require("telescope.themes").get_dropdown({ hide_preview = false })
};
-- These two configs can also be passed down to the goto-preview definition and implementation calls for one off "peak" functionality.
focus_on_open = true; -- Focus the floating window when opening it.
dismiss_on_move = false; -- Dismiss the floating window when moving the cursor.
force_close = true, -- passed into vim.api.nvim_win_close's second argument. See :h nvim_win_close
bufhidden = "wipe", -- the bufhidden option to set on the floating window. See :h bufhidden
stack_floating_preview_windows = true, -- Whether to nest floating windows
preview_window_title = { enable = true, position = "left" }, -- Whether to set the preview window title as the filename
}
```

The `post_open_hook` function gets called right before setting the cursor position in the new floating window.
One can use this to set custom key bindings or really anything else they want to do when a new preview window opens.

The `post_close_hook` function gets called right before closing the preview window. This can be used to undo any
custom key bindings when you leave the preview window.

### ⌨️ Mappings
There are no mappings by default, you can set `default_mappings = true` in the config to make use of the mappings I use or define your own.

**Default**
```viml
nnoremap gpd lua require('goto-preview').goto_preview_definition()
nnoremap gpt lua require('goto-preview').goto_preview_type_definition()
nnoremap gpi lua require('goto-preview').goto_preview_implementation()
nnoremap gpD lua require('goto-preview').goto_preview_declaration()
nnoremap gP lua require('goto-preview').close_all_win()
nnoremap gpr lua require('goto-preview').goto_preview_references()
```

**Custom example**
```lua
vim.keymap.set("n", "gp", "lua require('goto-preview').goto_preview_definition()", {noremap=true})
```

### 📚 Custom Options

The `close_all_win` function takes an optional table as an argument.

Example usage:
```lua
require("goto-preview").close_all_win { skip_curr_window = true }
```

### Window manipulation
One can manipulate floating windows with the regular Vim window moving commands. See `:h window-moving`.
Example:

### Supported languages
Goto Preview should work with LSP responses for most languages now! If something doesn't work as expected, drop an issue and I'll be happy to check it out!

**Note:** different language servers have potentially different shapes for the result of the `textDocument/definition`, `textDocument/typeDefinition`, `textDocument/implementation` and `textDocument/declaration` calls.
Until more are added one can pass in custom responses through the `lsp_configs` config value. Just follow the same pattern returning two values, a `target (string)` and a `cursor_position ({line_num, col_num})`. The `data` parameter is the `[1]` of the LSP's `result` of the definition/implementation calls and is what gets passed into the custom `get_config` function.

### Tested with
```
NVIM v0.5.0-dev+7d4f890aa
Build type: Release
LuaJIT 2.1.0-beta3
```