ฉันเปิดแท็บหลายแท็บขึ้นอยู่กับงานของฉันใน Vim
ฉันจะบันทึกเซสชันต่าง ๆ เพื่อใช้ในภายหลังได้อย่างไร
ฉันเปิดแท็บหลายแท็บขึ้นอยู่กับงานของฉันใน Vim
ฉันจะบันทึกเซสชันต่าง ๆ เพื่อใช้ในภายหลังได้อย่างไร
คำตอบ:
คุณต้องการบางสิ่งบางอย่าง
:mksession ~/mysession.vim
จากนั้นในภายหลังคุณสามารถแหล่งที่มาเป็นกลุ่มไฟล์และคุณจะได้เซสชั่นเก่าของคุณกลับมา:
:source ~/mysession.vim
หรือเปิดเป็นกลุ่มด้วยตัวเลือก -S:
$ vim -S ~/mysession.vim
Session.vim
หากคุณไม่ได้ระบุชื่อแฟ้มเซสชั่นก็จะเริ่มต้นกับการเขียนและการอ่านจาก ดังนั้นหากคุณต้องการให้บันทึกเพียงหนึ่งเซสชันในไดเรกทอรีปัจจุบันของคุณคุณสามารถใช้:mksession
หรือ:mks
จากกลุ่มเพื่อบันทึกเซสชันปัจจุบันของคุณและเพียงvim -S
เปิดเซสชันสำรอง
คุณอาจต้องการตั้งค่าตัวเลือกเซสชันเหล่านี้ใน vimrc ของคุณ ตัวเลือกโดยเฉพาะอย่างยิ่งน่ารำคาญเมื่อคุณเปลี่ยน vimrc ของคุณหลังจากที่คุณบันทึกเซสชัน
set ssop-=options " do not store global and local values in a session
set ssop-=folds " do not store folds
โปรดทราบว่า: mksession จะไม่บันทึกการเปลี่ยนแปลงในไฟล์ใด ๆ ที่คุณทำ ฉันทำผิดพลาดจากการปิดเสียงเรียกเข้าหลังจากบันทึกเซสชันโดยสมมติว่าฉันจะรับช่วงต่อจากนั้น แต่ครั้งต่อไปที่ฉันเปิดเซสชั่นการเปลี่ยนแปลงที่ฉันทำกับไฟล์ก็หายไป
:mksession
ที่เกี่ยวข้องกับการ
:wqa
:xa
กดแป้นน้อยกว่าหนึ่งครั้ง เย้!
.vimrc
: vimrc au FocusLost * silent! wa
สิ่งนี้จะประหยัดอัตโนมัติเมื่อบัฟเฟอร์เสียโฟกัส
หากคุณใช้NERDTreeเป็น file explorer / dash ของคุณฉันขอแนะนำxolox / vim-session pluginแทนคำสั่ง built-in: mksession ด้วยเหตุผลบางอย่าง: mksession ล้มเหลวในการกู้คืนบัฟเฟอร์ NERDTree ระยะของคุณอาจแตกต่างกันไป แต่คิดว่าฉันจะแบ่งปันประสบการณ์ของฉัน
let g:nerdtree_tabs_open_on_gui_startup=0
และlet g:nerdtree_tabs_open_on_new_tab=0
เพื่อให้ xolox / vim-session ทำงาน
หากคุณต้องการที่จะดำเนินการโดยอัตโนมัติโดยไม่ต้องใช้ปลั๊กอินใด ๆ ที่คุณสามารถใช้หายไปและกลับมาจากกลุ่มเคล็ดลับวิกิพีเดีย
ทุกครั้งที่คุณออกจาก 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
if argc() == 0 au VimEnter * nested :call LoadSession() end
pwd
) ฉันจะตั้งเป็นไดเรคทอรี่ทำงานสุดท้ายก่อนออกจาก vim ได้อย่างไร? เพื่อที่จะสามารถโหลดเซสชั่นการทำงานที่ผ่านมามากกว่าเซสชั่นภายใต้~/
?
มีปลั๊กอินที่มีประโยชน์มากสำหรับภารกิจนี้vim-startifyซึ่งจัดการสิ่งอื่น ๆ เช่นไฟล์ที่เพิ่งเปิดใหม่ ฯลฯ มันมีอินเตอร์เฟสที่ใช้งานง่ายเช่นกัน
ฉันใช้มันตั้งแต่สองสามวันจนถึงตอนนี้มันทำงานได้อย่างสมบูรณ์ หวังว่ามันจะช่วยคุณ
เนื่องจากนี่เป็นครั้งแรกที่ 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
การเปลี่ยนแปลงที่น่าสังเกตที่นี่คือการแทนที่ที่เป็นทางเลือก หากคุณเปิดเป็นกลุ่มโดยไม่มีตัวเลือกมันจะเปิดเซสชันใด ๆ ที่มีอยู่และเขียนทับการเปลี่ยนแปลงที่ทำเมื่อคุณออกจาก หากเปิดเป็นกลุ่มพร้อมตัวเลือกจะสร้างเซสชันใหม่หากไม่มีอยู่นั่นหมายความว่าคุณสามารถเปิดไฟล์เดียวในไดเรกทอรีที่มีเซสชันโดยไม่ต้องเขียนทับ จากนั้นคุณสามารถเปิดเป็นกลุ่มโดยไม่มีตัวเลือกให้เรียกใช้เซสชันแทน หากไม่มีเซสชันอยู่ให้สร้างเซสชันใหม่
$HOME/.vim/plugin/sessions.vim
แต่ก็ไม่ได้บันทึกไฟล์เซสชัน ¯ \ _ (ツ) _ / ¯
มีปลั๊กอินนี้โทรที่ยอดเยี่ยมคือกลุ่มเซสชั่น มันทรงพลังมาก วิธีติดตั้ง:
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
โดยส่วนตัวแล้วฉันจะใช้ปลั๊กอิน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
ขอบคุณ @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
ขอบคุณ ...
หากคุณวางแผนที่จะมีเพียง 1 เซสชั่นสำหรับโครงการเพียงทำ
:mks
ซึ่งจะสร้างSession.vim
ไฟล์ในไดเรกทอรีปัจจุบันแล้วเปิดเซสชัน (จากไดเรกทอรีเดียวกัน):
vim -S
หากคุณเปลี่ยนเซสชันและต้องการบันทึก:
:mks!
นี่เป็นการบันทึกเซสชันไม่ใช่ตัวไฟล์เอง!
หากคุณวางแผนที่จะมีหลายเซสชันฉันต้องการบันทึกไว้ในไฟล์ที่ซ่อนอยู่ในไดเรกทอรีของโครงการ:
:mks .session-name.vim
หากต้องการเปิด (จากไดเรกทอรีเดียวกัน):
vim -S .session-name.vim
บันทึกเซสชัน:
:mks! .session-name.vim
เนื่องจากเซสชันถูกบันทึกในไฟล์ที่ซ่อนเพื่อดูอย่าลืม -a
ls -a
คุณสามารถจัดเก็บเซสชันได้ทุกที่ที่คุณต้องการ
Ex:
:mksession! D:/session.ses
สิ่งนี้จะเก็บเซสชั่นไว้ใน D drive
สิ่งนี้สามารถเปิดได้โดยการพิมพ์
:so D:/session.ses
ในไฟล์ vim ใด ๆ
ด้านล่างเป็นความเชื่อมั่นเท่านั้น ที่ได้ผลจริงสำหรับฉัน ฉันเอามาจากที่นี่ซึ่งคุณสามารถใช้เวอร์ชันที่ซับซ้อนกว่านี้ได้อีก
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
man
หน้า