Как не допустить превращения пробелов во вкладки в Eclipse (с PyDev)

У меня есть неприятная проблема с Eclipse, которая возникает только в существующих файлах Python с вкладками где-то в них. Этого не происходит в пустых файлах или файлах, отличных от .py.

По сути, если я пытаюсь скопировать, а затем пропустить более 3 пробелов, я получаю вкладки для каждых X пробелов, где X — это количество символов в пробеле, установленное для редактора. В моем случае это 4, поэтому я получаю следующее:

Copy and paste 1 space:       " "         (one space)
Copy and paste 3 spaces:      "   "       (three spaces)
Copy and paste 6 spaces:      "\t  "      (one tab, two spaces)
Copy and paste 9 spaces:      "\t\t "     (two tabs, one space)
Copy and paste 12 spaces:     "\t\t\t"    (three tabs)

На всю жизнь я не могу понять, почему это происходит или как это отключить. Это действительно расстраивает, когда приходится вручную редактировать каждую вставляемую строку вместо того, чтобы получить именно то, что я скопировал в первую очередь.

Кто-нибудь знает, что это за настройка, или это просто ошибка?

РЕДАКТИРОВАТЬ: Чтобы было ясно, мне не нужны пробелы, когда я нажимаю клавишу табуляции, мне нужны символы табуляции, когда я запрашиваю символы табуляции. Однако, когда я хочу вставить пробел, я не хочу, чтобы символы менялись, особенно если ясно, что я нахожусь между одинарными или двойными кавычками и просто пытаюсь написать текст как есть.


person Chris Nasr    schedule 11.05.2015    source источник


Ответы (2)


Это происходит потому, что при:

org.python.pydev.editor.autoedit.AbstractIndentPrefs.convertToStd(IDocument, DocumentCommand) он будет делать это в обоих направлениях (либо создавать пробелы -> вкладки, либо вкладки -> пробелы), поэтому на самом деле нет возможности разрешить это как было.

то есть: https://github.com/fabioz/Pydev/blob/development/plugins/org.python.pydev/src/org/python/pydev/editor/autoedit/AbstractIndentPrefs.java

код:

private String convertSpacesToTabs(IDocument document, String text, int offset, String indentString)
        throws BadLocationException {
    String spaceStr = StringUtils.createSpaceString(getTabWidth());
    while (text.startsWith(spaceStr)) {
        text = text.replaceAll(spaceStr, "\t");
    }
    return text;
}

Здесь есть 2 возможных исправления:

  1. Создайте параметр, чтобы преобразование никогда не выполнялось.
  2. Улучшите convertSpacesToTabs, чтобы он лучше угадывал отступ вместо использования ширины табуляции (таким образом преобразование улучшится).

Поскольку исходный код PyDev является открытым, в идеале кто-то мог бы предоставить для него исправление (см. http://pydev.org/developers.html для получения кода).

В противном случае вы можете создать заявку на странице https://sw-brainwy.rhcloud.com/tracker/PyDev. ;)

person Fabio Zadrozny    schedule 12.05.2015
comment
Спасибо, Фабио, это многое объясняет. Я ценю дополнительные усилия, чтобы связать меня с тем, где я могу изменить или поднять вопрос. - person Chris Nasr; 12.05.2015

Вы пробовали искать общие настройки редактора? :

Window > Preferences > General > Editors > Text Editors

или под:

Window > preferences > PyDev > Editor

должны быть некоторые параметры, касающиеся пробелов и вкладок

Если ваш файл уже содержит вкладки, вы можете попробовать: Window > Preferences --> PyDev --> Editor

затем отключите Assume tab spacing when file contain tabs

person flafoux    schedule 11.05.2015
comment
Это явно проблема автоматического форматирования или автоматической идентификации, а не вкладок. Я не пытаюсь превратить вкладки в пробелы, что, кстати, БУКВАЛЬНО является единственным параметром, связанным с вкладками, на любой странице вашего ответа. - person Chris Nasr; 11.05.2015
comment
ваш файл содержит вкладку? (перед попыткой скопировать/вставить пробел) - person flafoux; 11.05.2015
comment
Буквально первое предложение в моем вопросе. Я не думаю, что вы читали что-либо из того, что я написал, и мне интересно, почему вы продолжаете отвечать. - person Chris Nasr; 12.05.2015
comment
Просто пытаюсь помочь .... иногда пространство переводится как вкладки, потому что файлы уже содержат вкладки и хотят сохранить форматирование таким образом. - person flafoux; 12.05.2015