Làm cách nào để khiến Vim cư xử giống như đuôi đuôi -f?


36

Tôi muốn biết liệu có cách nào để khiến Vim cư xử như thế nào không tail -f.
Ngay cả plugin Vim tốt nhất mà tôi tìm thấy cho đến nay cũng không làm được điều tôi mong đợi.

Tôi thực sự muốn xem cập nhật tập tin trong thời gian thực . Ngay cả khi tôi rời khỏi bàn phím, tôi muốn Vim liên tục tải lại bộ đệm và nhảy đến dòng cuối cùng.

làm như thế nào?
(Tôi không muốn tải lại toàn bộ tệp, vì một số tệp nhật ký rất lớn. Cách tốt nhất là chỉ tải các dòng cuối cùng, giống như tail -fvậy.)


2
Tại sao nó phải ở trong vim? Có chuyện gì với bạn tail -fvậy?
Sven

1
Bởi vì tôi muốn sức mạnh của vim khi tôi đọc logfiles. Giống như có thể tìm kiếm mẫu và đặc biệt là tận hưởng cú pháp tô sáng. Tôi đã làm nổi bật cú pháp của riêng tôi cho một số tệp nhật ký (liên kết, apache, v.v.).

Bạn có thể quan tâm đến autoreadFileChangedShell >: help autoread>: help FileChangedShell
gsi-frank

2
Đối với chỉ tìm kiếm, bạn có thể làm less +Fthay vì tail -f. Không cung cấp cho bạn cú pháp tô sáng mặc dù.
Dennis Kaarsemaker

Câu trả lời:


28

Bạn không thể vimcư xử như thế tail -f. Bạn có thể làm cho lesshành vi như một sự kết hợp vimtail -fmặc dù.

Chuyển tiếp mãi mãi (theo) chế độ

lesscó chế độ chuyển tiếp mãi mãi mà bạn có thể nhập bằng cách nhấn Fhoặc bằng cách chuyển +Fsang chế độ đó làm đối số.

$ less +F

Trong chế độ này, lesshoạt động giống như tail -fở chỗ nó không ngừng đọc khi đến cuối tệp. Nó liên tục làm mới với dữ liệu mới từ tập tin. Để thoát chế độ này, nhấn Ctrlc.

Cú pháp tô sáng

lesshỗ trợ tự động lọc dữ liệu mà nó đọc. Có một chương trình gọi là nguồn sáng có thể thực hiện đánh dấu mã nguồn cơ bản. Nó đi kèm với một kịch bản hoạt động tốt với less. Để sử dụng nó, chỉ cần đặt LESSOPENbiến môi trường một cách thích hợp.

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

Bạn cũng phải yêu lesscầu chuyển các chuỗi thoát thiết bị đầu cuối thô (những lệnh này cho thiết bị đầu cuối của bạn biết cách tô màu văn bản) bằng cách chuyển -Rcờ. Bạn có thể nói lessđể giả vờ rằng nó luôn được truyền -Rcờ bằng cách đặt LESSbiến môi trường.

 export LESS=' -R '

Khi lesskhông đủ

Mặc dù lesscó các phím bấm giống như vi, nhưng nó không giống với Vim. Đôi khi nó cảm thấy xa lạ và nó thiếu các tính năng quan trọng như tích hợp ctags và khả năng chỉnh sửa văn bản.

Bạn có thể thực hiện lesscuộc gọi Vim (giả sử EDITOR=vim) trên tệp mà nó hiện đang xem bằng cách nhấn v. lessthậm chí sẽ đặt con trỏ của bạn vào đúng vị trí trong Vim. Khi bạn thoát khỏi Vim, bạn sẽ thấy mình trở lại less. Nếu bạn thực hiện bất kỳ thay đổi nào đối với tệp khi bạn ở trong Vim, chúng sẽ được phản ánh trong less.


5
vim --servername TAIL_VIM /tmp/somefile

Bây giờ, trong một shell khác (như bash), bạn có thể làm:

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

Trường hợp <C -> <CN> buộc vim chuyển sang chế độ bình thường, "chỉnh sửa!" yêu cầu vim tải lại tệp hiện tại (CR mô phỏng nhấn enter) và G đi đến cuối tệp. Việc xóa (G) giúp dễ dàng insepct tệp trong khi đầu vào đang đến.


Tôi thấy thông số "--servername" trong người đàn ông, tuy nhiên tôi nhận được thông báo lỗi sau: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

nếu bạn thực hiện vim --version, bạn có thấy + clienterver (không phải là máy chủ, với một hypen) không? Nếu không, nhiều người sẽ biên dịch vim từ nguồn bằng cách sử dụng ./cool --with-features =
Huge

Có, có + máy khách. Tôi có phiên bản Ubuntu.
Cáo

1

Tôi tìm thấy câu trả lời nhờ bình luận của Evan Teitelman . Giải pháp của tôi được lấy cảm hứng từ /usr/share/vim/vimcản/macros/less.vim .

Tôi đã thực hiện chức năng của riêng mình, nhưng nó có thể được cải thiện rất nhiều.

function! Tailf()
    e
    normal G
    redraw

    sleep 1
    call Tailf()
endfunction

Và chỉ cần nhấn CTRL + C để thoát Tailf.

Để mở tệp nhật ký ở chế độ Tailf: view -M "+call Tailf()" /path/to/logfile.log

Điều tôi không thích, là sleepcuộc gọi, không cho phép thực hiện bất cứ điều gì trong vim trong quá trình tự động làm mới. Điều tốt nhất sẽ là nếu bộ đệm là tự động và cập nhật ngay cả khi tôi đang ở trong một cửa sổ phân chia khác. Dù sao, đó là một khởi đầu tốt. :)


