ฉันจะทำให้ Vim ทำงานอย่างไรเช่น "tail -f" ได้อย่างไร


36

ฉันต้องการทราบว่ามีวิธีที่จะทำให้ Vim ทำตัวเป็นแบบtail -fนี้หรือไม่
แม้แต่ปลั๊กอิน Vim ที่ดีที่สุดที่ฉันเคยพบมาก็ไม่ได้ทำตามที่ฉันคาดไว้

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

ทำอย่างไร
(ฉันไม่ต้องการโหลดไฟล์ทั้งหมดเนื่องจากไฟล์บันทึกบางไฟล์มีขนาดใหญ่มากวิธีที่ดีที่สุดคือการโหลดบรรทัดสุดท้ายเท่านั้นเช่นtail -fทำ)


2
เหตุใดจึงต้องอยู่ภายในvim? มีอะไรผิดปกติกับtail -f?
สเวน

1
เพราะฉันต้องการพลังของเสียงเรียกเข้าเมื่อฉันอ่าน logfiles ชอบความสามารถในการค้นหารูปแบบและเพลิดเพลินไปกับการเน้นไวยากรณ์เป็นพิเศษ ฉันสร้างไฮไลต์ของฉันเองสำหรับไฟล์บันทึก (ผูกอาปาเช่ ฯลฯ )

คุณอาจสนใจautoreadและFileChangedShell >: help autoread>: ช่วย FileChangedShell
gsi-frank

2
เพียงค้นหาคุณสามารถทำแทนless +F tail -fไม่ได้ให้การเน้นไวยากรณ์กับคุณ
Dennis Kaarsemaker

คำตอบ:


28

คุณไม่สามารถทำให้ทำตัวเหมือนvim tail -fคุณสามารถทำให้lessพฤติกรรมเช่นการรวมกันของvimและtail -fแม้ว่า

ส่งต่อโหมด (ติดตาม) ตลอดไป

lessมีโหมดไปข้างหน้าตลอดไปที่คุณสามารถป้อนโดยการกดFหรือผ่าน+Fไปเป็นอาร์กิวเมนต์

$ less +F

ในโหมดนี้lessจะทำงานเหมือนtail -fว่ามันจะไม่หยุดอ่านเมื่อถึงจุดสิ้นสุดไฟล์ มันรีเฟรชอย่างต่อเนื่องกับข้อมูลใหม่จากไฟล์ Ctrlcเพื่อออกจากโหมดนี้ให้กด

การเน้นไวยากรณ์

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

 export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"

นอกจากนี้คุณยังต้องบอกlessให้ผ่านด่านหนีดิบ (สิ่งเหล่านี้บอกวิธีการเทอร์มินัลข้อความสี) โดยส่งผ่าน-Rแฟล็ก คุณสามารถบอกlessให้แกล้งทำเป็นว่ามันถูกส่งผ่านการ-Rตั้งค่าสถานะโดยการตั้งค่าLESSตัวแปรสภาพแวดล้อม

 export LESS=' -R '

เมื่อlessไม่เพียงพอ

แม้ว่าจะlessมีปุ่มลัดเหมือนกัน แต่ก็ไม่เหมือนกับ Vim บางครั้งก็รู้สึกแปลกใหม่และขาดคุณสมบัติที่สำคัญเช่นการรวม ctags และความสามารถในการแก้ไขข้อความ

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


5
vim --servername TAIL_VIM /tmp/somefile

ตอนนี้ในเชลล์อื่น (เช่น bash) คุณสามารถทำได้:

while true
do
    inotifywait --event modify /tmp/somefile \
    && vim --servername TAIL_VIM --remote-send '<C-\><C-N>:edit!<CR>G';
done

ที่ <C -> <CN> บังคับให้กลุ่มไปที่โหมดปกติ "แก้ไข!" แจ้งให้ vim ทำการโหลดไฟล์ปัจจุบันอีกครั้ง (CR จำลองการกดปุ่ม Enter) และ G ไปที่ด้านล่างของไฟล์ การลบ (G) ช่วยให้ง่ายต่อการแทรกไฟล์ในขณะที่อินพุตกำลังเข้ามา


ฉันเห็นพารามิเตอร์ "- ชื่อผู้ใช้" ในผู้ชาย แต่ฉันได้รับข้อความแสดงข้อผิดพลาดดังต่อไปนี้:VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Feb 10 2013 02:28:47) Option inconnue: "--servername=toto" Plus d'info avec: "vim -h"
Fox

