tmux-plugins / tmux-resurrect

Persists tmux environment across system restarts.
MIT License
11.12k stars 416 forks source link

Neovim instances do not get resurrected with tmux 3.2 #394

Open mroavi opened 3 years ago

mroavi commented 3 years ago

Neovim instances do not get restored with tmux 3.2 while vim instances do. Here is a demo that shows this:

Peek 2021-08-06 16-35_tmux-resurrect-bug-with0tmux3 2

Tested on: OS: Manjaro Linux x86_64 Kernel: 5.10.53-1-MANJARO Shell: zsh 5.8 Terminal: alacritty 0.8.0 (a1b13e68)

cartesius82 commented 3 years ago

I confirm this issue also on Arch Linux. neovim v0.5.0 + kitty terminal.

Odas0R commented 2 years ago

Same here wsl2 + Ubuntu 20.04 + neovim v0.5.0 + windows terminal

norogoth commented 2 years ago

I am losing my nvim only on restart. Works great if I close terminal and re-resurrect. On Debian 11, neovim, xfce terminal

norogoth commented 2 years ago

May be related to my issue #421. It may be due to folders being deleted in /tmp

camgraff commented 2 years ago

I experienced this when using the neovim AppImage.

The issue is that when using the appimage, the save_command ps strategy resolves the nvim command as something like:

/tmp/.mount_nvimBLrhe6/usr/bin/nvim -S

But in order, to succesfully restore the neovim session, it expects the command to just be

nvim -s
norogoth commented 2 years ago

@camgraff Thanks! I'll have to take a look!

spywhere commented 2 years ago

I have faced the same issue for quite some time and just found out the solution that work for me.

I have my neovim installed through asdf-vm, in which the binary is a shim file that executing the actual version-managed binary in the shim directory it managed.

If I ran which nvim, it will produced /Users/username/.asdf/shims/nvim hence it would not get restored as @camgraff explained above.

To fix the issue, I simply set set -g @resurrect-processes '~nvim' to restore the command with nvim in the full command. Refers to the link below for the full explanation on how it works.

Restoring Programs

EDIT: If there are arguments expected to be save, just use set -g @resurrect-processes '"~nvim->nvim *"' to have resurrect also kept the arguments. This should help in case of @SerhatTeker where there are multiple instances of the same process with a different arguments.

skogsbrus commented 2 years ago

@spywhere's suggestion works for me to launch vim, but state is not relaunched automatically (using obsession.vim).

Just using

      set -g @resurrect-strategy-vim 'session'
      set -g @resurrect-strategy-nvim 'session'

just gives me an empty shell.

I'm using NixOS, so paths are also a bit weird for me.

SerhatTeker commented 2 years ago

As @camgraff mentioned that the problem is totally related to /tmp/.mount_nvimXXXXXX/usr/bin/nvim -S.

However I couldn't use @spywhere solution —set -g @resurrect-processes '~nvim', since I'm spinning nvim instances with both -S and -u init.lua like below.

# ~/.local/share/tmux/resurrect/sessions/last
pane    session 0   1   :*  0   :/home/user/dir 1   nvim    :/tmp/.mount_nvimYGd2jH/usr/bin/nvim -u /home/user/.local/share/lunarvim/lvim/init.lua
pane    session 1   1   :*  0   :/home/user/dir 1   nvim    :/tmp/.mount_nvimgLpUP0/usr/bin/nvim -S

As a solution, I've added a post-save-hook using sed to clean /tmp/... parts:

resurrect_dir="$XDG_DATA_HOME/tmux/resurrect/sessions"
set -g @resurrect-dir $resurrect_dir

set -g @resurrect-hook-post-save-all 'sed -i "s/\/tmp.*nvim/nvim/" $resurrect_dir/last'

The result will be like:

# ~/.local/share/tmux/resurrect/sessions/last
pane    session 0   1   :*  0   :/home/user/dir 1   nvim    :nvim -u /home/user/.local/share/lunarvim/lvim/init.lua
pane    session 1   1   :*  0   :/home/user/dir 1   nvim    :nvim -S

P.S: Also related to https://github.com/LunarVim/LunarVim/issues/1987

mikeslattery commented 11 months ago

I make a workaround that solved it, but it requires Go.

// nvim.go
// A simple wrapper over nvim.appimage.

package main

import (
    "os"
    "os/exec"
    "syscall"
)

func main() {
    cmd := exec.Command("nvim.appimage", os.Args[1:]...)

    cmd.Stdin = os.Stdin
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    err := cmd.Run()
    if err != nil {
        if exitError, ok := err.(*exec.ExitError); ok {
            waitStatus := exitError.Sys().(syscall.WaitStatus)
            os.Exit(waitStatus.ExitStatus())
        } else {
            os.Exit(1)
        }
    }
}

To install. nvim.appimage must be in your path.

go build nvim.go
cp nvim ~/.local/bin/nvim
SamuelCano03 commented 8 months ago

I've made the same as @SerhatTeker (but i'm using nvchad instead of lunar vim). This is my related conf in tmux.config:

set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @resurrect-hook-post-save-all 'sed -i "s/\/tmp.*nvim/nvim/" /home/samuel/.local/share/tmux/resurrect/last'

I've checked that /home/samuel/.local/share/tmux/resurrect/ is my path to file sessions of tmux-resurrect. This is the content of last file:

➜  resurrect  cat last 
pane    0       1       1       :*      1       Lenova  :/home/samuel   1       nvim    :nvim
window  0       1       :nvim   1       :*      bbfd,122x25,0,0,0       :
state   0

If I kill the tmux session (it's the same if you open tmux after restarting), and open it again, the content of neovim sessions don't get restored, only I get a empty sheel.

As you can see, the /tmp/.mount_nvimXXXXXX/usr/bin/nvim path is changed to only nvim. But in @SerhatTeker 's last file there is a -S tag which is not present in mine. Any help?

OS: Ubuntu 22.04 Tmux version: 3.2a

AThilenius commented 6 months ago

Any chance someone has the know-how to upstream a fix? I love this plugin, but not having neovim restore is a real bummer.