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


367

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

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


16
@ldigas 나는 PPL보다 오래된 학교 포럼 또는 터미널 문서, 또는 하늘이하는 금지에 (큰 글꼴, 큰 포맷 ...에) 여기에 질문을 찾는 더 편안하게 생각하는 man페이지
PUK

6
@ldigas 필자는 개인적으로 항상 멍청한 것들이 많지 않은 매뉴얼 페이지에 의해 두려워했습니다. 리눅스의 다른 모든 것들과 마찬가지로 가파른 학습 곡선을 가지고 있습니다.
puk

45
@Idigas-Google의 집단 스마트, Google 및 스택 오버플로 메타 지식 관리 사이의 요점을 놓치고 있다고 생각합니다. 이것은 단순히 답을 얻는 더 좋은 방법입니다. 또한이 페이지는 함정에 대한 실제 경험과 삶을 더 쉽게 만들 수있는 멋진 지름길을 보여줍니다. 이것은 (제외 내가 검토 한 거의 모든 매뉴얼을 동일하게 적용 어쩌면 PHP는 온라인 수동). 비바 스택 오버 플로우!
ErichBSchulz

2
@ldigas와 사람들은 다른 사람이 필요할 수 있기 때문에 나중에 참조 할 수 있습니다.
Mansuro

4
@idigas 나는이 질문이 실제로 의미한다고 생각합니다 .vim 초보자는 도움말 시스템과 사용 방법에 대해 많이 알지 못하지만 더 노련한 사람이라면 vim에서 길을 찾는 방법을 알게 될 것입니다.
Edgar Klerks

답변:


494

당신은 같은 것을 원합니다

:mksession ~/mysession.vim

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

:source ~/mysession.vim

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

$ vim -S ~/mysession.vim

27
Ooo, 그리고 나는 다음을 입력하여 다시로드 할 수 있다는 것을 거의 잊었다. gvim -S ~ / mysession.vim
Benj

1
감사합니다 @Benj. 저는 vim에서 처음입니다. 커맨드 라인에서 어떻게 '소스'할 수 있습니까?
Jogusa

1
죄송합니다! 미안하다 벤지, 나는 명령 모드를 의미했다. 나는 이미 그것을 발견했다 :``: source ~ / mysession.vim´´.
Jogusa

8
Short는 : so ~ / file입니다. 현재 파일을 원한다면 간단한 : so %가 당신을 위해 일할 것입니다.
Daniel Baulig

14
세션 파일 이름을 지정하지 않으면 기본적으로에서 쓰고 읽습니다 Session.vim. 당신은 단지 하나의 세션이 현재 디렉토리에 저장 한하려는 경우, 당신은 사용할 수 있습니다 :mksession또는 :mks정력에서 현재 세션을 저장하고, 단지 vim -S그것을 백업 엽니 다.
anishpatel

59

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

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

1
큰! 어제 정확히이 문제가있었습니다. 고마워요!
Jogusa

40

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


11
에 관련된 답변이 함께 제공되어야합니다 :mksession.
Morgan Wilde

1
네, 아마:wqa
JonnyRaa

11
또는 :xa한 번의 적은 키 스트로크. 예이!
robin

vim에서 파일을 자동으로 저장하도록 설정할 수도 있습니다 (당신이 좋아하는 경우) .vimrc: vimrc au FocusLost * silent! wa 버퍼가 포커스를 잃을 때마다 자동으로 저장됩니다.
grego

32

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


: macvim 위해, 나는 확인해야 let g:nerdtree_tabs_open_on_gui_startup=0하고 let g:nerdtree_tabs_open_on_new_tab=0xolox / VIM-세션 작업을 할 수 있습니다.
Nianliang

18

플러그인을 사용하지 않고 프로세스를 자동화하려면 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

1
vim에 인수가 제공되지 않은 경우에만 세션을 열 수 있습니다. if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de

감사합니다 @ 0xc0de, 큰 제안 (저는 직접 사용하기 시작했습니다). 답변을 업데이트했습니다.
mathielo

인수로 vim을 열면 세션을 저장하지 않도록 이것을 어떻게 수정합니까?
Dr.

매우 좋지만`exe 'source'b : sessionfile`에 점이 필요합니까? 문제는 자동로드 세션이 현재 홈 디렉토리에 의존한다는 것입니다 (get by pwd) vim을 종료하기 전에 마지막 작업 디렉토리로 어떻게 설정할 수 있습니까? ~/? 아래의 세션이 아닌 마지막 작업 세션을로드 할 수 있습니다 .
van abel

덮어 쓸 필요없이 세션에서 세션을 유지하면서 디렉토리에서 단일 파일을 열려면 별도의 답변에서 수정 된 버전을 확인하십시오. stackoverflow.com/questions/1642611/…
PMunch

6

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

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


5

이것은 Vim에서 세션을 사용하는 방법에 대해 Google에서 나에게 (그리고 아마도 다른 사람들에게) 첫 번째 히트이기 때문에 이것을 자동으로 만드는 방법에 대한 @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을 열어 세션을 실행할 수 있습니다. 세션이 없으면 새 세션을 만듭니다.


방금 Neovim 0.2.2에서 위에 게시 된 솔루션을 시도하고 스 니펫을 배치 $HOME/.vim/plugin/sessions.vim했지만 세션 파일을 저장하지는 않습니다. ¯ \ _ (ツ) _ / ¯
ipatch

이 스레드, 특히 링크 된 주석이 도움이 될 수 있습니다. superuser.com/questions/404686/… 내 .vimrc에 있으며 제대로 작동합니다.
PMunch 2015 년

세션을 작성하려면 분명히 (n) vim을 종료해야합니다. 나쁜 농담을 삽입 하십시오. 다시 공유해 주셔서 감사합니다.
ipatch

3

이 훌륭한 플러그인 호출 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

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


2

개인적으로 나는 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

항공사 플러그인 및 세션에 특정 문제가있었습니다. 강박 관념으로 전환하면 문제가 해결되었지만 몇 주 동안 고군분투 한 후에 놀라운 발견이었습니다. github.com/vim-airline/vim-airline/issues/…를
icc97

1

감사합니다 @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 감사합니다!


이것도 내가 찾던 것입니다. 대단해! 세션 :q대신 세션을 잃어버린 횟수를 기억할 수 없습니다 :bd... 감사합니다!
Joel.O

1

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

:mks

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

vim -S

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

:mks!

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

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

:mks .session-name.vim

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

vim -S .session-name.vim

세션 저장 :

:mks! .session-name.vim

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

ls -a

0

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

전의:

:mksession! D:/session.ses

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

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

:so D:/session.ses

모든 vim 파일에서.


0

아래는 유일한 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.