Як змусити Vim вести себе як "хвіст -f"?


36

Мені хотілося б знати, чи є спосіб змусити Віма вести себе так tail -f.
Навіть найкращий плагін Vim, який я знайшов поки що, не робить того, що я очікував.

Я дуже хочу побачити оновлення файлів у режимі реального часу . Навіть я відсутній від клавіатури, я хочу, щоб Vim постійно перезавантажував буфер і переходив до останнього рядка.

Як це зробити?
(Я не хочу перезавантажувати весь файл, оскільки деякі файли журналів дуже великі. Найкраще завантажувати лише останні рядки, як tail -fце робиться.)


2
Чому це повинно бути всередині vim? Що не так tail -f?
Свен

1
Тому що я хочу силу vim, коли читаю логіни. Начебто можна шукати шаблон і особливо насолоджуватися підсвічуванням синтаксису. Я зробив власне підсвічування синтаксису для деяких файлів журналів (bind, apache тощо).

Вас можуть зацікавити autoread та FileChangedShell >: help autoread>: help FileChangedShell
gsi-frank

2
Для просто пошуку ви можете зробити less +Fзамість цього tail -f. Не дає вам виділення синтаксису.
Денніс Каарсемейкер

Відповіді:


28

Ви не можете змусити vimсебе так поводитись tail -f. Ви можете змусити lessсебе вести себе як комбінацію vimі tail -fхоча.

Вперед вічно (дотримуйтесь) режиму

lessмає режим вічного переадресації, який ви можете ввести, натиснувши Fабо перейшовши +Fдо нього як аргумент.

$ less +F

У цьому режимі lessповодиться так, tail -fщо не перестає читати, коли доходить до кінця файлу. Він постійно оновлюється новими даними з файлу. Щоб вийти з цього режиму, натисніть Ctrlc.

Підсвічування синтаксису

lessпідтримує автоматичну фільтрацію даних, які вони читають. Існує програма під назвою source -light, яка може виконувати основне підсвічування вихідного коду. Він поставляється із сценарієм, який добре працює less. Для його використання просто встановіть LESSOPENзмінну навколишнього середовища відповідним чином.

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

Вам також потрібно сказати lessпередавати необроблені послідовності втечі терміналу (вони вказують вашому терміналу, як забарвити текст), передавши йому -Rпрапор. Ви можете сказати, lessщо робити вигляд, що -Rпрапор завжди передається , встановивши LESSзмінну навколишнього середовища.

 export LESS=' -R '

Коли lessнедостатньо

Хоча lessмає vi-подібні клавіші, це просто не те саме, що Vim. Іноді він відчуває себе іноземним, і йому не вистачає важливих функцій, таких як інтеграція ctags та можливість редагування тексту.

Ви можете lessзателефонувати Vim (припускаючи EDITOR=vim) у файлі, який він зараз переглядає, натиснувши v. lessнавіть помістить ваш курсор у потрібне місце у Vim. Вийшовши з Vim, ви опинитесь знову less. Якщо ви внесли якісь зміни до файлу під час перебування у Vim, вони будуть відображені у 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 перейти в звичайний режим, "редагувати!" повідомляє 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"
Фокс

якщо ви робите vim --version, ви бачите + clientserver (не -clientserver, з гіпеном)? Якщо ні, багато людей складають vim з джерела, використовуючи ./configure --with-особливості = величезний
crutux

Так, є + сервер клієнтів. У мене версія Ubuntu.
Фокс

1

Я знайшов відповідь завдяки коментарю Евана Тейтельмана . Моє рішення надихається з /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дзвінок, який не дозволяє нічого не робити in vim під час автоматичного оновлення. Найкраще було б, якщо буфер автономний і оновлюється, навіть якщо я перебуваю в іншому розділеному вікні. У всякому разі, це вдалий початок. :)


2
Схоже, він також перечитує весь файл, а це не те, що ви хотіли, правда?
Бернхард

Це перезавантажує весь файл. Можливо, було б не надто складно зробити плагін на основі inotifywait, і він :readчекає, поки файл буде змінено, і якщо до нього додано, читає в рядках внизу файлу.

Так, це правда, він перезавантажує весь файл, тому це потрібно значно покращити. Коли я кажу, що цього хочу, я більше говорю про результат (те, що ви бачите на екрані: vim, який оновлює ваш файл самостійно і залишається на останньому рядку). На жаль, у мене не вистачає знань VIM, щоб зробити гарний плагін ...
Fox

@EvanTeitelman Гаразд, я бачу, як зараз використовувати inotifywait. Я можу знати, коли файл змінюється. Але як знати, чи додано воно (не повністю модифіковане), і як знати, скільки нових рядків було додано?
Фокс

Прочитайте кількість рядків у файлі щоразу, коли файл змінюється. Якщо кількість рядків збільшується, читайте у змінах.

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 виконує дію, як команда в ex :!
  • CursorHold * checktime: коли користувач не перемістив курсор протягом часу, визначеного в updatetime(який за замовчуванням становить 4000 мілісекунд) checktime, який перевіряє зміни ззовні файлу
  • call feedkeys("lh"): курсор переміщується один раз, праворуч і назад ліворуч. і тоді нічого не відбувається (... це означає, що CursorHoldспрацьовує, це означає, що у нас є цикл )

Щоб зупинити прокрутку при використанні call feedkeys("G"), виконайте команду :set noautoread- тепер vim скаже, що файл було змінено і запитайте, чи бажаєте ви прочитати зміни чи ні)

Мені подобається ідея дивитися логіни в vim (замість хвоста -f), наприклад, коли ви працюєте в ssh сесії без екрана / tmux. Крім того, ви можете скопіювати безпосередньо з лог-файлу, якщо потрібно, або зберегти вихід безпосередньо або ... все, що ви можете зробити з vim :)

* з цієї відповіді (посилаючись на відповідь PhanHaiQuang та коментар flukus )


0

Редагувати: Прошу вибачення, повністю обійшовши те, що ви вже пробували це.

Ви можете спробувати використовувати плагін Tail Bundle , я думаю, він повинен робити те, що ви шукаєте.

Щоб встановити, відкрийте tail-3.0.vba з vim та виконайте:

:so %

Перезапустіть, і ви маєте можливість мати хвіст на файл зсередини vim так:

:Tail /path/to/file

0

ТІЛЬКИ Для VIM 8.0+ вони представили таймери, тож ви можете використовувати таймер для імітації хвостової функції, це, на мій досвід, працює досить ефективно.

Я зіставив клавішу 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 () фактично ефективно зупинить усі таймери. Ви можете трохи змінити це, щоб отримати ідентифікатор під час timer_start, а потім утримувати його і т. Д., Але це здалося мені непоганим, і я вважаю, що більшість людей не використовуватиме таймери.
  • хоч він знаходиться в режимі хвоста, я б настійно пропонував би вам не намагатися виконувати жодні команди, зазвичай це виходить з ладу екземплярами vim, тому ПОВЕРНУЙТЕ ЗАВЕРШЕННЯ ХВИЛЬ (F7), перш ніж ви вирішите повернутися в режим редагування, це ЧЕРВНО ТОЛЬКО ДЛЯ ОГЛЯДУВАННЯ ЛОГІЙ.

-1

Зсередини Vim виконайте:

!tail -f 

Це призупинить роботу Vim, поки роздвоєне дочірнє зображення виконується tail -fна поточному буфері. Натискання Ctrl-Cповертає вас до буфера у Vim.


1
Це не vim, але звичайно tailвиконує роботу. Vim портативний. Це не.
олігофрен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.