วิธีการบันทึกและกู้คืนหลาย ๆ เซสชั่นที่แตกต่างกันในกลุ่ม?


367

ฉันเปิดแท็บหลายแท็บขึ้นอยู่กับงานของฉันใน Vim

ฉันจะบันทึกเซสชันต่าง ๆ เพื่อใช้ในภายหลังได้อย่างไร


16
@ldigas ฉันคิดว่า ppl รู้สึกสะดวกสบายในการค้นหาคำถามที่นี่ (ด้วยตัวอักษรขนาดใหญ่การจัดรูปแบบที่ดี ... ) กว่าในฟอรั่มโรงเรียนเก่าหรือเอกสารเทอร์มินัลหรือสวรรค์ห้ามmanหน้า
puk

6
@digas โดยส่วนตัวฉันมักจะกลัวที่หน้าเพจ b / c พวกเขาไม่ได้โง่พอ เหมือนกับทุกสิ่งทุกอย่างใน linux แต่ก็มีช่วงการเรียนรู้ที่สูงชัน
puk

45
@Idigas - ฉันคิดว่าคุณพลาดจุดที่ระหว่าง smarts รวมของเรา google และการจัดการ metaknowledge ล้นสแต็ค - นี่เป็นเพียงวิธีที่ดีกว่าในการรับคำตอบของคุณ - สิ่งที่คุณต้องการไม่ใช่รายการตัวเลือกที่ลึกลับ ในขณะที่หน้านี้แสดงให้เห็นถึงประสบการณ์ในโลกแห่งความเป็นจริงของกับดักและมักจะทางลัดที่ดีที่จะทำให้ชีวิตของคุณง่ายขึ้น สิ่งนี้ใช้ได้กับคู่มือเกือบทุกอย่างที่ฉันได้ดู (ยกเว้นบางทีคู่มือ PHP ออนไลน์) Viva stackoverflow!
ErichBSchulz

2
@ldigas และผู้คนสามารถใช้เพื่อการอ้างอิงในอนาคตเนื่องจากมีคนอื่นอาจต้องการมัน
Mansuro

4
@idigas ฉันคิดว่าคำถามเหล่านี้เป็นจริงในความรู้สึกว่าผู้เริ่มต้นเป็นกลุ่มไม่ทราบมากเกี่ยวกับระบบความช่วยเหลือและวิธีการใช้งาน แต่ถ้าพวกเขาได้รับประสบการณ์มากขึ้นพวกเขาจะรู้วิธีการหาวิธีของพวกเขาในกลุ่ม
Edgar Klerks

คำตอบ:


494

คุณต้องการบางสิ่งบางอย่าง

:mksession ~/mysession.vim

จากนั้นในภายหลังคุณสามารถแหล่งที่มาเป็นกลุ่มไฟล์และคุณจะได้เซสชั่นเก่าของคุณกลับมา:

:source ~/mysession.vim

หรือเปิดเป็นกลุ่มด้วยตัวเลือก -S:

$ vim -S ~/mysession.vim

27
ooo และผมเกือบลืมคุณสามารถโหลดมันกลับโดยการพิมพ์: gvim -S ~ / mysession.vim
Benj

1
ขอบคุณ @Benj ฉันใหม่ในกลุ่ม ฉันจะ 'แหล่งที่มา' ในบรรทัดคำสั่งได้อย่างไร
Jogusa

1
อ๊ะ! ขออภัยเบ็นฉันหมายถึงโหมดคำสั่ง ฉันได้พบแล้ว: ``: source ~ / mysession.vim´´
Jogusa

8
สั้นคือ: ดังนั้น ~ / ไฟล์ หากคุณต้องการแหล่งที่มาของไฟล์ปัจจุบันง่าย ๆ :% จะทำงานให้คุณ
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 จะไม่บันทึกการเปลี่ยนแปลงในไฟล์ใด ๆ ที่คุณทำ ฉันทำผิดพลาดจากการปิดเสียงเรียกเข้าหลังจากบันทึกเซสชันโดยสมมติว่าฉันจะรับช่วงต่อจากนั้น แต่ครั้งต่อไปที่ฉันเปิดเซสชั่นการเปลี่ยนแปลงที่ฉันทำกับไฟล์ก็หายไป


