Когда я добавляю # в режиме вставки в пустую строку в Vim при редактировании файлов python, vim перемещает # в начало строки, но я бы хотел, чтобы # был вставлен на уровне вкладки, где я его ввел.
Например, при написании этого в vim
for i in range(10):
#
# не остается там, где я его ввел.
Он перемещается так: vim.
for i in range(10):
#
Кто-нибудь знает элемент конфигурации в vim, который бы это изменил?
Если это поможет, я использую Ubuntu 8.10.






Моя конфигурация Vim этого не делает. Вы можете попробовать скрипт python.vim, доступный по этой ссылке: http://www.vim.org/scripts/script.php?script_id=790
К сожалению, в моем случае это не сработало, проблема сохраняется при его использовании. Я использовал версию 2.6.3, потому что я еще не обновился до python 3.0. Возможно, проблема в файле /usr/share/vim/vim71/indent/python.vim, установленном из пакета Ubuntu vim-runtime?
Я нашел здесь ответ http://vim.wikia.com/wiki/Restoring_indent_after_typing_hash
Похоже, что причиной проблемы является опция vim smartindent. На указанной выше странице описаны рабочие этапы, но после прочтения справки по smartindent в самом vim (: help smartindent) я решил попробовать cindent вместо smartindent.
Я заменил
set smartindent
с
set cindent
в моем файле .vimrc
и пока работает отлично.
Это изменение также исправило поведение «<<» и «>>» для отступов визуальных блоков, которые включают комментарии Python.
В справке vim для smartindent и cindent есть дополнительные параметры конфигурации и информация об отступах (: help smartindent и: help cindent).
Ах, у меня есть "отступ плагина типа файла" в моем .vimrc, возможно, это отвечает за его правильную работу для меня. vimdoc.sourceforge.net/htmldoc/filetype.html
Спас мой день. +1! :)
есть ли какие-либо рекомендуемые / общие настройки конфигурации для cindent?
Это меня вечно раздражало, и я, наконец, потратил 5 минут, чтобы исправить это (похоже на большинство проблем с vim, не так ли?). Спасибо за панировочные сухари!
Это вызвано особенностью smartindent. Если у вас есть :set smartindent в вашем .vimrc, вам необходимо удалить его.
У меня есть следующие строки в моем .vimrc, похоже, он установлен по умолчанию с моим Ubuntu 8.10
set smartindent
inoremap # X^H#
set autoindent
И я не замечаю проблемы. Может, ты сможешь попробовать это. (Обратите внимание, что ^ H следует вводить с помощью Ctrl-V Ctrl-H)
Это исправление описано в документации (:help smartindent). Я думаю, что set autoindent избыточен; smartindent включает его
@PolyThinker Хотя я часто вижу такой ответ на этот вопрос, на мой взгляд, это не лучшее решение. Редактор по-прежнему считает, что отступ должен быть полностью влево - проверьте это, нажав == в строке, которая начинается с хеша, или нажав =, пока блок кода с комментариями будет выделен для повторного отступа.
Я настоятельно рекомендую filetype indent on и удалите строки set smartindent и set autoindent (или set cindent) из вашего vimrc. Кто-то другой (очевидно, Дэвид Бустос) был достаточно любезен, чтобы написать для нас анализатор полного отступа; он находится в $ VIMDIRECTORY / indent / python.vim.
(Решение Пола cindent, вероятно, работает для python, но filetype indent on гораздо более полезен.)
Спасибо - мне это помогло. У меня была одна заминка, и я пробовал использовать "отступ типа файла" в gvim (MacVim) и не заметил изменений в поведении. Как только я начал тестирование, добавив его в .vimrc, а затем перезапустив, я заметил, что поведение изменилось.
Та же проблема, попробовал принятые решения (и перестановки), поместил «файловый отступ» в конец .vimrc, и теперь # комментарий python не отменяет / не уступает. Но теперь для меня это автоиндент. Вздох.
Отключить smartindent у меня не работает (как на ubuntu vim, так и на osx mac-vim). Добавление «отступа типа файла» в мой $ HOME / .vimrc и перезапуск [g] vim решают мою проблему (при редактировании сценариев python и bash).
Мое решение для удаления #:
Если вы используете cindent, знайте, что он разработан для программирования на C и C++. Здесь # означает, что вы создаете #DEFINE или #MACRO (), поэтому поведение правильное. Но для других языков, где # является комментарием, это раздражает.
Для меня сработало следующее:
" cindent enable specific indenting for C code
" set cin nocin
set cin
" cinkeys The default cinkeys causes leading # to unindent to column 0.
" To prevent this, remove the 0# from the definition.
" set cinkeys=0{,0},0),:,0#,!^F,o,O,e - default
set cinkeys=0{,0},0),:,!^F,o,O,e
Я удалил set smartindent из ~/.vimrc, но он все равно не отключил smartindent. Когда я открыл файл .py и запустил :set smartindent?, он отобразил smartindent.
Оказывается, дальше в ~/.vimrc была эта строка:
autocmd BufRead *.py set smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class
^^^^^^^^^^^
Как только я удалил "smartindent" из этой строки, smartindent был окончательно отключен, и мои комментарии снова получили правильный отступ.
Некоторые из других ответов были полезны, но ни одного из них было недостаточно, чтобы Vim не изменил отступ в строке, когда первым символом является '#'. Ответ PolyThinker не сработал для меня, но он дал подсказку, что '#' можно переназначить, чтобы «вставить символ, затем #, затем удалить лишний символ и поместить курсор туда, где он должен быть». Это отображение, которое делает это:
inoremap # X#<left><backspace><right>
Это необходимо, потому что пакеты синтаксиса vim, кажется, рассматривают '#' как специальный символ, независимо от того, как установлены параметры. Я хочу, чтобы строка, начинающаяся с символа "#", была такой же, как строка, начинающаяся с любого другого символа. Самым надежным решением, которое я нашел, является приведенное выше сопоставление, которое действительно меняет первый символ строки.
Примечание. Я обнаружил, что это сопоставление вызывает проблемы после запуска I#<esc> и нажатия "." повторить предыдущую прошивку. Я пока не нашел решения.
См. Также: stackoverflow.com/questions/191201/…