¿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?


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

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

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.


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.


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

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.


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.


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.


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

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!


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

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.


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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.