11
นี้จะมาพร้อมกับคำตอบใด ๆ :mksessionที่เกี่ยวข้องกับการ
Morgan Wilde

1
ใช่คุณอาจต้องการติดตามด้วย:wqa
JonnyRaa

11
หรือ:xaกดแป้นน้อยกว่าหนึ่งครั้ง เย้!
robin

นอกจากนี้คุณยังสามารถตั้งค่าให้เป็นกลุ่มโดยอัตโนมัติบันทึกไฟล์ (ถ้าคุณชอบสิ่งนั้น) ในของคุณ.vimrc: vimrc au FocusLost * silent! wa สิ่งนี้จะประหยัดอัตโนมัติเมื่อบัฟเฟอร์เสียโฟกัส
grego

32

หากคุณใช้NERDTreeเป็น file explorer / dash ของคุณฉันขอแนะนำxolox / vim-session pluginแทนคำสั่ง built-in: mksession ด้วยเหตุผลบางอย่าง: mksession ล้มเหลวในการกู้คืนบัฟเฟอร์ NERDTree ระยะของคุณอาจแตกต่างกันไป แต่คิดว่าฉันจะแบ่งปันประสบการณ์ของฉัน


สำหรับ macvim ฉันต้องแน่ใจว่า: let g:nerdtree_tabs_open_on_gui_startup=0และlet g:nerdtree_tabs_open_on_new_tab=0เพื่อให้ xolox / vim-session ทำงาน
Nianliang

18

หากคุณต้องการที่จะดำเนินการโดยอัตโนมัติโดยไม่ต้องใช้ปลั๊กอินใด ๆ ที่คุณสามารถใช้หายไปและกลับมาจากกลุ่มเคล็ดลับวิกิพีเดีย

ทุกครั้งที่คุณออกจาก 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: การเพิ่มข้อเสนอแนะของ0xc0deคุณสามารถแทนที่VimEnterบรรทัดสำหรับสิ่งเหล่านี้หากคุณต้องการให้ Vim โหลดเซสชั่นเฉพาะในกรณีที่ไม่มีข้อโต้แย้งที่ระบุไว้ :

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

1
คุณอาจต้องการที่จะเปิดเซสชั่นเฉพาะในกรณีที่ไม่มีการโต้แย้งสำหรับเป็นกลุ่มเช่น if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de

ขอบคุณ @ 0xc0de คำแนะนำยอดเยี่ยม (ฉันเริ่มใช้ด้วยตัวเอง) ฉันได้อัพเดตคำตอบแล้ว
mathielo

ฉันจะแก้ไขสิ่งนี้อย่างไรเพื่อที่ว่าถ้าฉันเปิดเสียงเรียกเข้าพร้อมด้วยข้อโต้แย้งมันก็ไม่ได้บันทึกเซสชันนั้น
Dr Manhattan

ดีมาก แต่ `exe 'source' b: sessionfile` ต้องการจุดที่นั่นหรือ และปัญหาคือเซสชั่น autoload นั้นขึ้นอยู่กับโฮมไดเร็กตอรี่ปัจจุบัน (รับโดยpwd) ฉันจะตั้งเป็นไดเรคทอรี่ทำงานสุดท้ายก่อนออกจาก vim ได้อย่างไร? เพื่อที่จะสามารถโหลดเซสชั่นการทำงานที่ผ่านมามากกว่าเซสชั่นภายใต้~/?
van abel

หากคุณต้องการที่จะมีเซสชัน แต่ยังคงเปิดไฟล์เดียวในไดเรกทอรีโดยไม่ต้องเขียนทับตรวจสอบรุ่นที่แก้ไขของฉันนี้ในคำตอบที่แยกต่างหาก: stackoverflow.com/questions/1642611/ …
PMunch

6

มีปลั๊กอินที่มีประโยชน์มากสำหรับภารกิจนี้vim-startifyซึ่งจัดการสิ่งอื่น ๆ เช่นไฟล์ที่เพิ่งเปิดใหม่ ฯลฯ มันมีอินเตอร์เฟสที่ใช้งานง่ายเช่นกัน

ฉันใช้มันตั้งแต่สองสามวันจนถึงตอนนี้มันทำงานได้อย่างสมบูรณ์ หวังว่ามันจะช่วยคุณ


