Я хочу, чтобы vim сохранял свернутый код после того, как я закрыл файл. Я добавил следующий код как в /etc/vimrc, так и в ~/.vimrc:
au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview
Когда я открываю файл как обычный пользователь (файл vim), он работает так, как ожидалось. Если я вместо этого открою файл sudo vim, он не сохранит свернутый код.
Я знаю, что /etc/vimrc читается. Моя тема установлена в нижней части этого файла и работает нормально. На прошлой неделе я столкнулся с подобной проблемой при установке плагина vim Surround. Когда это было установлено в ~/.vim, оно применялось только к файлу vim. Чтобы заставить его работать с sudo, мне пришлось установить его отдельно в /usr/share/vim/current. Что может быть причиной этого?
Ответ 1 · рейтинг 4 · xaizek
Пролог
На самом деле вы ответили на свой вопрос, так что это действительно та же проблема, что и раньше. Это вызвано алгоритмом, который Vim использует для поиска своей конфигурации (см. :help initialization). Но я бы не назвал ваше решение правильным. См. :help $VIM для получения информации о том, как вы можете использовать свою конфигурацию в среде sudo (например, будучи root).
Что касается вашего текущего вопроса.
См. следующие цитаты из документации. :help :mkview:
:mkvie[w][!] [file] ...
When [file] is omitted or is a number from 1 to 9, a
name is generated and 'viewdir' prepended.
...
И :help 'viewdir':
'viewdir' 'vdir' string (default for ... for Unix: "~/.vim/view", ...
Таким образом, после выполнения sudo все представления сохраняются Vim в /root/.vim.
Решение
Сделайте так, чтобы viewdir указывало на ваш каталог ~/.vim/view, с чем-то вроде следующего в /root/.vimrc:
:set viewdir=/home/user/.vim/view
Хотя сам этот подход имеет некоторые проблемы:
- Обновление представлений, сохраненных пользователем root, приведет к ошибкам прав доступа.
- Вы не сможете передать сохраненные представления для файлов с
/root или /home/user, потому что Vim генерирует имена файлов с тильдой вместо полных путей.
Первую проблему можно решить, запустив chown или chmod для нового файла просмотра сразу после выполнения команды :mkview. Это должно быть что-то вроде:
execute '!chown user:group' eval('&viewdir').'/'.substitute(expand('%:p:~'), '/', '+=', 'g').'='
Но я не знаю хорошего решения для второй проблемы, могу только предложить написать скрипт для преобразования имен файлов в полные пути.