¿Cómo guardar y restaurar múltiples sesiones diferentes en Vim?

367

Dependiendo de mi tarea en Vim, tengo varias pestañas abiertas.

¿Cómo puedo guardar diferentes sesiones para su uso posterior?

Jogusa
fuente
16
@ldigas Creo que las personas se sienten más cómodas encontrando la pregunta aquí (con la fuente grande, gran formato ...) que en un foro de la vieja escuela o una documentación de terminal, o, Dios no lo quiera, una manpágina
puk
66
@ldigas Personalmente, las páginas de manual b / c siempre me han asustado, no me dejan con la boca abierta. Al igual que todo lo demás en Linux, tiene una curva de aprendizaje empinada.
puk
45
@Idigas: creo que se está perdiendo el punto de que entre la inteligencia colectiva de nosotros, Google y la gestión de metaconocimiento de desbordamiento de pila, esta es simplemente una mejor manera de obtener sus respuestas: lo que necesita, no una larga lista de opciones esotéricas, también como esta página ilustra la experiencia del mundo real de las trampas, y a menudo atajos realmente ingeniosos para facilitarle la vida. Esto se aplica igualmente a casi cualquier manual que he visto (excepto tal vez el manual en línea php). ¡Viva stackoverflow!
ErichBSchulz
2
@ldigas y las personas pueden usarlo para referencia futura, ya que alguien más podría necesitarlo.
Mansuro
44
@idigas Creo que estas preguntas son reales en el sentido de que un principiante de vim no sabe mucho sobre el sistema de ayuda y cómo usarlo, pero si se vuelven más experimentados sabrán cómo encontrar su camino en vim.
Edgar Klerks

Respuestas:

494

Quieres algo como

:mksession ~/mysession.vim

Luego, puede obtener ese archivo vim y recuperará su sesión anterior:

:source ~/mysession.vim

o abra vim con la opción -S:

$ vim -S ~/mysession.vim
Benj
fuente
27
Ooo, y casi olvido que puedes volver a cargarlo escribiendo: gvim -S ~ / mysession.vim
Benj
1
Gracias @Benj. Soy nuevo en vim. ¿Cómo puedo 'fuente' en la línea de comando?
Jogusa
1
Ooops! Lo siento Benj, me refería al modo comando. Ya lo he encontrado: ``: source ~ / mysession.vim´´.
Jogusa
8
Corto es: so ~ / file. Si desea obtener el archivo actual de una manera simple, entonces% hará el trabajo por usted.
Daniel Baulig
14
Si no especifica un nombre de archivo de sesión, se escribirá y leerá de forma predeterminada Session.vim. Entonces, si solo desea tener una sola sesión guardada en su directorio actual, puede usar :mksessiono :mksdesde vim para guardar su sesión actual, y solo vim -Spara abrirla nuevamente.
anishpatel
59

Es posible que desee establecer estas opciones de sesión en su vimrc. Especialmente las opciones son molestas cuando ha cambiado su vimrc después de haber guardado la sesión.

set ssop-=options    " do not store global and local values in a session
set ssop-=folds      " do not store folds
Jan Christoph
fuente
1
¡Excelente! Tuve exactamente este problema ayer. ¡Muchas gracias!
Jogusa el
40

Tenga en cuenta que: mksession no guardará los cambios en los archivos que haya realizado. Cometí este error de cerrar vim después de guardar la sesión, suponiendo que comenzaré desde allí. Pero la próxima vez que abrí la sesión, los cambios que había realizado en los archivos habían desaparecido.

Deepanshu
fuente
11
Esto debería venir con cualquier respuesta relacionada con :mksession.
Morgan Wilde
1
Sí, probablemente quieras seguir con un:wqa
JonnyRaa
11
o solo :xauna pulsación menos. ¡Hurra!
robin
También puede configurar vim para guardar automáticamente archivos (si le gusta ese tipo de cosas) en su .vimrc: vimrc au FocusLost * silent! wa Esto guardará automáticamente cada vez que el búfer pierda el foco.
grego
32

Si usa NERDTree como explorador / tablero de archivos, recomendaría el complemento xolox / vim-session en lugar del comando incorporado: mksession. Por alguna razón: mksession no puede restaurar los búferes NERDTree. Su millaje puede variar, pero pensé que compartiría mi experiencia.

gdso
fuente
Para macvim, necesito asegurarme: let g:nerdtree_tabs_open_on_gui_startup=0y let g:nerdtree_tabs_open_on_new_tab=0hacer que xolox / vim-session funcione.
Nianliang
18

Si desea automatizar el proceso sin usar ningún complemento, puede usar Go away y volver desde Vim Tips Wiki .

Cada vez que salga de Vim, guardará la sesión actual ~/.vim/sessionsy la volverá a cargar una vez que se abra Vim. También se basa en su ruta actual, por lo que si abre Vim desde diferentes directorios tendrá diferentes sesiones, lo que es bastante útil cuando trabaja en diferentes proyectos.

