development

Vim에서 여러 개의 다른 세션을 저장하고 복원하는 방법은 무엇입니까?

big-blog 2020. 2. 28. 19:20
반응형

Vim에서 여러 개의 다른 세션을 저장하고 복원하는 방법은 무엇입니까?


Vim의 작업에 따라 여러 탭이 열려 있습니다.

나중에 사용하기 위해 다른 세션을 저장하려면 어떻게해야합니까?


당신은 같은 것을 원합니다

:mksession ~/mysession.vim

그런 다음 나중에 해당 vim 파일을 소싱하면 이전 세션이 다시 시작됩니다.

:source ~/mysession.vim

또는 -S 옵션을 사용하여 vim을 엽니 다.

$ vim -S ~/mysession.vim

vimrc에서이 세션 옵션을 설정할 수 있습니다. 세션을 저장 한 후 vimrc를 변경하면 특히 옵션이 성가시다.

set ssop-=options    " do not store global and local values in a session
set ssop-=folds      " do not store folds

: mksession은 변경 한 파일을 저장하지 않습니다. 세션을 저장 한 후에 Vim을 닫는 실수를저기서 시작했습니다. 그러나 다음에 세션을 열면 파일에 대한 변경 사항이 사라졌습니다.


당신이 사용하는 경우 NERDTree를 파일 탐색기 / 대시로, 내가 추천 할 것입니다 플러그인 xolox / 정력 세션을 mksession 명령을 대신 내장의. 어떤 이유로 : mksession이 NERDTree 버퍼를 복원하지 못합니다. 마일리지가 다를 수 있지만 경험을 공유하겠다고 생각했습니다.


플러그인을 사용하지 않고 프로세스를 자동화하려면 Go away을 사용 하여 Vim Tips Wiki 에서 돌아올 수 있습니다 .

Vim을 종료 할 때마다 현재 세션이 저장되고 ~/.vim/sessionsVim이 열리면 다시로드됩니다. 또한 현재 경로를 기반으로하므로 다른 디렉토리에서 Vim을 열면 다른 세션이 있으므로 다른 프로젝트에서 작업 할 때 매우 유용합니다.

~/.vimrc파일을 편집 하고 다음을 추가하십시오.

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()

초보자도이 스크립트 를 이해하고 사용자 정의하기 다소 쉽습니다.

주의 이 스크립트는 유닉스 시스템 (맥 OS / 리눅스)가 제대로 작동합니다, 그것은 Windows에서 작업에 적용 할 필요가있다.


업데이트 : 0xc0de 의 제안을 추가하면 인수가 제공되지 않은 경우에만VimEnter Vim에서 세션을로드하려는 경우 이러한 행을 바꿀 수 있습니다 .

if(argc() == 0)
  au VimEnter * nested :call LoadSession()
endif

이 작업 vim-startify 에는 최근에 열린 파일 등과 같은 다른 많은 것들을 처리 하는 매우 유용한 플러그인이 있으며 인터페이스도 매우 쉽습니다.

나는 며칠 이래로 그것을 사용하고 있으며 지금까지 완벽하게 작동합니다. 그것이 당신을 돕기를 바랍니다.


이 훌륭한 플러그인 호출 vim-session이 있습니다. 매우 강력합니다. 설치하려면 :

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

다음 .vimrc과 같이 파일 에서 기능을 매핑했습니다 .

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

이제 일반 모드에서 입력 <leader>ss하면 다음과 같은 명령이 표시됩니다

:SaveSession 

이제 세션 이름을 추가하십시오

 :SaveSession namesession

그리고 그게 다야.

Vim을 닫았다가 다시 열면

 :OpenSession

세션이 열린 것을 볼 수 있습니다.

.vimrc파일 에 추가 할 다른 구성이 많이 있습니다 . 예제는 설명서를 참조하십시오.

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

좋은의이 튜토리얼 유튜브에가.


이것은 Vim에서 세션을 사용하는 방법에 대해 나에게 (그리고 아마도 다른 사람들에게) 첫 번째 히트이기 때문에 이것을 자동으로 만드는 방법에 대한 @mathielo의 대답에 약간을 추가하기로 결정했습니다.

나는 그의 코드를 좋아하지만 "args없이 만"솔루션을 추가하는 것은 약간 부족한 것처럼 보였다. 이것은 내 수정 된 버전입니다.

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

여기서 눈에 띄는 변화는 옵션 재정의입니다. 옵션없이 Vim을 열면 기존 세션이 열리고 나가면 변경 사항을 덮어 씁니다. 옵션으로 Vim을 열면 세션이없는 경우에만 새 세션이 생성되므로 세션이있는 디렉토리에서 파일을 덮어 쓰지 않고 단일 파일을 열 수 있습니다. 그런 다음 옵션없이 Vim을 열어 세션을 실행할 수 있습니다. 세션이 없으면 새 세션을 만듭니다.


감사합니다 @mathielo @mathielo의 예에 따라 아래 세션을 .vimrc에 추가하여 활성 세션을 저장했습니다 (있는 경우).

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

더 많은 줄을 넣으려면 endif를 사용해야합니다.

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

vim의 새 세션 만 저장하면됩니다.

:mks [Session filename]

그리고 시작 후

$ vim -S [Session filename]

vim은 세션을 시작하므로 vim을 닫을 때마다 세션을 저장하지 않아도됩니다.

활성 세션이 없으면 .vimrc는 아무것도하지 않습니다. 이전과.

그것이 내가 찾던 것입니다! 다시 @mathielo 감사합니다!


개인적으로 나는 Tim Pope의 Obsession 플러그인을 감싸서 a를 정의 sessiondir하고 경로를 입력하지 않도록합니다.

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

원하는 곳에서 세션을 저장할 수 있습니다.

전의:

:mksession! D:/session.ses

세션을 D 드라이브에 저장합니다.

이것은 입력하여 열 수 있습니다

:so D:/session.ses

모든 vim 파일에서.


아래는 유일한 conf입니다. 정말 나를 위해 일했다. 나는 여기 에서 가져 왔으며 더 완전한 / 복잡한 버전을 취할 수도 있습니다.

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

프로젝트에 대해 하나의 세션 만 계획하는 경우

:mks

이는 만듭니다 Session.vim현재 디렉토리에있는 파일을 다음 (같은 디렉토리에서) 세션을 열 수 :

vim -S

세션을 변경하고 저장하려면 다음을 수행하십시오.

:mks!

파일 자체가 아닌 세션이 저장됩니다!

여러 세션을 계획하고 있다면 프로젝트 디렉토리의 숨겨진 파일로 저장하는 것이 좋습니다 .

:mks .session-name.vim

같은 디렉토리에서 열려면 :

vim -S .session-name.vim

세션 저장 :

:mks! .session-name.vim

세션은 숨겨진 파일로 저장되므로 잊지 말아야합니다. -a

ls -a

디렉토리 / 리포지토리별로 여러 세션을 관리하기 위해 최근 vim-session 플러그인에서 vim-workspace로 전환했습니다 . 세션 관리는 비교적 간단하고 잘 작동합니다.

참고 URL : https://stackoverflow.com/questions/1642611/how-to-save-and-restore-multiple-different-sessions-in-vim



반응형