Estou tentando ler muito código C / Perl por meio do Vim que contém muitos nomes de variáveis de uma única letra.
Seria bom ter algum comando que pudesse me ajudar a mudar o nome de uma variável para algo mais significativo enquanto estou no processo de leitura do código para que eu pudesse ler o resto mais rápido.
Existe algum comando no Vim que poderia me permitir fazer isso rapidamente?
Não acho que regexes funcionariam porque:
o mesmo nome de uma única letra pode ter diferentes finalidades em diferentes blocos de escopo
a mesma combinação de letras pode ser parte de outro nome var maior, ou em uma string ou comentário ... não gostaria de modificá-los
Alguma solução conhecida?
fonte
:
) duas vezes. Na primeira vez que apertei, vi:'<,'>
. Se eu simplesmente digitar as/
partir daí, não funcionou; Tive que digitar outro dois pontos antes des/
.<C-R>
do comando substitute, simplesmente omitir a pesquisa fará com que o vim use o último padrão pesquisado, que neste caso foi criado a partir dogd
comando. Portanto, basta fazer:s//<newname>/gc
.AFAIK, não há suporte real de refatoração no VIM. Ao renomear com a intenção de refatorar, geralmente tomo as seguintes precauções:
Minha mudança final se parece com isso
Eu adoraria estar errado sobre não haver uma ferramenta de refatoração para o VIM, mas não vi isso.
fonte
Eu sei que é uma pergunta antiga, e o método de @ mykola-golubyev obviamente É a melhor resposta para o caso específico da pergunta de OP (que, presumo, está passando por um código ofuscado, em que é provável que você tenha vários blocos com os mesmos nomes de var) ; mas com o nome da pergunta como aquele, muitas pessoas que vêm aqui das pesquisas do google provavelmente procuram maneiras menos específicas da situação para renomear variáveis no VIM - e essas podem ser mais concisas
Estou surpreso que ninguém sugeriu desta forma:
O
*
é o mesmo quegn
- ele procura a próxima ocorrência da palavra sob o cursor E se torna o último padrão pesquisado, portanto, quando você omite o padrão de pesquisa no comando substituto, o VIM assume que este é o padrão a ser pesquisado.Para pequenas quantidades de cópias var, uma ainda mais rápida:
Pesquisa por ocorrência,
cw
é o comando para alterar palavra ,n
vai para a próxima ocorrência do último termo pesquisado e.
repete o último comando (que é alterar palavra para NEWNAME )(Os créditos por saber de tudo isso vão para @doomedbunnies no Reddit )
Outro truque legal é este: ( créditos para @ nobe4 )
cgn
é "alterar o resultado de (localizar a próxima ocorrência)". Agora que este é o último comando , você não precisan
ir para a próxima ocorrência, portanto, menos golpes novamente e, mais importante, não há necessidade de alternarn
e.
. Mas, obviamente, este tem a desvantagem de não ter uma maneira de pular uma ocorrência.Aqui estão alguns benefícios:
*
ougn
para a seleção de palavras é muito rápido - apenas um toque de tecla (bem, digamos 1,5)*
ougn
garante que você não obtenha nenhuma correspondência dentro de outras palavras, assim como:%s/<C-R>//gc
faz. Melhor do que digitar à:%s/\<OLDNAME\>/NEWNAME/gc
mão: pessoalmente, tendo a esquecer de usar as\<
coisas para limitar as correspondências apenas a palavras inteiras.n
para pular combinações indesejadas - provavelmente ainda menos do que os toques extras necessários para limitar o escopo. Em circunstâncias normais, de qualquer maneira suas variáveis provavelmente estão localizadas em um determinado bloco de código.fonte
Coloque isso no seu .vimrc
Ligue com
:call Rnvar()
expand("<cword>")
coloca a palavra sob o cursor. A string de pesquisa usa%
para escopo de arquivo, e os\(\W\)
padrões procuram por caracteres não-word no limite da palavra para substituir e salvá-los em variáveis\1
e\2
para serem reinseridos no padrão de substituição.fonte
Você poderia usar o modificador 'c' na pesquisa global e substituir que solicitaria a confirmação de cada substituição. Levaria mais tempo, mas pode funcionar para um arquivo de código não enorme:
O c significa confirmar.
fonte
Em c, você pode fazer algum progresso usando cscope. Faz uma tentativa de entender a sintaxe, então teria uma chance de saber quando a letra era uma variável.
fonte
Se isso ocorrer em vários arquivos, você pode considerar dar uma olhada no sed. Use find para pegar seus arquivos e xargs mais sed para uma substituição. Digamos que você queira substituir a por a_better_name em todos os arquivos correspondentes a * .c, você pode fazer
encontrar . -name "* .c" | xargs sed -i -e 's / a / a_better_name / g'
Lembre-se de que isso substituirá TODAS as ocorrências de a, então você pode querer uma regex mais robusta.
fonte