อัพเดท 2015-06-25 :
- ฉันได้ทิ้งวิธีการ "เปลือก" เพราะมันผิดปกติเกินไป มันหยุดโหมดแทรกและกระบวนการซอมบี้ทางซ้าย ดูประวัติการแก้ไขของโพสต์นี้คือคุณต้องการเห็นมันจริงๆ
- ผมได้ทำปลั๊กอินจากนี้auto_autoread.vim ในขณะนี้มันมีประสิทธิภาพเหมือนกับโค้ดด้านล่าง แต่ฉันอยากจะแนะนำให้คุณใช้ปลั๊กอินเพราะมันน่าจะได้รับการอัพเดท
อะไรautoread
ทำอย่างไร
ในการตอบคำถามนี้เราต้องเข้าใจก่อนว่าautoread
ตัวเลือกทำอะไรและที่สำคัญกว่านั้นคือสิ่งที่ไม่ได้ทำ
แต่น่าเสียดายที่:help 'autoread'
ไม่ได้มีข้อมูลจำนวนมากเกี่ยวกับเรื่องนี้ก็แค่พูดว่า"ไฟล์ที่ได้รับการตรวจพบจะได้รับการเปลี่ยนแปลงภายนอกที่เป็นกลุ่ม" Vim ตรวจพบว่าไฟล์มีการเปลี่ยนแปลงอย่างไร ในการดำเนินการบางอย่างเป็นกลุ่มจะตรวจสอบเวลาการแก้ไขของไฟล์
เมื่อ:
:checktime
ถูกนำมาใช้;
- บัฟเฟอร์ถูกป้อน
:diffupdate
ถูกนำมาใช้;
:e
ออกให้สำหรับไฟล์ที่มีบัฟเฟอร์อยู่แล้ว
- รันคำสั่งภายนอกด้วย
!
;
- กลับสู่เบื้องหน้า (
^Z
, fg
เฉพาะเมื่อเชลล์มีการควบคุมงาน);
สำหรับ gVim สิ่งนี้จะกระทำเมื่อ:
- ปิดเมนู "คลิกขวา" (โดยเลือกบางอย่างหรือเพียงแค่ปิด)
- โฟกัสเปลี่ยนไป (นี่คือสิ่งที่คุณสังเกตเห็นแล้ว);
- ปิดกล่องโต้ตอบไฟล์ของเบราว์เซอร์ที่ปรากฏขึ้นหากคุณใช้ "ไฟล์ -> เปิด", "ไฟล์ -> บันทึกเป็น" จากเมนู (เช่นเดียวกับที่อื่น ๆ )
ฉันรวบรวมข้อมูลจากแหล่งที่มาเป็นกลุ่มโดยการระบุตำแหน่งทุกสายไป
buf_check_timestamp()
, check_timestamps()
ฟังก์ชั่นและสถานที่ที่
มีการตั้งค่าneed_check_timestamps
TRUE
ฉันอาจพลาดเหตุการณ์บางอย่าง แต่สิ่งสำคัญที่ต้องจำคือVim จะตรวจสอบเฉพาะว่าไฟล์นั้นถูกแก้ไขในชุด cirsumstances ที่ จำกัด มากๆ หรือไม่ แน่นอนว่ามันไม่ได้ "สำรวจ" ไฟล์สำหรับการเปลี่ยนแปลงตลอดเวลาnวินาทีซึ่งเป็นสิ่งที่คุณต้องการ
ดังนั้นสำหรับวัตถุประสงค์ของคุณset autoread
ไม่เพียงพอ
ใช้ Python
สิ่งนี้จัดตารางเวลาเธรด Python ให้ทำงานในพื้นหลังโดยจะรัน
:checktime
ทุก ๆnวินาที หากautoread
มีการเปิดใช้งานนี้จะโหลดบัฟเฟอร์จากดิสก์อื่นมันก็จะเตือน
ซึ่งกำหนดให้เป็นกลุ่มมี+python
หรือใน+python3
:version
ควรทำงานได้กับทุกแพลตฟอร์ม (รวมถึง Windows)
fun! AutoreadPython()
python << EOF
import time, vim
try: import thread
except ImportError: import _thread as thread # Py3
def autoread():
vim.command('checktime') # Run the 'checktime' command
vim.command('redraw') # Actually update the display
def autoread_loop():
while True:
time.sleep(1)
autoread()
thread.start_new_thread(autoread_loop, ())
EOF
endfun
คุณสามารถเริ่มต้นสิ่งนี้ได้โดยใช้:call AutoreadPython()
; แน่นอนคุณสามารถทำได้ใน autocmd; ตัวอย่างเช่น:
autocmd *.c call AutoreadPython()
เล่ม
มีวิธีการเพิ่มเติมเช่นคุณสามารถใช้เครื่องมือเช่น
entr
หรือ Python inotify
หรือgamin
โมดูลเพื่อตรวจสอบการเปลี่ยนแปลงของไฟล์:checktime
ตรวจสอบบัฟเฟอร์ทั้งหมดหากไม่ได้รับอาร์กิวเมนต์ใด ๆ ซึ่งสามารถปรับปรุงได้โดยการตรวจสอบบัฟเฟอร์เดียวหรือ ไฟล์บางไฟล์
อย่างไรก็ตามคำตอบนี้ค่อนข้างยาว :-) วิธีการเหล่านี้ควร (หวังว่า!) ใช้ได้ดีกับสถานการณ์ส่วนใหญ่หรือควรปรับให้เข้ากับสถานการณ์ของคุณได้ง่าย
PS ฉันพยายามใช้ Ruby ด้วย แต่น่าเสียดายที่ Ruby threads (ใช้Thread
) ไม่ทำงานในพื้นหลังเหมือนกับที่ Python ทำดังนั้นฉันจึงไม่สามารถใช้งานได้ (อาจมีวิธีอื่นด้วย)
CursorHold
เหตุการณ์ล่ะ? ถ้าเป็นกลุ่มไม่มีโฟกัสควรเรียกทุก n วินาที