สมมติว่าไฟล์ไม่มีการเปลี่ยนแปลงที่ไม่ได้บันทึกในบัฟเฟอร์ VIM ฉันต้องการให้โหลดซ้ำโดยอัตโนมัติหากไฟล์เปลี่ยนแปลงบนดิสก์ กรณีการใช้งานบ่อยที่สุดคือเมื่อฉันอัปเดตสำเนาการทำงานที่ไฟล์นั้นอยู่
ฉันจะบรรลุสิ่งนี้ได้อย่างไร
สมมติว่าไฟล์ไม่มีการเปลี่ยนแปลงที่ไม่ได้บันทึกในบัฟเฟอร์ VIM ฉันต้องการให้โหลดซ้ำโดยอัตโนมัติหากไฟล์เปลี่ยนแปลงบนดิสก์ กรณีการใช้งานบ่อยที่สุดคือเมื่อฉันอัปเดตสำเนาการทำงานที่ไฟล์นั้นอยู่
ฉันจะบรรลุสิ่งนี้ได้อย่างไร
คำตอบ:
ใน~/.vimrc
:
set autoread
autoread
จะเรียกใช้หลังจากเรียกใช้คำสั่งภายนอกเท่านั้น คำตอบนี้ให้รายละเอียดการแก้ปัญหา
นี่คือสิ่งที่ได้ผลสำหรับฉัน
set autoread
au CursorHold * checktime
บรรทัดแรกนั้นยังไม่เพียงพอ คุณสามารถใส่ในคุณ.vimrc
:help timestamp
" ดูเหมือนจะระบุว่าฉันเป็นคนที่มีข้อผิดพลาดและ Vim นั้นทำการตรวจสอบเหตุการณ์เฉพาะเท่านั้น ดังนั้น autocmd อาจจำเป็นต้องทำให้ตรวจสอบบ่อยขึ้น
Autoread ทำงานไม่ถูกต้อง งานต่อไปนี้สำหรับฉัน:
คุณจำเป็นต้องติดตั้งสคริปต์จากที่นี่
ฉันได้ผลลัพธ์ที่ดีที่สุดโดยการเรียกใช้ฟังก์ชันการตั้งค่าโดยตรงเช่นนั้น
let autoreadargs={'autoread':1}
execute WatchForChanges("*",autoreadargs)
เหตุผลนี้คือฉันต้องการเรียกใช้การตั้งค่า ipython / screen / vim
คุณสามารถแปลงให้เป็นมุมมองรุ่นปรับปรุงได้อย่างง่ายดาย
mkdir -p ~/bin
cat <<`OUT` > ~/bin/vimviewer
#!/usr/bin/env sh
exec vim -n --cmd "source /home/bryan/.vim/.vimrc.watchforchanges | let autoreadargs={'autoread':1} | execute WatchForChanges('*',autoreadargs)" $@
`OUT`
chmod 755 ~/bin/vimviewer
vimview test.txt
ปลั๊กอินvim-autoreadทำงานให้ฉันแล้ว:
เป็นกลุ่ม-AutoRead
ทำให้ vim โหลดไฟล์ที่เขียนบนดิสก์โดยอัตโนมัติ แต่ไม่แก้ไขในบัฟเฟอร์ตั้งแต่การเขียนล่าสุดจาก vim สิ่งนี้เปิดใช้งานไฟล์ที่เปิดเป็นกลุ่มที่จะแก้ไขโดยใช้แอปพลิเคชันอื่นและบันทึกไว้ เมื่อกลับไปเป็นกลุ่มตราบใดที่คุณยังไม่ได้แก้ไขไฟล์ตั้งแต่มีการเปลี่ยนแปลงครั้งล่าสุดไฟล์นั้นจะได้รับการอัปเดตโดยอัตโนมัติเพื่อแสดงการเปลี่ยนแปลงที่เกิดขึ้นบนดิสก์ราวกับว่าคุณได้กด: e ด้วยตนเอง
j
) เพื่อดูการปรับปรุงที่มีประสิทธิภาพ ฉันสร้างปัญหาที่นี่เกี่ยวกับเรื่องนี้: github.com/djoshea/vim-autoread/issues/3
จากคำตอบนี้(อ้างอิงจากคำตอบของPhanHaiQuangและความคิดเห็นโดย @flukus)
หนึ่งสามารถเรียกใช้ oneliner นี้จากอดีต (whithin vim) เมื่อจำเป็น (หรือใส่คำสั่งแต่ละคำสั่งใน vimrc เมื่อเปิดไฟล์บันทึก)
:set autoread | au CursorHold * checktime | call feedkeys("lh")
คำอธิบาย:
- autoread : อ่านไฟล์เมื่อมีการเปลี่ยนแปลงจากภายนอก (แต่มันไม่ทำงานด้วยตัวของมันเองไม่มีตัวจับเวลาภายในหรืออะไรทำนองนั้นมันจะอ่านไฟล์เมื่อ vim ทำการกระทำเช่นเดียวกับคำสั่งในอดีต:!
- CursorHold * การตรวจสอบเวลา: เมื่อเคอร์เซอร์ไม่ได้ถูกย้ายโดยผู้ใช้ตามเวลาที่ระบุใน 'updatetime' (ซึ่งเป็น 4,000 มิลลิวินาทีโดยค่าเริ่มต้น) เวลาตรวจสอบจะถูกดำเนินการซึ่งจะตรวจสอบการเปลี่ยนแปลงจากภายนอกไฟล์
- ปุ่มฟีดการโทร ("lh") : เคอร์เซอร์ถูกย้ายหนึ่งครั้งด้านขวาและด้านหลังซ้ายจากนั้นไม่มีสิ่งใดเกิดขึ้น (... ซึ่งหมายความว่า CursorHold นั้นเริ่มทำงานซึ่งหมายความว่าเรามีลูป )
lh
ไม่ทำอะไรเลยถ้าเคอร์เซอร์อยู่ที่ตำแหน่งสุดท้ายของบรรทัดlh
จะเปลี่ยนตำแหน่งของมัน
มีปลั๊กอินบางตัวที่แสดงที่นี่ซึ่งอาจใช้งานได้ขึ้นอยู่กับเวอร์ชั่นของ Vim ของคุณ
อีกวิธีหนึ่งคือการส่งchecktime
คำสั่งไปเป็นกลุ่มจากกระบวนการภายนอกเป็นระยะ นี่คือสคริปต์ ShellJS เพื่อทำสิ่งนี้ (ต้องการshelljs-plugin-sleep
, NeoVim และnvr
)
while (true) {
sleep(15);
var servernames = exec('nvr --serverlist').trim().split('\n');
if (!servernames.length || !servernames[0]) {
continue;
}
servernames.forEach(
(sn) => exec(`nvr -c "checktime" --servername ${sn}`) );
}