Как отобразить временные метки отмены и повторной отмены в строке состояния 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