2
Có vẻ như nó cũng đọc lại toàn bộ tập tin, đó không phải là điều bạn muốn, phải không?
Bernhard

Điều này không tải lại toàn bộ tập tin. Có lẽ sẽ không quá khó để tạo một plugin dựa trên inotifywait và :readđợi cho đến khi một tệp được sửa đổi và nếu nó đã được thêm vào, hãy đọc các dòng ở dưới cùng của tệp.

Vâng, đó là sự thật, nó tải lại toàn bộ tập tin, vì vậy điều này phải được cải thiện rất nhiều. Khi tôi nói rằng tôi muốn điều này, tôi sẽ nói nhiều hơn về kết quả (những gì bạn thấy trên màn hình: một vim cập nhật tệp của bạn một mình và ở dòng cuối cùng). Thật không may, tôi không có đủ kiến ​​thức vim để tạo một plugin đẹp ...
Fox

@EvanTeitelman OK, tôi thấy cách sử dụng inotifywait now. Tôi có thể biết bất cứ khi nào tập tin thay đổi. Nhưng làm thế nào để biết nó đã được nối thêm (chưa được sửa đổi hoàn toàn) và làm thế nào để biết có bao nhiêu dòng mới đã được nối?
Fox

Đọc số lượng dòng trong tệp mỗi khi tệp thay đổi. Nếu số lượng dòng tăng, đọc trong các thay đổi.

1

Một phương pháp không đệ quy cho cùng:

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

Tôi thích nó ngắn và không có nhiều hack. Bạn có thể chạy oneliner này từ ex (whithin vim) khi cần (hoặc đặt từng lệnh trong vimrc, khi tệp log được mở.)

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

(nếu bạn muốn nhảy (gần) đến cuối tệp, chỉ cần sử dụng "G" thay vì "lh" với feedkey)

Giải trình:

  • autoread: đọc tệp khi thay đổi từ bên ngoài (nhưng nó không hoạt động, không có bộ đếm thời gian bên trong hoặc đại loại như thế. Nó sẽ chỉ đọc tệp khi vim thực hiện một hành động, như lệnh trong ex :!
  • CursorHold * checktime: khi con trỏ không được di chuyển bởi người dùng trong thời gian được chỉ định trong updatetime(theo mặc định là 4000 giây) checktime, sẽ kiểm tra các thay đổi từ bên ngoài tệp
  • call feedkeys("lh"): con trỏ được di chuyển một lần, phải và quay lại trái. và sau đó không có gì xảy ra (... có nghĩa là, điều đó CursorHoldđược kích hoạt, có nghĩa là chúng ta có một vòng lặp )

Để dừng cuộn khi sử dụng call feedkeys("G"), hãy thực thi :set noautoread- bây giờ vim sẽ cho biết, tệp đã thay đổi, hãy hỏi xem có muốn đọc các thay đổi hay không)

Tôi thích ý tưởng xem logfiles trong vim (thay vì đuôi -f), ví dụ: khi bạn đang làm việc trong phiên ssh không có màn hình / tmux. Ngoài ra, bạn có thể sao chép trực tiếp từ logfile, nếu cần hoặc lưu trực tiếp đầu ra hoặc ... bất cứ điều gì bạn có thể làm với vim :)

* từ câu trả lời này (tham khảo câu trả lời của PhanHaiQuang và nhận xét của flukus )


0

Chỉnh sửa: Tôi xin lỗi, hoàn toàn bỏ qua rằng bạn đã thử điều này.

Bạn có thể thử sử dụng plugin Tail Bundle , tôi nghĩ nó nên làm những gì bạn đang tìm kiếm.

Để cài đặt, hãy mở tail-3.0.vba bằng vim và thực thi:

:so %

Khởi động lại và bạn sẽ có thể theo dõi một tệp từ bên trong vim như vậy:

:Tail /path/to/file

0

CHỈ Đối với VIM 8.0+ họ đã giới thiệu bộ hẹn giờ, vì vậy bạn có thể sử dụng bộ hẹn giờ để mô phỏng chức năng đuôi, điều này hoạt động khá hiệu quả theo kinh nghiệm của tôi.

Tôi đã ánh xạ phím F6 để bật đuôi và F7 để tắt đuôi, bạn có thể tùy chỉnh các phím trong các lệnh bên dưới, cũng xem phần của tôi dưới đây để biết TỪ KHÓA.

Chạy như sau

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>

Bạn cũng có thể biến các lệnh trên thành một phần của vimrc để bạn luôn có chúng.

Một số lời cảnh báo:

  • Tôi giả sử bạn không có bất kỳ bộ định thời nào khác, vì vậy timer_stopall () sẽ thực sự dừng tất cả các bộ định thời. Bạn có thể sửa đổi điều này thêm một chút để có được ID trong timer_start và sau đó giữ nó, v.v. nhưng điều đó có vẻ hơi khó với tôi và tôi cho rằng hầu hết mọi người sẽ không sử dụng bộ hẹn giờ.
  • Mặc dù ở chế độ đuôi, tôi khuyên bạn không nên chạy bất kỳ lệnh nào, nó thường gặp sự cố vim, vì vậy XIN VUI LÒNG TẮT TAIL (F7) trước khi bạn quyết định quay lại chế độ chỉnh sửa, đây chỉ là CHIẾN LƯỢC ĐỂ XEM NHẬP.

-1

Từ trong Vim, thực hiện:

!tail -f 

Điều đó sẽ đình chỉ Vim trong khi đứa trẻ rẽ nhánh thực thi tail -ftrên bộ đệm hiện tại. Đánh Ctrl-Ctrả bạn trở lại bộ đệm trong Vim.


1
Đó không phải là vim, nhưng đơn giản taillà làm việc. Vim là hàng xách tay. Đây không phải là.
oligofren
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.