5

เนื่องจากนี่เป็นครั้งแรกที่ Google ได้รับความนิยม (และอาจเป็นอย่างอื่น) สำหรับวิธีการทำงานกับเซสชันใน 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

การเปลี่ยนแปลงที่น่าสังเกตที่นี่คือการแทนที่ที่เป็นทางเลือก หากคุณเปิดเป็นกลุ่มโดยไม่มีตัวเลือกมันจะเปิดเซสชันใด ๆ ที่มีอยู่และเขียนทับการเปลี่ยนแปลงที่ทำเมื่อคุณออกจาก หากเปิดเป็นกลุ่มพร้อมตัวเลือกจะสร้างเซสชันใหม่หากไม่มีอยู่นั่นหมายความว่าคุณสามารถเปิดไฟล์เดียวในไดเรกทอรีที่มีเซสชันโดยไม่ต้องเขียนทับ จากนั้นคุณสามารถเปิดเป็นกลุ่มโดยไม่มีตัวเลือกให้เรียกใช้เซสชันแทน หากไม่มีเซสชันอยู่ให้สร้างเซสชันใหม่


ฉันเพิ่งลองวิธีแก้ปัญหาที่คุณโพสต์ไว้ข้างต้นใน Neovim 0.2.2 และวางข้อมูลโค้ดของคุณใน$HOME/.vim/plugin/sessions.vimแต่ก็ไม่ได้บันทึกไฟล์เซสชัน ¯ \ _ (ツ) _ / ¯
ipatch

กระทู้นี้และโดยเฉพาะอย่างยิ่งความคิดเห็นที่เชื่อมโยงอาจช่วยได้: superuser.com/questions/404686/ ......ฉันมีมันใน. vimrc ของฉันและใช้งานได้ดี
ช่วงบ่าย

ได้ทำงานชัดว่าฉันต้องออก (n) เป็นกลุ่มเพื่อให้เซสชั่นที่จะเขียนแทรกเรื่องตลกที่ไม่ดี ขอบคุณอีกครั้งสำหรับการแบ่งปัน👍
ipatch

3

มีปลั๊กอินนี้โทรที่ยอดเยี่ยมคือกลุ่มเซสชั่น มันทรงพลังมาก วิธีติดตั้ง:

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

โดยส่วนตัวแล้วฉันจะใช้ปลั๊กอินObsessionของ Tim Pope เพื่อกำหนด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

ฉันมีปัญหาเฉพาะกับปลั๊กอินและเซสชันของสายการบิน การเปลี่ยนไปใช้ 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

คุณจะต้องบันทึกเซสชันใหม่เป็นกลุ่มด้วย

:mks [Session filename]

และหลังจากเริ่มต้นด้วย

$ vim -S [Session filename]

เสียงเรียกเข้าจะเริ่มเซสชันและคุณไม่ต้องกังวลกับการบันทึกเซสชันทุกครั้งที่คุณปิดเสียงเรียกเข้า

หากคุณไม่มีเซสชัน. vimrc จะไม่ทำอะไรเลย เหมือนก่อน.

นั่นคือสิ่งที่ฉันกำลังมองหา! ขอบคุณ @mathielo อีกครั้ง!


นี่คือสิ่งที่ฉันกำลังมองหาเช่นกัน เยี่ยมมาก! ฉันจำไม่ได้ว่าฉันทำเซสชันของฉันหายไปกี่ครั้ง:qแทนที่จะ:bdขอบคุณ ...
Joel.O

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

คุณสามารถจัดเก็บเซสชันได้ทุกที่ที่คุณต้องการ

Ex:

:mksession! D:/session.ses

สิ่งนี้จะเก็บเซสชั่นไว้ใน D drive

สิ่งนี้สามารถเปิดได้โดยการพิมพ์

: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

สำหรับการจัดการหลายครั้ง (ในแต่ละไดเรกทอรี / พื้นฐาน repo) ผมเพิ่งจะเปลี่ยนจากกลุ่มเซสชั่นปลั๊กอินที่จะเป็นกลุ่ม-พื้นที่ทำงาน การจัดการเซสชั่นค่อนข้างง่ายและทำงานได้ค่อนข้างดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.