Simplemente edite su ~/.vimrcarchivo y agregue lo siguiente:

function! MakeSession()
  let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
  if (filewritable(b:sessiondir) != 2)
    exe 'silent !mkdir -p ' b:sessiondir
    redraw!
  endif
  let b:filename = b:sessiondir . '/session.vim'
  exe "mksession! " . b:filename
endfunction

function! LoadSession()
  let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
  let b:sessionfile = b:sessiondir . "/session.vim"
  if (filereadable(b:sessionfile))
    exe 'source ' b:sessionfile
  else
    echo "No session loaded."
  endif
endfunction

" Adding automatons for when entering or leaving Vim
au VimEnter * nested :call LoadSession()
au VimLeave * :call MakeSession()

Incluso para un principiante, este script es algo fácil de entender y personalizar.

Tenga en cuenta que este script solo funcionará correctamente para sistemas Unix (MacOS / Linux), debe adaptarse para funcionar en Windows.


ACTUALIZACIÓN: agregando la sugerencia de 0xc0de , puede reemplazar la VimEnterlínea de estos si desea que Vim cargue la sesión solo si no se proporcionan argumentos :

if(argc() == 0)
  au VimEnter * nested :call LoadSession()
endif
mathielo
fuente
1
Es posible que desee abrir sesión solo si no se proporciona ningún argumento para vim, por ejemplo. if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de
Gracias @ 0xc0de, gran sugerencia (incluso comencé a usarlo yo mismo). He actualizado la respuesta.
mathielo
¿Cómo modificaría esto para que si abro vim con argumentos tampoco guarde esa sesión?
Dr. Manhattan
muy bueno, pero 'exe' source 'b: sessionfile` necesita un punto allí? y el problema es que la sesión de carga automática depende del directorio de inicio actual (pasar pwd) ¿cómo puedo configurarlo para que sea el último directorio de trabajo antes de salir de vim? para que pueda cargar la última sesión de trabajo en lugar de la sesión bajo ~/?
van abel
Si desea poder tener sesiones pero aún abrir archivos individuales en el directorio sin sobrescribirlo, consulte mi versión modificada de esto en la respuesta por separado: stackoverflow.com/questions/1642611/…
PMunch
6

Hay un complemento muy útil para esta tarea, vim-startify, que maneja muchas otras cosas, como archivos abiertos recientemente, etc. También tiene una interfaz muy fácil.

Lo uso desde hace un par de días y hasta ahora funciona perfectamente. Espero que te ayude.

vivek
fuente
5

Dado que este es el primer éxito en Google para mí (y probablemente para otros) sobre cómo trabajar con las sesiones en Vim, he decidido agregar un poco a la respuesta de @ mathielo sobre cómo hacer que esto sea automático.

Me gusta su código, pero la adición de la solución "solo si sin argumentos" parecía un poco escasa. Esta es mi versión modificada:

function! MakeSession(overwrite)
  let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
  if (filewritable(b:sessiondir) != 2)
    exe 'silent !mkdir -p ' b:sessiondir
    redraw!
  endif
  let b:filename = b:sessiondir . '/session.vim'
  if a:overwrite == 0 && !empty(glob(b:filename))
    return
  endif
  exe "mksession! " . b:filename
endfunction

function! LoadSession()
  let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
  let b:sessionfile = b:sessiondir . "/session.vim"
  if (filereadable(b:sessionfile))
    exe 'source ' b:sessionfile
  else
    echo "No session loaded."
  endif
endfunction

" Adding automatons for when entering or leaving Vim
if(argc() == 0)
  au VimEnter * nested :call LoadSession()
  au VimLeave * :call MakeSession(1)
else
  au VimLeave * :call MakeSession(0)
endif

El cambio notable aquí es la anulación opcional. Si abre Vim sin opciones, se abrirá cualquier sesión existente y sobrescribirá los cambios realizados cuando salga. Si Vim se abre con opciones, solo creará una nueva sesión si no existe ninguna, esto significa que puede abrir archivos individuales en un directorio que tiene una sesión sin sobrescribirla. Luego puede abrir Vim sin opciones para ejecutar la sesión. Si no existe una sesión, se crea una nueva.

PMunch
fuente
Acabo de probar su solución publicada anteriormente en Neovim 0.2.2 y coloqué su fragmento $HOME/.vim/plugin/sessions.vimpero no está guardando los archivos de sesión. ¯ \ _ (ツ) _ / ¯
ipatch
Este hilo, y en particular el comentario vinculado, podría ayudar: superuser.com/questions/404686/… Lo tengo en mi .vimrc y funciona bien.
Almuerzo
lo tengo funcionando, aparentemente tengo que salir (n) vim para que la sesión se escriba inserte un chiste malo Gracias de nuevo por compartir 👍
ipatch
3

Existe este maravilloso complemento llamado vim-session . Es muy poderoso. Para instalarlo:

