Vim не следует конфигурации при открытии *второго* файла

По сути, мои конфигурации работают для первого файла, который я открываю, но затем не работают должным образом, когда я открываю последующие файлы. У меня конкретно проблема с файлами Python, но я предполагаю, что, учитывая характер проблемы, она, вероятно, существует для других файлов.

У меня есть мои конфигурации python в моем .vimrc следующим образом

au BufNewFile,BufRead *.py
    \ set tabstop=4     |
    \ set softtabstop=4 |
    \ set shiftwidth=4  |
    \ set textwidth=89  |  " PEP-8 prefers 80
    \ set expandtab     |
    \ set autoindent    |
    \ set foldmethod=syntax
au BufNewFile *.py set fileformat=unix

Когда я редактирую новый файл Python в первый раз, расширение вкладки устанавливается без проблем. Однако, когда я открываю второй файл Python из vim, он открывает файл и идентифицирует его как файл Python (filetype=python), но expandtab отключен! То же самое произойдет, если я открою третий, четвертый или пятый файл.

Теперь, если вместо этого я запущу Vim для редактирования второго файла Python, expandtab будет правильно установлен! Однако, когда я открываю первый файл Python для редактирования, expandtab отключен. Даже если я запущу Vim, редактируя два файла (например, запустив vim margins.py marginsio.py из bash), в первом буфере будет установлен expandtab, как и предполагалось, а во втором буфере не установлен expandtab. Теперь, если я запущу Vim с файлом, отличным от Python, а затем открою файл Python для редактирования, файл Python будет иметь expandtab. Однако любые последующие файлы Python, которые я открываю, не имеют набора expandtab.

Наконец, если я запускаю vim, скажем, vim margins.py, затем открываю новый файл python marginsio.py (который не имеет установленного expandtab, когда я открываю его), затем закрываю margins.py, затем снова открываю поля .py из vim, для margins.py установлено expandtab!

Запуск Vim 7.4 в Ubuntu 14.04.5 в подсистеме Windows для Linux (в Windows 10). Я бы предположил, что WSL здесь не влияет, но я использовал Vim много лет и никогда (сознательно) не сталкивался с этим раньше. set noexpandtab вообще нет ни в моем .vimrc, ни в каком-либо из моих ~/.vim/ конфигураций, и проблема сохраняется, если я запускаю vim без плагинов.


person Blue_vision    schedule 12.02.2018    source источник
comment
Stack Overflow — это сайт для вопросов по программированию и разработке. Этот вопрос кажется не по теме, потому что он не о программировании или разработке. См. раздел О каких темах я могу задать здесь в Справочном центре. Возможно, Суперпользователь или Unix & Linux Stack Exchange лучше спросить.   -  person jww    schedule 15.02.2018
comment
Это очень актуально для Stack Overflow. См. vi" title="уместно ли публиковать вопросы vim о переполнении стека теперь, когда есть vi">meta.stackoverflow.com/questions/287089/ и meta.stackexchange.com /вопросы/25925/. Вопросы об инструментах, которые в основном используются разработчиками, являются честной игрой.   -  person Jim Stewart    schedule 15.02.2018


Ответы (2)


Я не могу воспроизвести проблему, с которой вы столкнулись, когда настройки применяются к первому файлу, но не к последующим файлам, но я думаю, что могу помочь вам отладить ее.

Во-первых, попробуйте протестировать без другой конфигурации. Создайте файл с именем testvimrc, содержащий только это:

set nocompatible

au BufNewFile,BufRead *.py
        \ set tabstop=4     |
        \ set softtabstop=4 |
        \ set shiftwidth=4  |
        \ set textwidth=89  |
        \ set expandtab     |
        \ set autoindent    |
        \ set foldmethod=syntax
au BufNewFile *.py set fileformat=unix

Затем запустите vim как

vim -u testvimrc somefile.py

И посмотрите, есть ли у вас все еще поведение, которое вы описали. Если я это сделаю, все файлы Python будут использовать указанные настройки, независимо от того, будут ли они загружены через командную строку или загружены вручную из Vim. Это наводит меня на мысль, что проблема кроется где-то в вашей конфигурации.

Чтобы выяснить, что может происходить, вы можете использовать команду verbose. Вернитесь к своей обычной конфигурации Vim (на этот раз не используйте -u testvimrc). Чтобы увидеть, какой последний набор expandtab:

:verbose set expandtab?

Это должно ответить чем-то вроде

  expandtab
        Last set from ~/.vimrc

Если вы увидите что-то еще, вы будете знать, где это переопределяется. Вы можете увидеть что-то вроде

Last set from /usr/share/vim80/ftplugin/python.vim

Это поможет вам определить плагин-нарушитель или другой источник конфликта. В этом случае может помочь изменение порядка настроек в вашем .vimrc.

Однако есть решение получше.

Если вы хотите переопределить настройки для конкретного типа, для этого есть встроенная поддержка. Выше, в строке python.vim, есть подсказка: Vim уже знает, когда вы редактируете файл Python, и ищет соответствующий ftplugin. Сначала применяется тот, с которым он был распространен (для меня /usr/share/vim80/ftplugin/python.vim). Затем он ищет переопределения в вашем файле runtimepath. По умолчанию последний каталог в runtimepath — это ~/.vim/after, что означает, что все в нем переопределит все предыдущие настройки.

Создайте файл ~/.vim/after/ftplugin/python.vim и переопределите там настройки. Вы должны использовать setlocal вместо set, чтобы он влиял только на буферы Python. Поместите это внутрь:

setlocal tabstop=4
setlocal softtabstop=4
setlocal shiftwidth=4
setlocal textwidth=89
setlocal expandtab
setlocal autoindent
setlocal foldmethod=syntax
setlocal fileformat=unix

Теперь всякий раз, когда вы загружаете или создаете буфер с помощью filetype=python, эти настройки будут применяться, перезаписывая настройки любых других плагинов или конфликтующих источников. Вы можете убедиться, что ваши настройки используются, снова запустив :verbose set.

person Jim Stewart    schedule 12.02.2018
comment
Спасибо за очень подробный ответ! Попытка проверить, что происходит с :verbose set expandtab?, была моей первой проверкой, и она дала мне несколько загадочный/бесполезный ответ (просто noexpandtab). Мне удалось выделить это из-за пропущенной проблемы, которую я не включил в свою первоначальную публикацию, я обновил ее и дал исправление, которое сработало для меня :) - person Blue_vision; 20.02.2018

Пытаясь свести мою проблему к основным частям, я пропустил, по-видимому, очень важный комментарий в строке 5 моей конфигурации Python в моем исходном посте. Похоже, когда Vim встречает комментарий, он завершает автокоманду. По пока неизвестной причине, когда Vim впервые открыл файл .py, какое-то поведение по умолчанию заставило его запустить expandtab. Однако этого не произошло при втором открытии файла .py, поэтому автокоманда была запущена, но преждевременно завершилась на set textwidth=89, а expandtab так и не было установлено.

Я попытался довести это до сути в соответствии с отличным ответом Джима Стюарта, и мне не удалось исправить это, пока я не разбил его на кучу setlocal за пределами моей автокоманды. Когда я объединил эти setlocal в одну автокоманду, моя проблема была решена! Я сузил его до единственной разницы, заключающейся в отсутствии комментариев. Возня с комментариями в моей конфигурации, похоже, указывает на то, что комментарии просто обрезают автокоманду в строке, где находится комментарий.

person Blue_vision    schedule 20.02.2018