ฉันจะป้องกันไม่ให้ Vim ปล่อยไฟล์มากเกินไป (เช่น swap, backup, เลิกทำ) ได้อย่างไร?


13

โดยค่าเริ่มต้นvimออกจากไฟล์ swap ในไดเรกทอรีโครงการของฉันและเมื่อเกิดปัญหามันออกจากไฟล์สำรอง

ฉันจะป้องกันสิ่งนี้ได้ไหม หรือฉันต้องการอัปเดต.VCSignoreไฟล์โครงการทั้งหมดของฉัน?

คำตอบ:


16

สำรองไฟล์

ตามค่าเริ่มต้น Vim จะไม่ทิ้งไฟล์สำรองไว้ เป็นเพียงไฟล์ชั่วคราวที่มีอยู่ในขณะที่ Vim กำลังบันทึกบัฟเฟอร์ลงดิสก์ ตามที่อธิบายใน:help backup-tableพฤติกรรมนี้สามารถควบคุมได้โดยตัวเลือก'backup'และ'writebackup':

'backup' 'writebackup'  action  ~
   off       off    no backup made
   off       on     backup current file, deleted afterwards (default)
   on        off    delete old backup, backup current file
   on        on     delete old backup, backup current file

สลับไฟล์

สำหรับสว็อปไฟล์มันจะมีประโยชน์ในการรวบรวมมันในไดเรคทอรีเฉพาะ สามารถทำได้ด้วย'directory'ตัวเลือก ตัวอย่างเช่น

:set directory^=$HOME/.vim/tmp//

จะเพิ่ม$HOME/.vim/tmpไว้ในส่วนหัวของรายการไดเรกทอรีที่ Vim จะพยายามใช้เมื่อสร้างไฟล์สลับ การติดตาม//ทำให้ Vim เข้ารหัสชื่อพา ธ ทั้งหมดไปยังไฟล์ดังนั้นจึงไม่มีการชนกับไฟล์ที่มีชื่อคล้ายกันจากไดเรกทอรีที่แตกต่างกัน

Caveat : สิ่งนี้จะปิดการใช้งานความสามารถของ Vim ในการสังเกตว่าผู้ใช้หลายคนพยายามแก้ไขไฟล์เดียวกันหรือไม่เนื่องจากไฟล์ swap ถูกเก็บไว้ในตำแหน่งที่ต่างกัน

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

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

ข้อแม้ : 'directory'ตั้งแต่แลกเปลี่ยนไฟล์เท่านั้นเกิดขึ้นเมื่อบัฟเฟอร์มีการแก้ไขนี้มีผลเช่นเดียวกับการตั้งค่า หากบัฟเฟอร์ไม่มีการแก้ไขแล้ว Vim อื่นสามารถเริ่มแก้ไขได้โดยไม่ต้องแจ้งให้ทราบล่วงหน้า หาก Vim ที่สองบันทึกก่อนที่จะมีการเปลี่ยนแปลงครั้งแรกพวกเขาจะไม่สังเกตเห็นจนกว่าผู้ใช้จะพยายามบันทึกหรือสิ่งที่เรียก Vim เพื่อตรวจสอบว่ามีการแก้ไขไฟล์หรือไม่


5

ฉันใช้.vimrcหลายเครื่องรวมถึงเซิร์ฟเวอร์ที่ใช้ร่วมกัน ฉันไม่ต้องการให้คนอื่นเห็นไฟล์ที่ฉันกำลังทำงานอยู่และฉันต้องการทำให้โฮมไดเร็กตอรี่ของฉันค่อนข้างสะอาด ดังนั้นนี่คือทางออกของฉันซึ่งจะทำงานบน Linux และ Mac OS X ได้ดี

" Sets central temp file location, to prevent local default behavior.
if isdirectory($HOME . '/.vim/.tmp') == 0
  :silent !mkdir -m 700 -p ~/.vim/.tmp > /dev/null 2>&1
endif

set backupdir=~/.vim/.tmp ",~/.local/tmp/vim,/var/tmp,/tmp,
set directory=~/.vim/.tmp ",~/.local/tmp/vim,/var/tmp,/tmp,

