Subversive는 빠른 교체를 매우 쉽게 수행할 수 있도록 두 가지 새로운 운영자 동작을 제공합니다. 여기에는 기본 매핑이 포함되어 있지 않으며 사용자가 직접 지도를 추가할 때까지 아무 효과도 없습니다.
아래 텍스트 대신 이 플러그인에 대한 비디오 설명을 시청하고 싶다면 여기를 참조하세요.
예시 구성:
" s for substitute
nmap s <plug> (SubversiveSubstitute)
nmap ss <plug> (SubversiveSubstituteLine)
nmap S <plug> (SubversiveSubstituteToEndOfLine)
이 경우 문자 변경 키 s
숨기게 되므로 더 긴 형식의 cl
사용해야 합니다.
이러한 맵을 추가한 후 s<motion>
실행하여 모션에서 제공하는 텍스트 객체를 기본 레지스터(또는 제공된 경우 명시적 레지스터)의 콘텐츠로 대체할 수 있습니다. 예를 들어, siw
실행하여 커서 아래의 현재 단어를 현재 잡아당기기로 바꾸거나 sip
실행하여 단락을 바꿀 수 있습니다.
Subversive가 제공하는 또 다른 흥미로운 연산자를 사용하면 여러 연속 동작을 사용하여 바꿀 텍스트와 변경 사항을 적용할 줄 범위를 모두 지정할 수 있습니다.
예시 구성:
nmap <leader> s <plug> (SubversiveSubstituteRange)
xmap <leader> s <plug> (SubversiveSubstituteRange)
nmap <leader> ss <plug> (SubversiveSubstituteWordRange)
이 지도를 추가한 후 <leader>s<motion1><motion2>
실행하고 상태 표시줄의 프롬프트에 일부 텍스트를 입력하면 motion1
에 의해 제공된 텍스트는 각 줄의 프롬프트에 입력한 텍스트로 대체되어야 합니다. motion2
에서 제공합니다. 또는 시각적 모드에서 motion1
선택한 다음 <leader>s<motion2>
눌러 동일한 효과를 얻을 수도 있습니다.
이것은 매우 강력할 수 있습니다. 예를 들어, <leader>siwip
실행하여 커서 아래 단락 내에 존재하는 커서 아래 현재 단어의 모든 인스턴스를 바꿀 수 있습니다. 또는 <leader>sl_
현재 행에서 커서 아래에 있는 문자의 모든 인스턴스를 대체합니다.
<leader>ss
매핑은 커서 아래의 현재 단어를 바꾸는 바로가기로 사용됩니다. 예를 들어 <leader>ssip
실행하여 현재 단락에서 커서 아래에 있는 단어를 바꿀 수 있습니다. 이는 완전한 단어와 일치하므로 <leader>siwip
과 다릅니다(각 일치 항목에 단어 경계가 필요하지 않음).
실제로 살펴보겠습니다.
이 gif에서는 먼저 <leader>ssom
실행한 다음 프롬프트에 bar
입력하여 로컬 foo
매개변수의 이름을 바꿉니다( om
은 '외부 C# 메서드'를 나타내는 사용자 정의 모션이며 이 플러그인에서 제공되지 않음). 또한 <leader>ss
사용하고 있기 때문에 _foos
텍스트는 전체 단어와 일치하지 않기 때문에 영향을 받지 않습니다. 이 경우에는 함수 내에서 매개변수의 이름만 바꾸려고 하므로 유용합니다.
그런 다음 시각적 모드로 전환하고 foo
부분 _foos
선택한 다음 <leader>sie
실행하고 다시 프롬프트에 bar
입력합니다. ie
, 다시 entire buffer
나타내는 사용자 정의 모션입니다(자세한 내용은 다음 섹션 참조).
그런 다음 AddFoo
의 Foo
부분으로 이동하여 <leader>seie
실행하고 다시 Bar
입력합니다. 그런 다음 마지막으로 완전히 대문자로 표시된 FOOS
에 대해 동일한 작업을 수행합니다.
neovim을 사용하는 경우 inccommand
옵션을 활성화하여 입력하는 동안 대체 항목의 실시간 미리보기를 얻을 수 있습니다( g:subversivePromptWithActualCommand
1
로 설정하는 것과 동일).
또한 이 동작은 반복 가능합니다. 한 문단에서 <leader>siwip
실행했다면 다른 문단으로 이동한 후 를 누르세요 .
그러면 커서 아래의 새 단락에 동일한 대체가 적용됩니다.
이러한 매핑을 실제로 활용하려면 현재 단락( ip
), 현재 문장( is
) 또는 현재 줄( _
)과 같은 내장 개체 외에 사용자 정의 텍스트 개체를 추가하는 것이 도움이 됩니다. 현재 들여쓰기 수준, 현재 메서드, 현재 클래스, 전체 버퍼, 현재 스크롤 페이지 등과 같은 사용자 정의 텍스트 개체는 모두 여기에서 많은 도움이 될 수 있습니다.
예를 들어, 파괴에 유용한 몇 가지 매우 간단한 모션은 다음과 같습니다.
" ie = inner entire buffer
onoremap ie :exec "normal! ggVG" <cr>
" iv = current viewable text in the buffer
onoremap iv :exec "normal! HVL" <cr>
한 번 살펴보시기를 권장하는 다양한 사용자 정의 텍스트 개체를 제공하는 다른 플러그인도 있습니다.
많은 대체 항목의 경우 하이라이트 미리보기를 통해 대체 항목을 이해할 수 있습니다. 그러나 전체 파일에 걸쳐 더 큰 교체를 수행하는 경우 각 파일을 확인하는 것이 좋습니다. 다음 지도를 사용하여 이 작업을 수행할 수 있습니다.
nmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
xmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
nmap <leader> css <plug> (SubversiveSubstituteWordRangeConfirm)
이는 각 교체를 하나씩 진행한다는 점을 제외하면 위의 <leader>s
맵과 동일하게 작동합니다.
위의 대체 동작에 명시적인 레지스터를 제공하면 프롬프트가 표시되지 않고 대신 지정된 레지스터의 내용이 사용됩니다. 예를 들어, "a<leader>siwip
커서 아래에 있는 현재 단어의 모든 인스턴스를 현재 단락 내에 존재하는 레지스터 a
의 내용으로 즉시 대체합니다.
이것이 충분하지 않은 경우 다음 플러그를 대신 사용할 수도 있습니다.
nmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
xmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
nmap <leader> ss <plug> (SubversiveSubstituteWordRangeNoPrompt)
메시지를 표시하는 대신 기본 레지스터를 사용한다는 점을 제외하면 이전 플러그와 동일하게 작동합니다.
블랙홀 레지스터를 대체 범위 초과 명령 중 하나에 전달하여 이를 수행할 수 있습니다. 예: 각 삭제를 확인하려면 "_<leader>siwip
또는 "_<leader>csiwip
.
불행하게도 이 입력을 이스케이프를 통한 취소와 구별할 수 있는 방법이 없기 때문에 프롬프트에 빈 값을 입력할 수 없습니다( g:subversivePromptWithActualCommand
1
로 설정하지 않는 한 제대로 작동함).
g:subversivePromptWithCurrent
- 1
로 설정하면 대체되는 텍스트가 프롬프트에 포함됩니다. 편집만 하고 싶을 때 유용할 수 있습니다. 기본값: 0
g:subversiveCurrentTextRegister
- 설정되면 지정된 레지스터가 대체되는 텍스트로 채워집니다. 이는 g:subversivePromptWithCurrent
의 대안으로 유용할 수 있으므로 편집하고 싶을 때 프롬프트에서 <cr>r
누르고( 'r'
로 설정했다고 가정), 그렇지 않으면 직접 입력할 수 있습니다. 전체 교체.g:subversivePromptWithActualCommand
- 1
로 설정하면 대체 텍스트를 묻는 메시지만 표시하는 대신 기본 vim 대체 명령을 묻는 메시지가 표시됩니다. 베테랑 vim 사용자는 다양한 대체 플래그를 직접 조정할 수 있기 때문에 이것을 선호할 수 있습니다. 기본값: 0
g:subversivePreserveCursorPosition
- 1
로 설정하면 대체 항목이 적용될 때 커서가 이동하지 않습니다. 일반적인 vim 동작과 일치하도록 기본값은 0
입니다. vim-abolish도 설치했다면 다음 매핑과 비슷한 것을 추가하는 것도 고려할 수 있습니다.
nmap <leader> <leader> s <plug> (SubversiveSubvertRange)
xmap <leader> <leader> s <plug> (SubversiveSubvertRange)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRange)
이는 vim에 내장된 대체 명령을 사용하는 대신 'subvert' 폐지를 수행한다는 점을 제외하면 <leader>s
와 동일하게 작동합니다. 이렇게 하면 대체가 적용되고 원래 단어의 대소문자도 그대로 유지됩니다. 예를 들어:
이 경우 커서를 foo
위로 이동한 다음 <leader><leader>seie
실행하고 bar
입력하면 대소문자에 관계없이 foo
의 모든 인스턴스가 대체됩니다.
이는 빠른 이름 바꾸기를 수행하는 매우 편리한 방법일 수 있습니다.
예상한 대로 <leader><leader>ss
매핑은 단어 경계를 포함하는 완전한 단어만 일치한다는 점을 제외하면 유사하게 작동합니다.
그리고 원하는 경우 프롬프트 대신 기본 레지스터를 사용하는 대체 플러그도 있습니다.
nmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
xmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRangeNoPrompt)
vim-subversive와 함께 vim-yoink를 설치하면 붙여넣기 후 yoink 교환 기능이 자동으로 파괴적인(단일 동작) 대체에서도 작동합니다. 즉, 기본 매핑을 가정하면 siw
실행한 다음 <cn>
/ <cp>
눌러 yoink 기록에서 다른 양크 사이를 교환할 수 있습니다.
Subversive는 또한 시각적 모드 붙여넣기를 대체하는 플러그를 제공하여 붙여넣기 후 교환도 제공합니다.
xmap s <plug> (SubversiveSubstitute)
xmap p <plug> (SubversiveSubstitute)
xmap P <plug> (SubversiveSubstitute)
이제 비주얼 모드에서 p
누르면 일반 모드에서 붙여넣을 때처럼 양키 사이를 전환할 수 있습니다.