Как отобразить временные метки отмены и повторной отмены в строке состояния Vim с помощью vim-airline

Vim — это мощный текстовый редактор с поддержкой клавиатуры и широкими возможностями настройки. Но по умолчанию он не показывает историю редактирования. Если вы когда-либо нажимали u или <Ctrl-r> и задавались вопросом, что именно изменилось и когда, вы не одиноки. К счастью, с помощью нескольких простых настроек в файле .vimrc и плагина vim-airline вы можете отображать временные метки отмены и повтора в реальном времени прямо в строке состояния Vim.
В этой статье мы обсудим, как:
- Подсчитайте и отобразите статистику количества отмен и повторов
- Показывает, когда в последний раз была запущена отмена или повтор
- Интегрируйте эти показатели в динамическую строку состояния Vim, используя
vim-airline.
Зачем отслеживать отмену и повтор в Vim?
В Vim есть встроенная поддержка отмены (u) и повтора (<Ctrl-r>), но по умолчанию она не показывает никаких результатов. Вы нажимаете клавишу, что-то меняется, но нет ни метки времени, ни счётчика, ни записи о том, что произошло.
Отслеживание действий по отмене и повтору помогает несколькими ключевыми способами:
- Осведомленность: Точно знайте, когда было отменено последнее изменение.
- Управление: посмотрите, сколько раз вы отменяли или повторяли действие.
- Обратная связь: Получите подтверждение того, что ваша команда отмены / повтора что-то сделала.
Настроив vim-airline для отображения временных меток отмены и повторной отмены, вы сможете легко отслеживать, когда были отменены/повторно отменены изменения и сколько раз вы отменяли/повторно отменяли действия.
На следующих этапах мы узнаем, как интегрировать эту функцию в нашу версию Vim.
Предварительные условия
Прежде чем приступить к выполнению этого руководства, убедитесь, что у вас есть следующее:
- Vim или Neovim установлены в вашей системе.
- vim-plug или vundle или любой другой менеджер плагинов для простой установки плагинов Vim.
- Базовое понимание того, как редактировать файлы конфигурации Vim (например,
.vimrcилиinit.vim).
Установите vim-плагин авиакомпании
vim-airline — это лёгкий и простой в использовании плагин для строки состояния Vim. Он предоставляет настраиваемую строку состояния, которая легко интегрируется с другими плагинами Vim.
Для начала давайте установим vim-airline.
1. Откройте файл конфигурации:
Для Vim:
vim ~/.vimrc
Для Neovim:
nvim ~/.config/nvim/init.vim
2. Добавьте настройку плагина vim-plug:
Внутри файла добавьте следующие строки:
call plug#begin('~/.vim/plugged')
Plug 'vim-airline/vim-airline'
call plug#end()
Эти строки сообщают vim-plug:
- Начните загружать плагины (
plug#begin). - Загрузить
vim-airlineс GitHub. - Прекратите загрузку плагинов (
plug#end).
Сохраните файл и закройте его, набрав :wq и нажав клавишу ENTER.
3. Установите плагин
После сохранения файла откройте Vim (или Neovim) и выполните:
:PlugInstall
После установки vim-airline автоматически заменит строку состояния в Vim.
Вот как выглядит строка состояния после установки и включения vim-airline:

Строка состояния Vim
Как видите, плагин vim-airline добавил в редактор Vim аккуратную строку состояния.
По умолчанию vim-airline отображается такая информация, как:
- Раздел A: Режим Vim (например,
NORMAL,INSERT) - Раздел B: Состояние окружающей среды (информация VCS)
- Раздел C: имя файла и флаги (например, изменено
+, только для чтенияRO) - Раздел X: Тип файла (vim)
- Раздел Y: Кодировка файла
- Раздел Z: Текущее время или информация о линии
Отображение меток отмены и повторной отмены в Vim с помощью vim-airline
Откройте свой .vimrc или init.vim файл:
vim .vimrc
Добавьте следующие строки в конце:
" ----------------------------
" Настройка отслеживания отмены/повторения
" ----------------------------
let g:undo_count = 0
let g:redo_count = 0
let g:last_undo_time = ""
" Сопоставьте 'u' для обновления счетчика отмены и метки времени
nnoremap u :let g:undo_count += 1 \| let g:last_undo_time = strftime("%Y-%m-%d %H:%M:%S") \| normal! u
" Настройте Ctrl-r для обновления счетчика повторов и метки времени
nnoremap :let g:redo_count += 1 \| let g:last_undo_time = strftime("%Y-%m-%d %H:%M:%S") \| redo
«Отобразить статистику отмены и повтора в разделе X авиакомпании
let g:airline_section_x = '%{g:last_undo_time != "" ? g:last_undo_time . " (undos:" . g:undo_count . ", redos:" . g:redo_count . ")" : strftime("%H:%M:%S")}'
Введите :wq и нажмите ENTER, чтобы сохранить файл и закрыть его. С этого момента, если произойдёт отмена или повторная обработка, в строке состояния отобразится что-то вроде этого:
2025-04-29 16:33:10 (undos: 3, redos: 1)
Тестирование Вашей конфигурации
Для проверки просто откройте любой файл. В режиме вставки введите несколько строк текста.
This is first line. This is second line. This is third line.
Затем выйдите из режима вставки и нажмите u для отмены строки и <Ctrl-r> для повторного выполнения.
Следите за обновлением строки состояния vim-airline с новыми показателями и отметками времени. В правой части строки состояния вы должны увидеть отметку времени, например:
2025-04-29 17:00:17 (undos:2, redos:2)

Отображение временных меток отмены и повтора в Vim
Вы также увидите, что при взаимодействии с файлом счётчики отмены/повторения будут увеличиваться.
Дополнительные советы и настройки
Отображения лидеров:
Вместо использования <Ctrl-r> вы можете сопоставить redo с чем-то вроде <Leader>r.
nnoremap <Leader>r <C-r>
Постоянная отмена:
Включите постоянную отмену с помощью:
set undofile set undodir=~/.vim/undodir
Ведение журнала:
Чтобы сохранить информацию об отслеживании между сеансами, вы можете записать подсчёты в файл при выходе из Vim.
Устранение неполадок
Если отметка времени отображается не так, как ожидалось, проверьте следующее:
- Убедитесь, что вы используете Vim 8 или более позднюю версию (поскольку функция
strftimeдоступна в Vim 8+). - Убедитесь, что
vim-airlineправильно установлен: используйте:PlugStatusдля проверки загрузки плагина.
Конфигурация My .vimrc
Вот моя полная конфигурация файла .vimrc . Вы можете просто скопировать/вставить всё содержимое или его часть в свой файл .vimrc .
" ----------------------------
" Основные настройки
" ----------------------------
set nocompatible
" ----------------------------
" Настройка менеджера плагинов vim-plug
" ----------------------------
call plug#begin('~/.vim/plugged')
" vim-airline status bar
Plug 'vim-airline/vim-airline'
call plug#end()
filetype plugin indent on
" ----------------------------
" Настройка отслеживания отмены/повтора
" ----------------------------
let g:undo_count = 0
let g:redo_count = 0
let g:last_undo_time = ""
" Сопоставьте 'u' для обновления счетчика отмены и метки времени
nnoremap u :let g:undo_count += 1 \| let g:last_undo_time = strftime("%Y-%m-%d %H:%M:%S") \| normal! u
" Настройте Ctrl-r для обновления счетчика повторов и метки времени
nnoremap :let g:redo_count += 1 \| let g:last_undo_time = strftime("%Y-%m-%d %H:%M:%S") \| redo
«Отобразить статистику отмены и повтора в разделе X авиакомпании
let g:airline_section_x = '%{g:last_undo_time != "" ? g:last_undo_time . " (undos:" . g:undo_count . ", redos:" . g:redo_count . ")" : strftime("%H:%M:%S")}'
Распад моего .vimrc
Вот описание того, что делает каждая строка в моей конфигурации .vimrc:
Базовая настройка Vim
set nocompatible
- Отключает совместимость с очень старым редактором «vi».
- Включает все функции, специфичные для Vim, и следит за корректной работой плагинов.
Настройка менеджера плагинов (vim-plug)
call plug#begin('~/.vim/plugged')
- Инициализирует загрузку плагина с помощью
vim-plug. ~/.vim/pluggedэто каталог, в котором будут храниться ваши плагины.
Plug 'vim-airline/vim-airline'
- Загружает плагин vim-airline, который предоставляет компактную настраиваемую строку состояния.
call plug#end()
- Завершает блок плагинов. Все плагины должны быть перечислены между
plug#begin()иplug#end().
filetype plugin indent on
Это позволяет:
- Определение типа файла
- Загрузка плагинов, зависящих от типа файла
- Автоматическое выделение отступов для распознанных типов файлов
Переменные отслеживания отмены/ Повтора
let g:undo_count = 0 let g:redo_count = 0 let g:last_undo_time = ""
g:undo_count: Отслеживает, сколько раз вы нажимаетеu(отмена).g:redo_count: Отслеживает, сколько раз вы нажимаете<C-r>(повторить).g:last_undo_time: Сохраняет временную метку последней отмены или повтора.
Пользовательские Сопоставления ключей
Отменить:
nnoremap <silent> u :let g:undo_count += 1 \| let g:last_undo_time = strftime("%Y-%m-%d %H:%M:%S") \| normal! u<CR>
Заменяет команду по умолчанию u пользовательской версией, которая:
- Приращения
undo_count - Обновления
last_undo_time - Выполняет фактическую отмену с помощью
normal! u <silent>останавливает отображение команды в командной области.
Повторить:
nnoremap <silent> <C-r> :let g:redo_count += 1 \| let g:last_undo_time = strftime("%Y-%m-%d %H:%M:%S") \| redo<CR>
- Аналогично отображению отмены, но для повтора.
- Увеличивает
redo_countи обновляет временную метку.
Конфигурация строки состояния авиакомпании
let g:airline_section_x = '%{g:last_undo_time != "" ? g:last_undo_time . " (undos:" . g:undo_count . ", redos:" . g:redo_count . ")" : strftime("%H:%M:%S")}'
- Настраивает
Xраздел вvim-airlineстроке состояния. - Если
last_undo_timeустановлено значение, оно показывает:
YYYY-MM-DD HH:MM:SS (undos:X, redos:Y) - Если нет отменённых или повторных действий, отображается только текущее время (
strftime("%H:%M:%S")).
Заключение
С помощью всего нескольких строк Vimscript и лёгкого плагина мы добавили удобную функцию просмотра истории редактирования в Vim. Теперь вы можете работать эффективнее, отслеживая и отображая полезную информацию, например, временные метки отмены и повтора, в строке состояния.
Отслеживание операций отмены и повтора в строке состояния повышает осведомлённость, делает редактирование более безопасным и помогает работать увереннее.
Независимо от того, изучаете ли вы Vim или повышаете эффективность своего повседневного рабочего процесса, эта настройка даст вам представление, о котором вы даже не подозревали.
Редактор: AndreyEx