Currently I do this with Find All (Cntrl+F old_var, alt+enter new_var), but this replaces words in my comments and strings.
A comment in this answer suggested the PyRefactor plugin which requires rope. These tools seem to have defaults that are too heavy-handed for my purposes. I just want to refactor variable names in stand-alone python scripts with Sublime Text 3.
So in a script like
# Where did my hat go?
hat = 0
print(hat)
print("hat")The hat variable (not in strings nor comments) can be replaced with something else at the touch of a hotkey. No need for a special project folder/configuration, and nothing changed across multiple files. Unfortunately, Find All hat -> llama does...
# Where did my llama go?
llama = 0
print(llama)
print("llama")EDIT:
I appreciate @Toto's regex solution, but I'm not fluent in that yet and would like a method that works more consistently and is easier to remember. Is there a plugin (or can I write one?) that identifies all the globally defined and stated variables (arguments in function calls, etc), and allows for a simple Find and Replace?
21 Answer
- Ctrl+H
- Find:
(?:^(?<!#).*\K|(<?!"))\bhat\b(?!") - Replace:
llama - check Regular expression
- check Whole word
- check Wrap
- Replace all
Explanation:
(?: ^ : 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 " afterGiven:
# Where did my hat go?
hat = 0
chat = 0
print(hat)
print("hat")
print(chat)Result for given example:
# Where did my hat go?
llama = 0
chat = 0
print(llama)
print("hat")
print(chat)Before:
6