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


367

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

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


16
@ldigas古い学校のフォーラムやターミナルのドキュメントよりも、ここで(大きなフォント、すばらしいフォーマットで)問題を見つけるのが快適だと思います。または、天国の禁書であるmanページ
puk

6
@ldigas個人的には、manページb / cにいつも怖がっています。Linuxの他のすべてのように、それは急な学習曲線を持っています。
2012年

45
@Idigas-私たちは、Googleの集合的なスマート、Googleとスタックオーバーフローのメタナレッジ管理の間のポイントを見逃していると思います-これは、答えを取得するためのより良い方法です-難解なオプションの長いリストではなく、また、このページでは、トラップの実世界での経験と、多くの場合、生活を楽にするための本当に気の利いたショートカットを示しています。これは、私が見たほとんどすべてのマニュアルに等しく当てはまります(多分、phpオンラインマニュアルを除く)。ビバスタックオーバーフロー!
ErichBSchulz

2
@ldigasおよび人々は、他の誰かが必要とする可能性があるため、将来の参照のためにそれを使用できます。
Mansuro 2013年

4
@idigas私はこれらの質問は本当の意味だと思います。vimの初心者はヘルプシステムとその使用方法をよく知らないのですが、慣れるとvimで自分の道を見つける方法を知っているでしょう。
Edgar Klerks 2013年

回答:


494

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

:mksession ~/mysession.vim

その後、そのvimファイルを入手して、古いセッションに戻すことができます。

:source ~/mysession.vim

または-Sオプションでvimを開きます。

$ vim -S ~/mysession.vim

27
おお、そして私はあなたが次のように入力することでそれをロードできることをほとんど忘れていました:gvim -S〜/ mysession.vim
Benj

1
ありがとう@Benj。私はvimの新人です。コマンドラインで「ソース」するにはどうすればよいですか?
Jogusa

1
おっと!申し訳ありません、ベンジ、私はコマンドモードを意味しました。私はすでにそれを見つけました: ``:source〜/ mysession.vim´´。
Jogusa

8
ショートは:so〜/ fileです。たまたま現在のファイルを入手したい場合は、単純な:so%で作業を行います。
ダニエルボーリグ

14
セッションファイル名を指定しない場合、デフォルトでへの書き込みとからの読み取りが行われSession.vimます。したがって、現在のディレクトリに保存されているセッションを1つだけにする場合は、:mksessionまたは:mksvimから現在のセッションを保存して、vim -Sそれを再び開くことができます。
anishpatel 2015年

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いるはずです。
モーガンワイルド

1
ええ、たぶんフォローしたいでしょう:wqa
JonnyRaa 2015年

11
または:xaキーストロークが1つ少なくなります。わーい!
ロビン

また、vimを設定して、ファイルを自動的に保存することもできます(そのような場合).vimrcvimrc au FocusLost * silent! wa これにより、バッファーがフォーカスを失ったときに自動的に保存されます。
grego 2018年

32

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


:macvimのために、私は確認する必要がありますlet g:nerdtree_tabs_open_on_gui_startup=0し、let g:nerdtree_tabs_open_on_new_tab=0xolox / vimのセッション作品を作るために。
Nianliang 2014

18

プラグインを使用せずにプロセスを自動化したい場合は、Go Goを使用して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()

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

このスクリプトはUnixシステム(MacOS / Linux)でのみ正しく機能することに注意しください。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 2015

@ 0xc0deに感謝します。すばらしい提案です(私も自分で使い始めました)。答えを更新しました。
マティエロ2015

引数を付けてvimを開いても、そのセッションが保存されないように、これをどのように変更しますか
マンハッタン博士

とても良いですが、 `exe 'source' b:sessionfile`にはドットが必要ですか?そして問題は、オートロードセッションが現在のホームディレクトリに依存してpwdいることです(で取得)どのようにしてそれをvim終了前の最後の作業ディレクトリに設定できますか?下のセッションではなく、最後の作業セッションをロードできるようにし~/ます。
van abel 2017年

あなたがセッションを持っていますが、まだそれは別の答えに、この私の修正版をチェックアウト上書きすることなく、ディレクトリ内の単一のファイルを開くことができるようにしたい場合:stackoverflow.com/questions/1642611/...
PMunch

6

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

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


5

これは、Vimでセッションを処理する方法に関するGoogle(およびおそらく他の人)にとっての最初のヒットであるため、これを自動化する方法に関する@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を開くことができます。セッションが存在しない場合は、新しいセッションを作成します。


上記の投稿されたソリューションをNeovim 0.2.2で試してスニペットを配置しました$HOME/.vim/plugin/sessions.vimが、セッションファイルを保存していません。¯\ _(ツ)_ /
¯– ipatch

このスレッド、特にリンクされたコメントが役立つかもしれません:superuser.com/questions/404686/…私は.vimrcにそれを置いており、それはうまくいきます
PMunch '19年


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

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


2

個人的には、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

Airlineプラグインとセッションに特定の問題がありました。Obsessionを使用するように切り替えると問題が解決しました。数週間の苦労の末、素晴らしい発見でした。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 2016

1

プロジェクトのセッションが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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.