cd ~/.vim/bundle
git clone https://github.com/xolox/vim-session.git

He mapeado su funcionalidad en mi .vimrcarchivo de esta manera:

nnoremap <leader>so :OpenSession 
nnoremap <leader>ss :SaveSession 
nnoremap <leader>sd :DeleteSession<CR>
nnoremap <leader>sc :CloseSession<CR>

Ahora en modo normal simplemente escriba <leader>ssy verá un comando como este

:SaveSession 

Ahora agregue el nombre de su sesión

 :SaveSession namesession

y eso es todo.

Cuando cierras Vim y lo vuelves a abrir, simplemente hazlo

 :OpenSession

y verás tu sesión abierta.

Hay muchas otras configuraciones para agregar en su .vimrcarchivo. Consulte la documentación para ver ejemplos:

let g:session_directory = "~/.vim/tmp/session"  // the directory must be created before the sessions will be saved there
let g:session_autoload = "no"                   // automatic reload sessions
let g:session_autosave = "no"                   // autosave
let g:session_command_aliases = 1

Hay un buen tutorial en YouTube.

BELRALMIA WALID
fuente
2

Personalmente, acabo de envolver el complemento Obsession de Tim Pope para permitir definir sessiondiray evitar escribir el camino:

let g:sessiondir = $HOME . ".vim/sessions"

command! -nargs=1 MkSession call MkSession(<f-args>)
function! MkSession(sessionfile)
  if !isdirectory(g:sessiondir)
    call mkdir(g:sessiondir, "p")
  endif
  exe 'Obsession' g:sessiondir . '/' . a:sessionfile
endfunction

command! -nargs=1 LoadSession call LoadSession(<f-args>)
function! LoadSession(sessionfile)

  let a:sessionpath = g:sessiondir . a:sessionfile
  if (filereadable(a:sessionpath))
    exe 'source ' a:sessionpath
  else
    echo "No session loaded."
  endif
endfunction
archf
fuente
Tuve problemas específicos con el complemento Airline y las sesiones. Cambiar a usar Obsession solucionó los problemas, fue un hallazgo sorprendente después de semanas de lucha. Ver github.com/vim-airline/vim-airline/issues/…
icc97
1

Gracias @mathielo Siguiendo el ejemplo de @mathielo, agregué la siguiente línea a .vimrc para guardar la sesión activa (si la hubiera):

au VimLeave * if this_session != "" | exe "mksession! ".this_session

Si desea poner más líneas, debe usar endif:

au VimLeave * if v:this_session != ""
au VimLeave *   exe "mksession! ".this_session
au VimLeave * endif

Solo necesita guardar una nueva sesión en vim con

:mks [Session filename]

y después de comenzar con

$ vim -S [Session filename]

vim iniciará la sesión y no necesita preocuparse por guardar la sesión cada vez que cierre vim.

Si no tiene una sesión activa .vimrc no hará nada. Como antes.

Eso es lo que estaba buscando! Gracias de nuevo @mathielo!

oml
fuente
Esto es lo que estaba buscando también. Excelente ! No recuerdo cuántas veces perdí mi sesión en :qlugar de :bd... ¡Gracias!
Joel.O
1

Si planea tener solo 1 sesión para el proyecto, simplemente haga

:mks

que creará un Session.vimarchivo en el directorio actual y luego abrirá la sesión (desde el mismo directorio):

vim -S

Si cambia la sesión y desea guardarla:

:mks!

¡Esto salva la sesión, no los archivos en sí!

Si planea tener varias sesiones , prefiero guardarlas en archivos ocultos en el directorio del proyecto:

:mks .session-name.vim

Para abrirlo (desde el mismo directorio):

vim -S .session-name.vim

Guardar la sesión:

:mks! .session-name.vim

Como las sesiones se guardan en archivos ocultos, para verlas no olvides -a

ls -a
cute_ptr
fuente
0

Puedes almacenar la sesión donde quieras.

Ex:

:mksession! D:/session.ses

Esto almacena la sesión en D drive.

Esto se puede abrir escribiendo

:so D:/session.ses

en cualquiera de los archivos vim.

Sagar Jain
fuente
0

A continuación se muestra la única conf. eso realmente funcionó para mí. Lo tomé de aquí , donde también puedes tomar una versión más completa / compleja.

set viewoptions+=cursor,folds,slash,unix
set viewoptions-=options

augroup vimrc
    autocmd BufWritePost *
    \   if expand('%') != '' && &buftype !~ 'nofile'
    \|      mkview
    \|  endif
    autocmd BufRead *
    \   if expand('%') != '' && &buftype !~ 'nofile'
    \|      silent loadview
    \|  endif
augroup END
JohnTortugo
fuente
0

Para administrar varias sesiones (por directorio / repositorio), recientemente cambié del complemento vim-session a vim-workspace . La gestión de su sesión es relativamente simple y funciona bastante bien.

jaybay
fuente