โปรดทราบว่าสิ่งนี้จะสร้าง.tmpไดเรกทอรีภายใต้~/.vimหากยังไม่มีอยู่ นี่จะเป็นบ้านใหม่ของไฟล์ swap ของคุณ สำหรับการยกเลิกไฟล์ฉันยังมีสิ่งต่อไปนี้ในของฉัน.vimrc(ซึ่งคล้ายกันมาก):

if exists("+undofile")
  " undofile -- This allows you to use undos after exiting and 
  "             restarting. NOTE: only present in 7.3+
  "             :help undo-persistence
  if isdirectory( $HOME . '/.vim/.undo' ) == 0
    :silent !mkdir -m 700 -p ~/.vim/.undo > /dev/null 2>&1
  endif
  set undodir=~/.vim/.undo
  set undofile
endif

1

นี่คือสิ่งที่ฉันทำใน vimrc ของฉัน:

fun! MkdirIfNeeded(dir, flags, permissions)
    if !isdirectory(a:dir)
        call mkdir(a:dir, a:flags, a:permissions)
    endif
endfun

" Set (& create if needed) a temp directory to keep backup & swap files
if has('win32')
    let whoami = substitute(system("whoami /LOGONID"), '\n', '', '')
    let tmpdir = 'C:/tmp/vim_' . whoami
else
    let whoami = substitute(system("whoami"), '\n', '', '')
    let tmpdir = '/var/tmp/vim_' . whoami
endif
call MkdirIfNeeded(tmpdir, 'p', 0700)

let &backupdir = tmpdir
let &dir = tmpdir
let &undodir = tmpdir

มันจะสร้าง/var/tmp/vim_<username>และใช้สิ่งนี้เพื่อจัดเก็บไฟล์ที่เกี่ยวข้องกับเสียงเรียกเข้าทั้งหมด ทำให้ไดเรกทอรีโครงการของคุณสะอาด

การใช้whoamiทำให้แน่ใจว่าคุณสามารถใช้ vimrc ได้ทั่วโลก (เช่นสำหรับผู้ใช้ & รูท) ในขณะที่ยังใช้ไดเรกทอรีแยกอยู่ หากคุณไม่ต้องการสิ่งนี้คุณสามารถแทนที่ด้วยไดเรกทอรีฮาร์ดโค้ดเพื่อเริ่มต้นได้เร็วขึ้น คุณสามารถใช้ไดเรกตอ~/.vim/รีได้ แต่ฉันชอบใช้/var/tmpเพราะโดยปกติจะเป็นระบบไฟล์แบบแยก

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


1
/var/tmpสามารถเขียนได้ทั่วโลกเสมอ - เป็นไดเรกทอรีชั่วคราวของระบบ (คุณสามารถเปลี่ยนเป็นไม่ได้ แต่เป็นหนึ่งในสิ่งเหล่านั้นที่ระบบเหมือน Unix ยินดีที่จะให้คุณเก็บชิ้นส่วนหลังจากที่คุณทำลายมัน) หากคุณมีผู้ใช้รายอื่นในระบบเขา / เธอสามารถสร้าง/var/tmp/vim_«your_username»โดยใช้สิทธิ์ที่ตนเลือก จากนั้นเติม symlink ลงในไฟล์สำคัญของคุณซึ่งอาจจะถูกทำลายโดย vim tempfiles
Derobert

@derobert เฉพาะในกรณีที่ไม่มี หากคุณใช้ระบบนี้และมีผู้ใช้จำนวนมากคุณอาจต้องการเพิ่มการสร้างไดเรกทอรีนี้adduserหรือสิ่งที่คุณใช้เพื่อสร้างผู้ใช้ ไม่ว่าในกรณีใดคนส่วนใหญ่ใช้ Vim บนเครื่องที่เชื่อถือได้ (แต่ความคิดเห็นของคุณดีมากเช่นนั้น)
Martin Tournoij

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

@derobert /var/คือระบบไฟล์ที่แตกต่างกัน ทฤษฎีก็คือว่ามันจะป้องกันไม่ให้มากเขียนบน/, /usrหรือ/homeนำไปสู่การกระจายตัวน้อยและมีความเสี่ยงของการทุจริตไฟล์ในกรณีที่มีการผิดพลาด ... และนี่ก็เป็นเหตุผลที่กล่องจดหมายและสิ่งที่อยู่บน/varโดยค่าเริ่มต้นและไม่ได้อยู่ใน homedir ...
Martin Tournoij
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.