Заменить определенный раздел кода
Я не знаю, что может сделать это, Сэд, Вим, что угодно. Допустим, у меня есть 30 функций, для простоты я покажу 3
#first function
AddOne = [
a+1==b, b+1==c
]
# second function
AddTwo = [
a+1==b, b+1==c
]
# third function
MultiplyByTwo = [
a+1==b, b+1==c, c+1==d
]
#Fourth Function
MultiplyByThree [
a+1==b, b+1==c, c+1==d
]
Этот небольшой пример показывает, что я создал свои функции так, как я хотел, они похожи на первую функцию, поэтому я скопировал и вставил их имя и несколько параметров. все, что я хочу сделать, это заменить 1 на 2 в AddTwo
функции и замените плюс на мощность в третьей функции, а одну на 2, а также на третью функцию и замените 1 на 3.
По сути, у меня есть большой файл, полный функций, я хочу на лету редактировать эти функции, чтобы они делали то, что я хочу, чтобы они делали
это не должно быть полностью автоматизированным решением. то, что я ищу, это какой-то плагин для какого-то текстового редактора, который позволил бы мне выбрать текст и использовать инструмент поиска и замены для этой конкретной функции, все редакторы имеют инструменты поиска и замены, но они ищут весь файл, я хочу найти раздел кода, который я выбираю с помощью мыши
3 ответа
Две возможности в vim:
поиск и замена в визуальном выборе: выберите визуальный выбор (
v
из обычного режима), а затем используйте::'<,'>s/1/3/g
вы заметите, что если вы нажмете ":" из визуального режима
:'<,'>
появится автоматически, поэтому вам нужно просто ввести команду поиска и замены;(мой предпочтительный вариант) редактировать в vim, а когда число в обычном режиме, CTRL-A будет увеличивать его, CTRL-X будет уменьшать его - это один из самых полезных ярлыков в vim...
Не уверен, что это то, что вы ищете.
Ниже сценария с помощью которого вы можете изменить имя, цифру и оператор функций по их индексу (0 = первая функция).
В заголовке скрипта вы устанавливаете список кортежей с желаемыми настройками, например:
[(index, ("NewName"), ("digit"), ("operator")), (index, ("NewName"), ("digit"), ("operator"))]
Вы можете выбрать любой индекс, который хотите изменить. Если одно или несколько свойств не нужно менять, оставьте кортеж пустым.
Пример: изменить только имя функции с индексом 2 (третья функция, так как 0 = первая):
[(2, ("NewName"), (), ())]
Чтобы изменить первые две функции:
changes = [(0, ("FuncName1"), ("2"), ("+")), (1, ("FuncName2"), ("2"), ("**"))]
Хранение разных наборов функций
Этот сценарий может быть в основном полезен, если вы сохраняете разные наборы свойств функций, сохраняя разные changes =
строки, и закомментируйте все, кроме той, которая вам нужна, например.
Как пользоваться
Скопируйте приведенный ниже скрипт в пустой файл, установите желаемые параметры для функций, которые нужно изменить, путь к файлу, сохраните его как script.py и запустите:
python3 /path/to/script.py
Сценарий:
#!/usr/bin/env python3
# function / name / digit / operator
# (example)
changes = [(0, ("Name1"), (), ()), (1, ("Name2"), ("2"), ("**"))]
subject_file = "/path/to/file_withfunctions"
operators = ["+", "-", "*"] # ** has been taken care of in the script, you can use it in the "changes" line
with open(subject_file) as sample:
lines = [line for line in sample.readlines()]
def first_occurrence(index, string, lines):
area = lines[index:]
func_line = [[i, area[i]] for i in range(len(area))if string in area[i]][0]
func_line[0] = func_line[0]+index
return func_line
functiondata = [[[i, lines[i]],first_occurrence(i, "==", lines)] for i in range(len(lines)) if "[" in lines[i]]
for item in changes:
subject = functiondata[item[0]]
if len(item[1]) != 0: # name
name = subject[0][1].split()[0]
newname = item[1]
lines[subject[0][0]] = lines[subject[0][0]].replace(name, newname)
if len(item[2]) != 0: # digit
or_line = subject[1][1]
character = [ch for ch in or_line if ch.isdigit()][0]
new_line = or_line.replace(character, item[2])
lines[subject[1][0]] = new_line
if len(item[3]) != 0: # operator
or_line = new_line
if "**" in or_line:
new_line = or_line.replace("**", item[3])
else:
character = [ch for ch in operators if ch in or_line][0]
lines[subject[1][0]] = new_line
new_line = or_line.replace(character, item[3])
lines[subject[1][0]] = new_line
with open(subject_file, "wt") as sample:
for line in lines:
sample.write(line)
В Emacs есть средство, которое вам может пригодиться. Он называется клавиатурным счетчиком макросов.
Например, если вы вводите следующую последовательность при определении макроса
C-x C-k C-i C-x C-k C-i C-u C-x C-k C-i C-x C-k C-i
текст "0112" вставляется в буфер, и для первого и второго выполнения макросов "3445" и "6778" вставляются.
Узнайте больше на странице EmacsWiki о счетчиках макросов клавиатуры.
Если вы никогда не использовали клавиатурные макросы emacs для выполнения интерактивного поиска / замены, вам также нужно прочитать главную страницу о клавиатурных макросах.