Привет, коллеги! В Вим есть возможность перенаправлять сообщения в файлы и другие места. К сообщениям относятся сообщения об ошибках, предупреждающие сообщения, а также всё, что выводят команды типа echo. Рассмотрим эту возможность, а потом пример ее применения.
Итак, команда :redir > file перенаправляет вывод в файл. Сообщения продолжают выводиться, но при этом копия идет в файл. Можно подавить вывод на экран, выполняя команды через silent (не подавляет сообщения об ошибках) или silent! (подавляет всё). Так, silent echo '666' выглядит глупо, но может быть полезно при перенаправлении: в файле текст окажется, а на экране - нет.
Как обычно, файл не должен существовать, либо надо снабдить команду восклицательным знаком (для перезаписи файла).
В варианте :redir >> file файл дополняется, если уже существует.
Остановить перенаправление позволяет :redir END или новое перенаправление (отменяет предыдущее).
Можно перенаправить вывод не в файл, а в регистр: :redir @q или :redir @q>
Вместо q - любое имя регистра. Если буква заглавная, регистр дополняется, а не перезаписывается. Той же цели можно достичь так: :redir @q>>
Можно добраться и до безымянного регистра: у него есть имя, на самом деле, и это двойная кавычка ". Оно нужно, например, ещё для вставки в режиме вставки или в командной строке, через <C-R>.
Можно перенаправить вывод в переменную: :redir => var. Переменная должна быть строковая. Если она уже существует, она очищается. Если нет, создается. Она остается пустой до окончания перенаправления! И ее нельзя удалять и блокировать до окончания перенаправления. Если ее изменить в ходе, то перенаправление окажется после того, что вы в переменную засунете. И лучше не экспериментировать, это недокументированное поведение.
Можно дополнять переменную: :redir =>> var
Теперь пример использования из Vim Tips. Иногда хочется сохранить имя файла, с которым работаешь, и позицию в нем. Автор предлагает такую функцию:
function! MoshBookmark()
redir >> ~/.vims
echo
echo strftime("%Y-%b-%d %a %H:%M")
echo "cd ". $PWD
echo "vim ". expand("%:p").':'.line('.')
echo ' word='.expand("<cword>")
echo ' cline='.getline('.')
redir END
endfunction
:command! MoshBookmark :call MoshBookmark()
Mosh - это фамилия автора. Как видим, команда вызывает функцию, а функция через перенаправление сбрасывает в файл отчет: дату и время через strftime; текущий каталог через переменную окружения; имя файла (с использованием expand, модификатора :p и символа текущего файла %); а также номер текущей строки, слово под курсором и всю строку, на которой курсор.
Таким образом, каждый вызов команды создаст в файле новую запись и вы можете легко вернуться в ту точку, где были вчера утром или позавчера вечером. Достаточно открыть файл и нажать gF на имени файла.
Можно модифицировать пример так: перенаправление сделать через redir! > и
function! MyBookmark
redir! > ~/.vims
echo echo "# " . strftime("%Y-%b-%d %a %H:%M")
echo "cd ". $PWD
echo "vim ". expand("%:p").' +'.line('.')
redir END
endfunction
Теперь в файле дата и время закомментированы. Если сделать его исполняемым, то можно запустить его, а он откроет в Виме нужный файл на нужной строке.
Тогда у вас не история ваших похождений, а один конкретный момент, к которому вы, может быть, хотели бы вернуться. Можно сделать функцию с аргументом и передавать ей имя файла, например. Это сессия на минималках. Но может быть полезно, если вам не надо сохранять всё, а только файл, с которым вы работаете.
Удачи, коллеги.