simrat39 / symbols-outline.nvim

A tree like view for symbols in Neovim using the Language Server Protocol. Supports all your favourite languages.
MIT License
1.85k stars 97 forks source link

Using with session breaks on reopen #198

Open ehaynes99 opened 1 year ago

ehaynes99 commented 1 year ago

If you save sessions (various plugins for this, but they are all wrappers around the native :mksession), closing nvim with the view open and then restarting results in a broken outline view. Trying to toggle throws the first error below, and effectively every cursor movement afterwards throws the second error below.

Likely, this would be resolved by searching for an existing buffer at startup. I'll try to poke around at it as time allows. As a temporary workaround, I added this, which forces the buffer to be removed prior to updating the session:

vim.api.nvim_create_autocmd('FileType', {
  pattern = { 'Outline' },
  callback = function(args)
    vim.api.nvim_create_autocmd('VimLeavePre', {
      callback = function()
        vim.api.nvim_buf_delete(args.buf, { force = true })
      end
    })
  end,
})

Errors

Error executing vim.schedule lua callback: ...m/lazy/symbols-outline.nvim/lua/symbols-outline/view.lua:39: Failed to rename buffer
stack traceback:
        [C]: in function 'nvim_buf_set_name'
        ...m/lazy/symbols-outline.nvim/lua/symbols-outline/view.lua:39: in function 'setup_view'
        ...e/nvim/lazy/symbols-outline.nvim/lua/symbols-outline.lua:285: in function 'callback'
        /usr/share/nvim/runtime/lua/vim/lsp.lua:1951: in function 'handler'
        /usr/share/nvim/runtime/lua/vim/lsp.lua:1383: in function ''
        vim/_editor.lua: in function <vim/_editor.lua:0>
Error detected while processing CursorHold Autocommands for "*":
Error executing lua callback: ...e/nvim/lazy/symbols-outline.nvim/lua/symbols-outline.lua:208: Cursor position outside buffer
stack traceback:
        [C]: in function 'nvim_win_set_cursor'
        ...e/nvim/lazy/symbols-outline.nvim/lua/symbols-outline.lua:208: in function '_highlight_current_item'
        ...e/nvim/lazy/symbols-outline.nvim/lua/symbols-outline.lua:19: in function <...e/nvim/lazy/symbols-outline.nvim/lua/symbols-outline.l
ua:18>
gennaro-tedesco commented 1 year ago

Presumably this is related to https://github.com/simrat39/symbols-outline.nvim/issues/182: when closing all buffers the symbols outline remains somehow open, however not part of badd buffers in the session file. I have seen similar behaviours with other such plugins (file trees or symbols) while working on nvim-possession and I could not figure out why it is so.

showermat commented 1 year ago

I've been reworking my Vim config and started running into this error with both Symbols-outline.nvim and Neo-tree. I tried hacking together a fix that searches for buffers with specific names when the session is opened and re-executes the corresponding commands, but it's unusably brittle.

The workaround in comment 1 doesn't work for me -- I wonder if it's running after the session is saved in my setup. I don't know much about the ordering of autocommands for the same event.

ehaynes99 commented 1 year ago

The workaround in comment 1 doesn't work for me -- I wonder if it's running after the session is saved in my setup. I don't know much about the ordering of autocommands for the same event.

They'll run in the order in which they're defined if they're triggered by the same event, so adding yours before load the plugin that saves the session should do it. You would also need to know what event that plugin is using, though, to be sure your command is not using an event that occurs too late.

FWIW, I'm using https://github.com/rmagatti/auto-session. It saves on VimLeave, which would happen after the VimLeavePre that I hooked into: https://github.com/rmagatti/auto-session/blob/ba1606202588a1d4cc68360d6ef9549f0fc464a1/plugin/auto-session.vim#L36

Maybe try VimLeave, but it depends on how your session is being saved. If the plugin also uses VimLeave, I'm not entirely sure about the

showermat commented 1 year ago

Right, I gave it another shot today and got it to work without too much fuss by disabling the autocommand in the session manager and setting my own autocommand that does some cleanup before saving. Ideally, the plugin or the session manager would find a way to make such workarounds unnecessary, but I get that that's a hard problem.

theoribeiro commented 1 year ago

@showermat care to share your config?

showermat commented 1 year ago

It's pretty specific to my own setup, but sure. For xolox/vim-session with Neo-tree and Symbols-outline, I tell it not to automatically save:

let g:session_autosave = "no"

Then I define a function that closes Neo-tree and Symbols-outline, and then saves the session itself:

function! CleanupSession()
    Neotree close
    SymbolsOutlineClose
    SaveSession
    call xolox#session#auto_unlock()
endfunction

...and I call it from an autocommand:

autocmd VimLeavePre * call CleanupSession()

This effectively does the same thing as the "autosave" feature, but with my own customizations inserted beforehand.

Note that, as written, this relies on the pull request I opened a few days ago to keep SymbolsOutlineClose from raising an error if the pane isn't open.

burntfalafel commented 1 year ago

The issue is because the session file is not written correctly by symbols-tree plugin on close.

A stupid workaround for this;

Put the following in your vimrc:

function! FixSymbolsOutlineCloseCallback()
         SymbolsOutlineClose
         mksession /tmp/session.vim
         quitall
endfunction

Now simply open vim again and then do a source /tmp/session.vim and SymbolsOutline runs fine.