Vim에서 변수 이름 변경
많은 단일 문자 변수 이름을 포함하는 Vim을 통해 많은 C / Perl 코드를 개발합니다.
코드를 읽는 동안 변수의 이름을 좀 더 의미있는 변경하여 나머지 부분을 더 빨리 읽을 수 있도록 도와주는 명령이 있으면 좋을 것입니다.
Vim 에이 작업을 신속하게 수행 할 수있는 명령이 있습니까?
나는 정규식이 작동하지 않을 것이라고 생각합니다.
동일한 단일 문자 이름은 다른 범위 지정 블록에서 다른 주소를 사용할 수 있습니다.
동일한 문자 조합이 다른 큰 변수 이름의 일부 또는 주석 일 수 있습니다.
솔루션이 있습니까?
다음은 현재 범위에 정의 된 변수의 이름을 변경하는 방법 {}
입니다.
변수 사용법으로 커서를 이동하십시오. 를 칵테일 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에는 실제 리팩토링 지원이 없습니다. 리팩터링 목적으로 이름을 대체 할 때 일반적으로 다음 예방 조치를 취합니다.
- 마크를 사용하여 변경 범위를 제한하십시오.
- 정규식을 입력 할 때 이름을 \ <및> 묶습니다. 이렇게하면 전체 단어와 일치하여 발생하는 잘못된 이름 변경 유형을 수 있습니다.
- 잘못된 교체 가능성을 위해 여러 줄로 교체하지 않습니다.
- 작은 변화가 아니라면 코드 차이를주의 깊게 살펴 봅니다.
내 최종 변경은 다음과 가변합니다.
:'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
'IT' 카테고리의 다른 글
버튼 클릭시 체계적으로 양식을 출시하기 위해 Angular2를 피하십시오. (0) | 2020.09.11 |
---|---|
System.out.println이 사용되지 않는 한 끝없는 루프가 종료됩니다. (0) | 2020.09.11 |
Chrome의 개발자 도구에는없는 Firebug의 기능은 무엇입니까? (0) | 2020.09.11 |
C # 네임 스페이스-요점은 무엇입니까? (0) | 2020.09.11 |
두 번 허용 속성을 만드는 방법 (0) | 2020.09.11 |