IT

Vim에서 변수 이름 변경

lottoking 2020. 9. 11. 08:15
반응형

Vim에서 변수 이름 변경


많은 단일 문자 변수 이름을 포함하는 Vim을 통해 많은 C / Perl 코드를 개발합니다.

코드를 읽는 동안 변수의 이름을 좀 더 의미있는 변경하여 나머지 부분을 더 빨리 읽을 수 있도록 도와주는 명령이 있으면 좋을 것입니다.

Vim 에이 작업을 신속하게 수행 할 수있는 명령이 있습니까?

나는 정규식이 작동하지 않을 것이라고 생각합니다.

  1. 동일한 단일 문자 이름은 다른 범위 지정 블록에서 다른 주소를 사용할 수 있습니다.

  2. 동일한 문자 조합이 다른 큰 변수 이름의 일부 또는 주석 일 수 있습니다.

솔루션이 있습니까?


다음은 현재 범위에 정의 된 변수의 이름을 변경하는 방법 {}입니다.

변수 사용법으로 커서를 이동하십시오. 를 칵테일 gd. 즉, 커서를 정의로 이동합니다. 이제 Press- [{스코프 시작으로 이동합니다. V-를 표시 라인 선택이 켜집니다. %-버튼을 반대쪽으로 점프 }하여 전체 스코프를 선택합니다. 누르기 :s/-대체 명령 시작. <C-R>/-내부 이름 (누르기 전에 사용했던 이름)과 일치하는 패턴을 삽입 gd합니다. /newname/gc<CR>-검색을 시작하고 매 경기마다 확인합니다.

이제 매크로를 기록하거나 더 나은 방법으로 키를 매핑해야합니다.

최종 매핑은 다음과 가변합니다.

" For local replace
nnoremap gr gd[{V%::s/<C-R>///gc<left><left><left>

" For global replace
nnoremap gR gD:%s/<C-R>///gc<left><left><left>

당신에게 .vimrc두거나 그냥 실행하십시오. 이 후 gr로컬 변수를 지정 :s명령을 입력 new_variable_name하고를 누르기 만하면 Enter됩니다.


AFAIK, VIM에는 실제 리팩토링 지원이 없습니다. 리팩터링 목적으로 이름을 대체 할 때 일반적으로 다음 예방 조치를 취합니다.

  1. 마크를 사용하여 변경 범위를 제한하십시오.
  2. 정규식을 입력 할 때 이름을 \ <및> 묶습니다. 이렇게하면 전체 단어와 일치하여 발생하는 잘못된 이름 변경 유형을 수 있습니다.
  3. 잘못된 교체 가능성을 위해 여러 줄로 교체하지 않습니다.
  4. 작은 변화가 아니라면 코드 차이를주의 깊게 살펴 봅니다.

내 최종 변경은 다음과 가변합니다.

:'a,'bs/\<foo\>/bar

나는 VIM을 보유하고 있다고 생각하고 있습니다.


.vimrc에 추천십시오.

" Function to rename the variable under the cursor
function! Rnvar()
  let word_to_replace = expand("<cword>")
  let replacement = input("new name: ")
  execute '%s/\(\W\)' . word_to_replace . '\(\W\)/\1' . replacement . '\2/gc'
endfunction

그것을 부르십시오 :call Rnvar()

expand("<cword>")커서 아래에 단어를 가져옵니다. 검색을 사용하는 %파일 범위에 대한, 그리고 \(\W\)패턴은 대체 할 수있는 단어의 경계에서 비 단어 문자를 찾는 변수에 저장 \1하고 \2있으므로 대체 패턴으로 재 삽입 할 수 있습니다.


나는 그것이 오래된 질문이라는 것을 알고 있고 @ mykola-golubyev의 방법은 분명히 OP 질문의 특정 경우에 대한 최선의 대답입니다 (동일한 var 이름을 여러 블록을 확률 적으로 가능성이있는 난독 화 된 코드를 거치고 있음 가정합니다) ; 그러나 Google 검색에서 여기에 오는 많은 사람들이 VIM에서 변수 이름을 변경하는 덜 상황 별 방법을 찾는 것과 같은 질문 이름을 사용하면 더 간결 할 수 있습니다.

나는 아무도 이렇게 제안하지 않았습니다.

* :s// NEWNAME /gc

*과 동일 gn는 커서 아래의 단어의 다음 선두로부터 검색하고 마지막 패턴을 검색하게 당신은 대체 명령에서 검색 패턴을 생략 할 때, VIM은이 검색 할 패턴이다 가정 -.

소량의 var 사본의 경우 더 빠른 사본 :

* cw NEWNAME <esc> 그런 다음 n.다른 항목에 대해 반복

발생 검색, 단어 변경cw 명령 , 마지막 검색을 위해 다음 발생으로 이동 하고 마지막 명령을 반복합니다 ( 단어를 NEWNAME변경 ).n.

(이 모든 것을 아는 크레딧은 Reddit의 @doomedbunnies 로 이동합니다 )

또 다른 멋진 트릭은 다음과 같습니다. ( @ nobe4 크레딧 )

* cgn NEWNAME <esc> 그런 다음 .다른 항목에 대해 반복

cgn"(다음 항목 찾기)의 결과를 변경하십시오"입니다. 이제이 명령이 마지막 명령 n이므로 다음 발생으로 이동하는 데를 사용할 필요가 없으므로 다시 스트로크 횟수가 줄어들고 더 중요한 것은 n.. 그러나 분명히 이것은 발생을 건너 뛸 수있는 방법이 없다는 단점이 있습니다.

다음은 몇 가지 이점입니다.

  • 매핑이없고 .vimrc (또는 init.vim)가 없으므로 모든 VIM 사본에서 사용할 수 있습니다 (예 : 일부 VPS 또는 친구의 컴퓨터에서 VIM을 구성하면 '빠른'목적에 맞지 않는 빠른 작업 )
  • 사용 *또는 gn단어 선택이 매우 빠르게 - 하나의 키 입력 (물론,의 1.5을 가정 해 봅시다)
  • 를 사용 *하거나 gn다른 단어 안에 일치하는 항목이 없는지 확인합니다 :%s/<C-R>//gc. :%s/\<OLDNAME\>/NEWNAME/gc손으로 타이핑하는 것 보다 낫습니다 . 저는 개인적으로 \<단어 전체로만 일치 시키는 것을 사용하는 것을 잊는 경향이 있습니다.
  • 스코프를 사용하지 않으면 n원치 않는 일치를 건너 뛰기 위해 몇 번의 추가 스트로크 만 발생합니다. 아마 범위를 제한하는 데 필요한 추가 스트로크보다 더 적을 것입니다. 정상적인 상황에서 변수는 어쨌든 특정 코드 블록으로 다소 지역화 될 가능성이 큽니다.

전역 검색에서 'c'수정자를 사용하고 각 교체에 대한 확인을 요청하는 교체를 사용할 수 있습니다. 시간이 더 걸리지 만 엄청난 코드 파일에서 작동 할 수 있습니다.

%s/\$var/\$foo/gc

c는 확인을 나타냅니다.


c에서는 cscope를 사용하여 약간의 진전을 이룰 수 있습니다. 구문을 이해하려고 시도하므로 문자가 언제 변수인지 알 수 있습니다.


이것이 여러 파일에 걸쳐있는 경우 sed를 살펴볼 수 있습니다. find를 사용하여 파일과 xargs 및 sed를 가져 와서 교체하십시오. * .c와 일치하는 모든 파일에서 a를 a_better_name으로 바꾸고 싶다면 다음을 수행 할 수 있습니다.

찾기 . -name "* .c"| xargs sed -i -e 's / a / a_better_name / g'

이것은 a의 모든 발생을 대체하므로 더 강력한 정규식을 원할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/597687/changing-variable-names-in-vim

반응형