รีเฟรชเนื้อหาที่เปลี่ยนแปลงของไฟล์ที่เปิดใน vi (m)


362

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



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

คำตอบ:


464

คุณสามารถใช้:editคำสั่งโดยไม่ระบุชื่อไฟล์เพื่อโหลดไฟล์ปัจจุบัน หากคุณทำการแก้ไขไฟล์คุณสามารถใช้ :edit!เพื่อบังคับให้โหลดไฟล์ปัจจุบันซ้ำ (คุณจะสูญเสียการแก้ไข)

คำสั่งที่สามารถย่อโดย:edit :eแรงแก้ไขสามารถทำได้โดย:e!


2
"!" สะดุดฉัน แต่ตอนนี้มันชัดเจน
twan163

107
หมายเหตุ: ปกติแล้วจะย่อมา:e!จาก
Stéphane Chazelas

31
@StephaneChazelas: ใช่ถูกต้อง :) @ twan163: แทนที่จะใช้:editและ:edit!คุณสามารถใช้:eและ:e!ตามลำดับ
Thushi

11
สูญเสียการแก้ไขใช่และไม่ใช่ ขับเคลื่อนคุณยังสามารถuNdo :e!
gerrit

5
นอกจากนี้หากคุณต้องการโหลดบัฟเฟอร์ทั้งหมดของคุณให้เรียกใช้::bufdo e
pkout

193

นอกจากการรีเฟรชไฟล์ด้วยตนเอง:editแล้วคุณสามารถใส่ลงใน~/.vimrc

:set autoread

เพื่อให้ Vim รีเฟรชไฟล์ใด ๆ ที่ไม่ได้รับการแก้ไขโดย Vim โดยอัตโนมัติ :checktimeยังเห็น


2
ผู้ซื้อระวัง - หากคุณใช้รหัสสดและgit pullระวังว่าคุณอาจสูญเสียการเปลี่ยนแปลงที่ยังไม่ได้บันทึกบนหน้าจอได้โดยไม่ได้ตั้งใจ
azatar

5
@toszter ไม่เป็นกลุ่มจะรีเฟรชบัฟเฟอร์ไม่เปลี่ยนแปลงเท่านั้น ในกรณีที่มีการเปลี่ยนแปลงจะยังมีคิวรี: เก็บหรือโหลด
Ingo Karkat

10
NB autoread ไม่ทำงานโดยอัตโนมัติอย่างแน่นอน คุณต้องใช้gvimหรือเรียกใช้คำสั่งภายนอก
Sparhawk

3
ผู้ที่ใช้เป็นกลุ่มภายในของ tmux จะได้รับเหตุการณ์โฟกัสโดยใช้github.com/tmux-plugins/vim-tmux-focus-events ไม่เช่นนั้นจะไม่ช่วย Autoread ในเครื่องยกเว้นว่าคุณจะโทรมา:checktime
Karl Bartel ใน

3
autoreadสามารถเรียกใช้ X วินาทีอัตโนมัติหลังจากเคอร์เซอร์หยุดเคลื่อนไหวดูคำตอบนี้
Tom Hale

57

TL; DR

ข้ามไปที่Wrap-upหัวข้อvimrcเพื่อเพิ่มเพื่อทำให้ชีวิตของคุณดีขึ้น

ด้วยมือ

วิ่ง :checktime

ตรวจสอบว่ามีการเปลี่ยนแปลงบัฟเฟอร์ภายนอก Vim หรือไม่ สิ่งนี้จะตรวจสอบและเตือนคุณว่าคุณจะลงเอยด้วยไฟล์สองเวอร์ชัน

อัตโนมัติ

หากต้องการโหลดการเปลี่ยนแปลงโดยอัตโนมัติให้เพิ่มในvimrc:

set autoread

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

คำตอบนี้เพิ่มคำเตือน:

Autoread ไม่โหลดไฟล์ซ้ำนอกจากว่าคุณจะทำอะไรเช่นเรียกใช้คำสั่งภายนอก (เช่น!lsหรือ!shอื่น ๆ )

อ่านต่อไปเพื่อหาทางแก้ไข

ทริกเกอร์เมื่อเคอร์เซอร์หยุดเคลื่อนที่

เพิ่มในของคุณvimrc:

au CursorHold,CursorHoldI * checktime

โดยค่าเริ่มต้นCursorHoldถูกเรียกหลังจากเคอร์เซอร์ยังคงยังคงเป็นเวลา 4 วินาทีและสามารถกำหนดค่าผ่านทางUpdateTime

ทริกเกอร์เกี่ยวกับการเปลี่ยนบัฟเฟอร์หรือโฟกัสเทอร์มินัล

เพิ่มสิ่งต่อไปนี้เพื่อvimrcทริกเกอร์autoreadเมื่อเปลี่ยนบัฟเฟอร์ขณะอยู่ในกลุ่ม:

au FocusGained,BufEnter * :checktime

การจับโฟกัสหน้าต่างเทอร์มินัลภายในกลุ่มแบบธรรมดา

หากต้องการให้FocusGained(ดูด้านบน) ทำงานเป็นกลุ่มแบบธรรมดาภายในเทอร์มินัลอีมูเลเตอร์ (Xterm, tmux ฯลฯ ) ติดตั้งปลั๊กอิน: vim-tmux-focus-events

ในรุ่น tmux> 1.9 คุณจะต้องเพิ่ม.tmux.conf:

set -g focus-events on

สรุป

แจ้งเตือนเมื่อมีautoreadทริกเกอร์ยังเป็นไปได้

นี่คือvimrcบรรทัดของฉันที่จะใช้ทั้งหมดข้างต้น:

" Triger `autoread` when files changes on disk
" https://unix.stackexchange.com/questions/149209/refresh-changed-content-of-file-opened-in-vim/383044#383044
" https://vi.stackexchange.com/questions/13692/prevent-focusgained-autocmd-running-in-command-line-editing-mode
autocmd FocusGained,BufEnter,CursorHold,CursorHoldI * if mode() != 'c' | checktime | endif
" Notification after file change
" https://vi.stackexchange.com/questions/13091/autocmd-event-for-autoread
autocmd FileChangedShellPost *
  \ echohl WarningMsg | echo "File changed on disk. Buffer reloaded." | echohl None

ขอขอบคุณที่ErichBSchulz au CursorHoldสำหรับการชี้ให้ฉันในทิศทางที่ถูกต้องกับ


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