Рефакторинг кода в возвышенном тексте 3

307
Wassadamo

В настоящее время я делаю это с Find All( Cntrl+ F old_var, alt+ enter new_var), но это заменяет слова в моих комментариях и строках.

Комментарий в этом ответе предложил плагин PyRefactor, который требует веревку . Эти инструменты, кажется, имеют настройки по умолчанию, которые слишком жесткие для моих целей. Я просто хочу реорганизовать имена переменных в автономных скриптах Python с помощью Sublime Text 3.

Так в скрипте вроде

# Where did my hat go? hat = 0 print(hat) print("hat") 

hatПеременная (не в строках, ни комментариев) можно заменить чем - то другим на ощупь горячей клавиши. Нет необходимости в специальной папке проекта / конфигурации, и ничего не изменилось в нескольких файлах. К сожалению, Find All hat -> llamaделает ...

# Where did my llama go? llama = 0 print(llama) print("llama") 

РЕДАКТИРОВАТЬ:

Я ценю решение для регулярных выражений @ Toto, но пока не очень хорошо разбираюсь в этом и хотел бы, чтобы метод работал более последовательно и его было легче запомнить. Есть ли плагин (или я могу написать один?), Который идентифицирует все глобально определенные и объявленные переменные (аргументы в вызовах функций и т. Д.) И допускает простой поиск и замену?

2
Вы можете использовать регулярное выражение, чтобы увидеть, начинается ли строка с # var firstName 5 лет назад 1
Задумывались ли вы об использовании IDE, которая значительно упростит рефакторинг? Раньше я был верен Sublime, пока не обнаружил IDE JetBrains. DrZoo 5 лет назад 0

1 ответ на вопрос

1
Toto
  • Ctrl+H
  • Найти: (?:^(?<!#).*\K|(<?!"))\bhat\b(?!")
  • Заменить: llama
  • проверьте регулярное выражение
  • проверить целое слово
  • проверить Wrap
  • Replace all

Объяснение:

(?: ^ : beginning of line (?<!#) : negative lookbehind, zero-length assertion that makes sure we don't have # before .* : 0 or more any character \k : forget all we have seen until this position | : OR (?<!") : negative lookbehind, zero-length assertion that makes sure we don't have " before ) \b : word boundary to not match chat, remove it if you want to match chat also hat : literally \b : word boundary to not match hats, remove it if you want to match hats also (?!") : negative lookahead, zero-length assertion that makes sure we don't have " after 

Дано:

# Where did my hat go? hat = 0 chat = 0 print(hat) print("hat") print(chat) 

Результат для данного примера:

# Where did my hat go? llama = 0 chat = 0 print(llama) print("hat") print(chat) 

До:

После:

что насчет `" красной шляпы "` или `" красной "+ шляпа`? Оба будут заменены, но они не должны Máté Juhász 5 лет назад 1
@ MátéJuhász: "" красная шляпа "не заменяется, а" красная "+ шляпа" становится "красной" + ламой`, разве это не нужно? Toto 5 лет назад 1
хорошо, это умно, как насчет "красной шляпы и перчаток"? Máté Juhász 5 лет назад 0
@ MátéJuhász: Конечно, это не будет работать в этом случае :( для такого случая регулярное выражение станет нечитаемым. Это показывает ограничение регулярного выражения при разборе нерегулярного языка. Toto 5 лет назад 1
Всегда может рассчитывать на регулярное выражение в помощь. К сожалению, этот случай также не работает: `" шляпа съела hw "` становится "ламой съела hw" `. Wassadamo 5 лет назад 0
@Wassadamo: Правда, он не работает для любой строки, такой как "бла-хэт-бла". Я не знаю, существует ли плагин, который делает эту работу. Я думаю, что лучший способ написать правильный синтаксический анализатор. Toto 5 лет назад 0