Substituir uma seção específica do código

1

Eu não sei o que poderia fazer isso, sed, vim, qualquer coisa. Vamos dizer que eu tenho 30 funções, para simplificar, vou mostrar 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

]

Este pequeno exemplo, mostra que eu criei minhas funções, do jeito que eu queria, elas são semelhantes à primeira função, então eu copio colado, e mudei seu nome e alguns parâmetros. tudo que eu quero fazer é substituir o 1 por 2 na função AddTwo , e substituir o mais pela potência na terceira função e a outra por 2, e a terceira função também, e substituir o 1 por 3.

Basicamente, eu tenho um arquivo grande, cheio de funções, eu quero editar essas funções rapidamente, para fazê-las fazer o que eu quero que elas façam

não precisa ser uma solução totalmente automatizada. o que eu estou procurando, é algum plugin para algum editor de texto, que me permite selecionar um texto e usar a ferramenta de pesquisa e substituição nessa função específica, todos os editores têm ferramentas de pesquisa e substituição, mas eles pesquisam o arquivo inteiro, Eu quero pesquisar a seção de código que eu selecione usando o mouse

    
por Lynob 08.10.2014 / 02:14

3 respostas

2

Duas possibilidades no vim:

  1. pesquise e substitua na seleção visual: escolha uma seleção visual ( v do modo normal) e, em seguida, use:

      :'<,'>s/1/3/g
    

    você notará que, se pressionar ":" no modo visual, o :'<,'> aparecerá automaticamente, para que você tenha apenas que digitar o comando search and replace;

  2. (meu preferido) edite no vim, e quando em um número no modo normal, CTRL-A irá incrementá-lo, CTRL-X irá decrementá-lo --- esse é um dos atalhos mais úteis no vim. ..

por Rmano 08.10.2014 / 11:16
2

Não tenho certeza se é isso que você está procurando.

Abaixo de um script com você pode mudar nome, dígito e operador de funções pelo índice deles / delas (0 = primeira função).

Na cabeça do script, você define uma lista de tuplas com as configurações desejadas, como:

[(index, ("NewName"), ("digit"), ("operator")), (index, ("NewName"), ("digit"), ("operator"))]

Você pode escolher qualquer índice que queira alterar. Se uma ou mais das propriedades não precisarem ser alteradas, deixe a tupla vazia.

Exemplo: para alterar apenas o nome da função com o índice 2 (a terceira função, desde 0 = a primeira):

[(2, ("NewName"), (), ())]

Para alterar as duas primeiras funções:

changes = [(0, ("FuncName1"), ("2"), ("+")), (1, ("FuncName2"), ("2"), ("**"))]

Mantendo diferentes conjuntos de funções

Esse script pode ser usado principalmente se você mantiver diferentes conjuntos de propriedades de função mantendo diferentes changes = linhas e comentando tudo, exceto o que você precisa atualmente, por exemplo.

Como usar

Copie o script abaixo em um arquivo vazio, defina os parâmetros desejados para as funções a serem alteradas, o caminho para o arquivo, salve-o como script.py e execute-o por:

python3 /path/to/script.py

O script:

#!/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)
    
por Jacob Vlijm 08.10.2014 / 16:06
1

O Emacs tem um recurso que você pode achar útil. É chamado de contador de macros do teclado.

  

Por exemplo, se você inserir a seguinte seqüência ao definir uma macro 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 , o texto '0112' será inserido no buffer e, para a primeira e segunda execução das macros '3445' e '6778', serão inseridas.

Leia mais em a página do EmacsWiki sobre contadores de macros do teclado .

Se você nunca usou macros de teclado do emacs para realizar trabalhos de pesquisa / substituição interativos, você também desejará ler a página principal sobre macros de teclado .

    
por daveloyall 24.10.2014 / 19:55