ถ้าคุณเป็นกลุ่ม - รุ่นที่คุณเห็น + ไคลเอนต์เซิร์ฟเวอร์ (ไม่ใช่ -clientserver พร้อมกับ hypen)? ถ้าไม่หลายคนก็คอมไพล์เสียงเรียกเข้าจากแหล่งที่มาโดยใช้. /configure
with

ใช่มี + ไคลเอนต์เซิร์ฟเวอร์ ฉันมีรุ่น Ubuntu
Fox

1

ฉันพบคำตอบด้วยความเห็นของEvan Teitelman ทางออกของฉันเป็นแรงบันดาลใจจาก/usr/share/vim/vimcurrent/macros/less.vim

ฉันสร้างฟังก์ชั่นของตัวเอง แต่สามารถปรับปรุงได้มาก

function! Tailf()
    e
    normal G
    redraw

    sleep 1
    call Tailf()
endfunction

และกดCTRL + Cเพื่อออกจาก Tailf

ในการเปิดไฟล์บันทึกในโหมด Tailf: view -M "+call Tailf()" /path/to/logfile.log

สิ่งที่ฉันไม่ชอบคือการsleepโทรซึ่งไม่อนุญาตให้ทำอะไรเป็นกลุ่มในระหว่างการรีเฟรชอัตโนมัติ วิธีที่ดีที่สุดคือถ้าบัฟเฟอร์นั้นเป็นแบบอัตโนมัติและจะอัปเดตแม้ว่าฉันจะอยู่ในหน้าต่างแยกอื่น อย่างไรก็ตามมันเป็นการเริ่มต้นที่ดี :)


2
ดูเหมือนว่าจะอ่านไฟล์ทั้งหมดอีกครั้งซึ่งไม่ใช่สิ่งที่คุณต้องการใช่ไหม
แบร์นฮาร์ด

นี่จะโหลดไฟล์ทั้งหมดอีกครั้ง มันอาจจะไม่ยากเกินไปที่จะสร้างปลั๊กอินตาม inotifywait และ:readรอจนกว่าไฟล์จะได้รับการแก้ไขและถ้ามันถูกต่อท้ายให้อ่านในบรรทัดที่ด้านล่างของไฟล์

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

@EvanTeitelman ตกลงฉันเห็นวิธีใช้ inotifywait ตอนนี้ ฉันรู้ทุกครั้งที่มีการเปลี่ยนแปลงไฟล์ แต่จะรู้ได้อย่างไรว่ามันถูกต่อท้าย (แก้ไขไม่สมบูรณ์) และจะรู้ได้อย่างไรว่ามีการเพิ่มบรรทัดใหม่จำนวนเท่าใด?
Fox

อ่านจำนวนบรรทัดในไฟล์ทุกครั้งที่มีการเปลี่ยนแปลงไฟล์ หากจำนวนบรรทัดเพิ่มขึ้นอ่านในการเปลี่ยนแปลง

1

ไม่ใช่วิธีแบบเรียกซ้ำสำหรับสิ่งเดียวกัน:

cmap tailf<CR> call Tailf()<CR>
         function! Tailf()
    "Press C-c to stop tailing
        while 1
            e                                  
            normal G
            redraw
            sleep 1
        endwhile
    endfunction

1

ฉันชอบมันสั้นและไม่มีการแฮ็คจำนวนมาก คุณสามารถเรียกใช้ oneliner นี้ได้จาก ex (whithin vim) เมื่อต้องการ (หรือใส่แต่ละคำสั่งใน vimrc เมื่อเปิดไฟล์บันทึก)

:set autoread | au CursorHold * checktime | call feedkeys("lh")

(หากคุณต้องการข้าม (เกือบ) ไปยังจุดสิ้นสุดของไฟล์เพียงแค่ใช้ "G" แทน "lh" ด้วยปุ่มลัด)

คำอธิบาย:

  • autoread: อ่านไฟล์เมื่อมีการเปลี่ยนแปลงจากภายนอก (แต่มันไม่ทำงานด้วยตัวเองไม่มีตัวจับเวลาภายในหรืออะไรทำนองนั้นมันจะอ่านไฟล์เมื่อ vim ทำการกระทำเช่นเดียวกับคำสั่งในอดีต :!
  • CursorHold * checktime: เมื่อผู้ใช้ไม่ได้ย้ายเคอร์เซอร์ตามเวลาที่ระบุในupdatetime(ซึ่งคือ 4,000 มิลลิวินาทีโดยค่าเริ่มต้น) checktimeจะถูกดำเนินการซึ่งจะตรวจสอบการเปลี่ยนแปลงจากภายนอกไฟล์
  • call feedkeys("lh"): เคอร์เซอร์ถูกย้ายหนึ่งครั้งทางด้านขวาและด้านหลังซ้าย และจากนั้นไม่มีอะไรเกิดขึ้น (... ซึ่งหมายถึงนั่นCursorHoldคือสิ่งที่ถูกเรียกซึ่งหมายความว่าเรามีการวนรอบ )

หากต้องการหยุดการเลื่อนเมื่อใช้งานcall feedkeys("G")ให้เรียกใช้งาน:set noautoread- ตอนนี้กลุ่มจะบอกว่าไฟล์ถูกเปลี่ยนและถามว่ามีใครต้องการอ่านการเปลี่ยนแปลงหรือไม่)

