web-dev-qa-db-ja.com

Vimで複数の異なるセッションを保存および復元する方法

Vimでのタスクに応じて、いくつかのタブが開きます。

後で使用するために異なるセッションを保存するにはどうすればよいですか?

356
Jogusa

あなたは次のようなものが欲しい

:mksession ~/mysession.vim

その後、そのvimファイルを入手すると、古いセッションが元に戻ります。

:source ~/mysession.vim

または、-Sオプションを使用してvimを開きます。

$ vim -S ~/mysession.vim
477
Benj

Vimrcでこれらのセッションオプションを設定することもできます。特に、セッションを保存した後にvimrcを変更した場合、オプションは迷惑です。

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

:mksessionは、行ったファイルへの変更を保存しないことに注意してください。セッションを保存した後にvimを閉じるというミスを犯しました。しかし、次回セッションを開いたときに、ファイルに加えた変更は失われました。

39
Deepanshu

ファイルエクスプローラー/ダッシュとして NERDTree を使用する場合、組み込みの:mksessionコマンドの代わりに xolox/vim-session plugin をお勧めします。何らかの理由で、:mksessionはNERDTreeバッファーの復元に失敗します。あなたの走行距離は異なるかもしれませんが、私は私の経験を共有すると思いました。

31
gdso

プラグインを使用せずにプロセスを自動化する場合は、 Vim Tips Wiki から Go away and come back を使用できます。

Vimを終了するたびに、現在のセッションが~/.vim/sessionsの下に保存され、Vimが開かれると再びロードされます。また、現在のパスに基づいているため、異なるディレクトリから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()

初心者でも、このスクリプトはやや理解し、カスタマイズしやすいです。

注意してくださいこのスクリプトはUnixシステム(MacOS/Linux)でのみ正しく動作します。Windowsで動作するように適合させる必要があります。


UPDATE:xc0de の提案を追加し、Vimにセッションをロードさせたい場合は、これらの行をVimEnter行に置き換えることができます引数が指定されていない場合のみ

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

このタスクには非常に便利なプラグインがあります vim-startify 最近開いたファイルなど、他の多くのものを処理します。非常に簡単なインターフェイスも備えています。

私は数日からそれを使用しており、今まで完全に動作します。お役に立てば幸いです。

5
vivek

この素晴らしいプラグイン呼び出し 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

YouTubeには優れた チュートリアル があります。

3

これは私にとって(そしておそらく他の人にとっても)Vimでセッションを操作するための最初のヒットなので、この自動化の方法に関する@mathieloの回答に少し追加することにしました。

私は彼のコードが好きですが、「引数がない場合のみ」ソリューションの追加は少し欠けているように見えました。これは私の修正版です:

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を開くことができます。セッションが存在しない場合、新しいセッションが作成されます。

3
PMunch

個人的には、Tim Popeの Obsession プラグインをラップして、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
1
archf

ありがとう@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!

1
oml

複数のセッションを(ディレクトリ/リポジトリごとに)管理するために、最近vim-sessionプラグインから vim-workspace に切り替えました。そのセッション管理は比較的単純で、かなりうまく機能します。

0
jaybay

以下が唯一の設定です。それは本当に私のために働いた。 here から取得しました。より完全/複雑なバージョンを取得することもできます。

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
JohnTortugo

セッションはどこにでも保存できます。

例:

:mksession! D:/session.ses

これにより、セッションがDドライブに保存されます。

これは次のように入力して開くことができます

:so D:/session.ses

vimファイルのいずれか。

0
Sagar Jain

プロジェクトのセッションを1つだけにする予定がある場合

:mks

これにより、現在のディレクトリにSession.vimファイルが作成され、セッションが(同じディレクトリから)開かれます。

vim -S

セッションを変更して保存する場合:

:mks!

これにより、ファイル自体ではなくセッションが保存されます!

複数のセッションを予定している場合、プロジェクトのディレクトリ内の隠しファイルに保存することを好みます:

:mks .session-name.vim

(同じディレクトリから)開くには:

vim -S .session-name.vim

セッションを保存:

:mks! .session-name.vim

セッションは隠しファイルに保存されるため、それらを表示するには-aを忘れないでください

ls -a
0
cute_ptr