ฉันจะโหลดไฟล์ปัจจุบันได้อย่างไร


145

บ่อยครั้งที่ฉันทำงานกับไฟล์ที่ควบคุมเวอร์ชันดังนั้นจึงเป็นไปได้สำหรับการเปลี่ยนแปลงที่จะทำกับพวกเขานอก Vim

วิธีที่รวดเร็วในการโหลดไฟล์ใหม่โดยไม่ต้องปิดและเปิด Vim ใหม่คืออะไร? และมีวิธีการทำสิ่งนี้โดยอัตโนมัติหรือไม่?


" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
Tom Hale

หากคุณติดตั้งเป็นกลุ่มคำถามที่พบบ่อย , คุณจะได้รับคำตอบแบบออฟไลน์ที่นั่นและค้นหา:h vim-faq ยากที่จะจดจำแท็ก/reload :h faq-5.8
Hotschke

คำตอบ:


172

คำสั่งที่คุณต้องการคือ:e(ย่อมาจาก:edit) หากคุณใช้:edit!มันจะยกเลิกการเปลี่ยนแปลงในท้องถิ่นและโหลดซ้ำ

คุณยังสามารถให้ vim ทำสิ่งนี้โดยอัตโนมัติด้วยset autoreadใน vimrc ของคุณ


5
ดูคำตอบนี้autoreadสำหรับคำเตือนและการแก้ปัญหาเกี่ยวกับ
Tom Hale

4
ในการทำเช่นนี้สำหรับบัฟเฟอร์ทั้งหมดให้ใช้:bufdo :eหรือ:bufdo :e!
Aaron H.

1
@AaronH ขอบคุณสำหรับสิ่งนั้น! ฉันมักจะเปิดบัฟเฟอร์หลายร้อยครั้งและเมื่อสลับสาขาฉันมักจะปิดเสียงเรียกเข้าและรีสตาร์ทเพื่อรีเฟรชบัฟเฟอร์ทั้งหมดด้วยเนื้อหาใหม่ นี่จะเป็นเครื่องบันทึกเวลาที่สำคัญ!
g19fanatic

1
@AaronH ที่สอง:เป็นทางเลือก: :bufdo eจะทำงานเหมือนเดิม
JoL

19

ในหลายกรณีset autoreadจะไม่ทำงานตามคำตอบนี้ :

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

เหตุการณ์โฟกัสจะเรียกแต่เหล่านี้ยังไม่ได้บันทึกเว้นแต่ใช้autoread gvimดังนั้นถ้าวิ่งธรรมดาvimภายในหน้าต่าง terminal หรือ tmux ติดตั้งปลั๊กอินเป็นกลุ่ม-tmux โฟกัสเหตุการณ์

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

set -g focus-events on

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

au FocusGained,BufEnter * :checktime

สิ่งนี้ทำให้ฉันรำคาญมาหลายปี ขอบคุณสำหรับการแก้ปัญหาอย่างละเอียด! 💯😄
นาธานลอง

9

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


3

ปลั๊กอินที่ดีในการปรับปรุงautoread https://github.com/djoshea/vim-autoread

ทำให้ vim โหลดไฟล์ที่เขียนบนดิสก์โดยอัตโนมัติ แต่ไม่ได้แก้ไขในบัฟเฟอร์ตั้งแต่การเขียนล่าสุดจาก vim สิ่งนี้เปิดใช้งานไฟล์ที่เปิดเป็นกลุ่มที่จะแก้ไขโดยใช้แอปพลิเคชันอื่นและบันทึกไว้ เมื่อกลับไปเป็นกลุ่มตราบใดที่คุณยังไม่ได้แก้ไขไฟล์ตั้งแต่มีการเปลี่ยนแปลงครั้งล่าสุดไฟล์จะได้รับการอัปเดตโดยอัตโนมัติเพื่อแสดงการเปลี่ยนแปลงที่เกิดขึ้นบนดิสก์ราวกับว่าคุณได้กด: e ด้วยตนเอง


ยินดีต้อนรับสู่ Vi Stack Exchange นี่เป็นคำตอบสำหรับลิงค์เท่านั้น คุณสามารถปรับปรุงได้โดยอธิบายปลั๊กอิน (เช่นมันทำอะไรได้บ้างจะใช้มันอย่างไรเพื่อให้บรรลุเป้าหมายของ OP)
John O'M

0

ฉันมีปัญหาในการดูเนื้อหาของไฟล์อัปเดตไฟล์ภายนอกแสดงไฟล์ที่เปลี่ยนแปลงและมีตัวเลือกให้แก้ไขเมื่อจำเป็น ฉันแก้ไขด้วยตัวเลือกบรรทัดคำสั่งเซิร์ฟเวอร์ / ระยะไกลเป็นแรงบันดาลใจจากคำตอบนี้


ด้วยคำสั่งต่อไปนี้ไฟล์สามารถโหลดใหม่ผ่านคำสั่งภายนอก ก่อนอื่นให้เปิดไฟล์ที่สงสัยด้วย Vim ขณะที่เริ่มต้นเซิร์ฟเวอร์อินสแตนซ์

vim --servername JABBERWOCKY /tmp/alice.log

echo "Curiouser and curiouser" >> /tmp/alice.logสมมติว่าไฟล์ที่ได้รับการเปลี่ยนแปลงภายนอกเช่นโดย เมื่อจำเป็นให้ส่งคำสั่งไปยังเซิร์ฟเวอร์อินสแตนซ์เพื่อโหลดไฟล์ซ้ำ คำสั่งนี้จะเสร็จอย่างรวดเร็วและไม่วางไข่แก้ไขใหม่

vim --servername JABBERWOCKY --remote-send ":e<CR>"

หากไฟล์ที่เปิดมีการเปลี่ยนแปลงเป็นกลุ่มและภายนอกจะมีข้อขัดแย้งระหว่างการโหลดซ้ำ (ข้อความเตือนจะปรากฏขึ้น) สำหรับกรณีที่ว่าการตัดสินใจจะต้องมีการทำ: ทิ้งไว้กับที่และให้การเปลี่ยนแปลงในกลุ่มหรือยกเลิกการเปลี่ยนแปลงในท้องถิ่นและบังคับให้โหลด


คำสั่ง--remote-sendด้านบนนี้ต้องการการโหลดซ้ำด้วยตนเอง อย่างไรก็ตามคำสั่งนั้นสามารถเชื่อมโยงกับการวนรอบอย่างง่ายโดยใช้ Bash's for/ whileหรือการใช้หนึ่งซับในแฮ็กใน Linux / Unix:

watch -n 1 'vim --servername JABBERWOCKY --remote-send ":e<CR>"'

แม้ว่าจะไม่ได้ทดสอบฉันมั่นใจว่าบางสิ่งเช่นนี้สามารถรับรู้ได้ใน PowerShell ด้วย

บน Linux / Unix คุณสามารถรับรู้แนวทางการขับเคลื่อนเหตุการณ์โดยการฟังเหตุการณ์ระบบไฟล์โดยใช้เช่นไลบรารีinotifyหากคุณไม่ได้ใช้ระบบไฟล์ที่บ้าเกินไป โดยส่วนตัวผมชอบใช้เครื่องมือEntrจำนวนมากซึ่งดูเหมือนว่าจะถูกรวมอยู่ในลินุกซ์ที่สำคัญ จากนั้นฉันจะได้รับ:

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.