ฉันชอบความคิดที่จะดู logfiles ในกลุ่ม (แทน tail -f) เช่นเมื่อคุณทำงานในเซสชัน ssh โดยไม่มีหน้าจอ / tmux นอกจากนี้คุณสามารถคัดลอกโดยตรงจาก logfile หากจำเป็นหรือบันทึกผลลัพธ์โดยตรงหรือ ... สิ่งที่คุณสามารถทำได้ด้วย vim :)

* จากคำตอบนี้(อ้างอิงจากคำตอบของPhanHaiQuangและความคิดเห็นโดยflukus )


0

แก้ไข: ฉันขอโทษข้ามอย่างสมบูรณ์ว่าคุณได้ลองแล้ว

คุณสามารถลองใช้ปลั๊กอินTail Bundleฉันคิดว่ามันควรทำในสิ่งที่คุณกำลังมองหา

ในการติดตั้งให้เปิด tail-3.0.vba ด้วย vim และ execute:

:so %

รีสตาร์ทและคุณควรจะสามารถตัดไฟล์จากภายในกลุ่มดังนี้:

:Tail /path/to/file

0

สำหรับ VIM 8.0+ เท่านั้นพวกเขาแนะนำตัวจับเวลาดังนั้นคุณสามารถใช้ตัวจับเวลาเพื่อจำลองการทำงานของ tail มันทำงานได้อย่างมีประสิทธิภาพในประสบการณ์ของฉัน

ฉันได้แมปคีย์ F6 เพื่อเปิดท้ายและ F7 เพื่อปิดท้ายคุณสามารถปรับแต่งคำสั่งเหล่านั้นในคำสั่งด้านล่างและดูหัวข้อของฉันด้านล่างสำหรับคำเตือน

เรียกใช้ต่อไปนี้

exe ":function! Tail(timer) \n :exe 'normal :e!\<ENTER>G' \n endfunction"
map <F6> :exe timer_start(2000, 'Tail', {'repeat':-1})<CR> 
map <F7> :exe timer_stopall()<CR>

คุณยังสามารถทำให้คำสั่งข้างต้นเป็นส่วนหนึ่งของ vimrc เพื่อให้คุณมีอยู่เสมอ

คำเตือนบางอย่าง:

  • ฉันถือว่าคุณไม่มีตัวจับเวลาอื่นดังนั้น timer_stopall () จะหยุดตัวจับเวลาทั้งหมดได้อย่างมีประสิทธิภาพ คุณสามารถแก้ไขสิ่งนี้ได้อีกเล็กน้อยเพื่อรับ ID ในระหว่าง timer_start จากนั้นกดค้างไว้เป็นต้น แต่ดูเหมือนว่าจะทำงานกับฉันบ้างและฉันคิดว่าคนส่วนใหญ่จะไม่ใช้ตัวจับเวลา
  • ในขณะที่อยู่ในโหมด tail ฉันขอแนะนำให้คุณอย่าพยายามเรียกใช้คำสั่งใด ๆ โดยปกติแล้วจะขัดข้องอินสแตนซ์ vim ดังนั้นโปรดเปิดปิดหาง (F7) ก่อนที่คุณจะตัดสินใจกลับเข้าสู่โหมดแก้ไขนี่คือเคร่งครัดเท่านั้น สำหรับบันทึกการดู

-1

จากภายใน Vim ให้เรียกใช้งาน:

!tail -f 

ซึ่งจะระงับ Vim ในขณะที่ fork ที่แยกออกจากเด็กเรียกใช้งานtail -fบนบัฟเฟอร์ปัจจุบัน การกดปุ่มCtrl-Cจะให้คุณกลับไปที่บัฟเฟอร์ในกลุ่ม


1
ที่ไม่ได้เป็นกลุ่ม แต่ธรรมดาtailทำผลงาน เป็นกลุ่มพกพา มันไม่ใช่.
oligofren
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.