여러 커서를 사용하는 것은 Vimmer가 아닙니다.
멀티 커서를 사용하는 주석 (플러그인조차도)이 실제로 "Vim 방식을 따르는"것은 아니지만 Sublime-Text에서 온 사람에게는 매력적이지만 적어도 다른 대안을 찾을 수 있음을 완전히 이해합니다. Vim 내장 기능으로 효율적입니다.
물론, 이러한 대안 솔루션을 찾는 것이 항상 쉬운 것은 아니며 때로는 시간이 걸리지 만 Vim 경험으로 인해 더 쉬워 질 것입니다. 시간이 지남에 따라 여러 커서가 완전히 쓸모없는 것처럼 보일 것입니다.
멋지지만 다른 방법을 어떻게 찾을 수 있습니까?
그것은 당신이하려는 일에 많이 의존하기 때문에 보편적 인 대답은 없습니다. 나는 먼저 시도해야 할 것들에 대한 힌트를 주려고합니다.
도트 명령 .
Dot 명령은 아마도 Vim에서 가장 강력한 도구 중 하나 일 것입니다. 마지막 변경을 반복 할 수 있습니다. 그의 실용적인 Vim 에서 Drew Neil보다 더 잘 설명 할 수 없었습니다 . 모든 Vimmer가이 책을 읽는 것을 고려해야한다고 생각합니다.
이 명령의 장점은 마지막 변경이 문자, 줄 또는 전체 파일에서 작업하는 작업 일 수 있다는 것입니다. 예를 들어 삽입 모드로 들어가는 순간과 다시 일반 모드로 돌아가는 순간에 따라 변경을 구분할 수 있습니다.
이를 염두에두고 멀티 커서로 원하는 것을 쉽게 수행 할 수 있습니다.
먼저 환경을 설정하자 : 제안한대로 작성하자
\section[]{}
그런 다음 있도록 반복 변화가
커서 지금에 }
명중 F[
온 돌아가 [
문자. 그 다음으로 모드 삽입 입력 i
과 입력 My first section in this book
및 정상 모드로 돌아갑니다 ESC
:
\section[My first section in this book]{}
그리고 여기 마법의 부분이 있습니다 : f{
커서를 {
캐릭터에 놓고 .
마지막 변경을 반복하기 위해 누르십시오 .
\section[My first section in this book]{My first section in this book}
dot 명령의 모든 과제는 반복 가능한 변경을 수행하는 방법을 배우는 것입니다. Vim과 함께 제공되지만 기본적으로는 반복 가능한 방식으로 변경하는 방법을 이해하는 것입니다.
예를 들어 줄 끝에 세미콜론을 삽입하려면 A;
대신에 사용하는
것이 좋습니다 $a;
. 왜?
때문에 A;
사용할 수 있습니다 그래서 원자 작업을 만들어 .
다른 라인을, 당신은 줄에 상관없이 당신은 마지막에 세미콜론을 삽입 할 수 있습니다. 사용하는 경우 반면 $a;
당신은 당신의 두 부분의 변화 분할 $a
과의 삽입 ;
당신이 사용하는 경우, 그래서 .
는 커서의 현재 위치에 세미콜론을 삽입됩니다.
참고 Vim의 마법 공식은 n.
입니다. 정말 멋진 워크 플로우는 다음과 같습니다.
- 편집하려는 장소를 검색하십시오.
/pattern
- 반복 편집 가능
- 사용
n
편집에 다음 장소로 이동
.
편집을 반복하는 데 사용
- 마지막 두 단계를 반복하십시오 : 당신은 세계의 왕 (또는 최소한 편집)
매크로
매크로는 Vim에서 매우 중요한 도구 중 하나입니다. 키 입력 순서를 기록하고 다시 입력 한 것처럼 반복 할 수 있기 때문입니다.
예를 들어 두 번째 사용 사례를 사용하겠습니다.
variable1 = 2
my_variable2 = 12
var3 = 14
다시 한 번 중요한 것은 매크로를 효율적으로 만드는 방법을 배우는 것입니다 (나중에 예를 들겠습니다).
variable1.someStuff = 2
my_variable2 = 12
var3 = 14
- 이제 매크로를 사용하여 편집을 반복 할 수 있습니다. 편집 할 올바른 줄에 있으므로 간단히로 매크로를 실행할 수 있습니다
@q
. 우리가 두 번 실행하고 싶을 때 사용할 2@q
수 있으며 다음과 같은 결과를 얻을 수 있습니다.
variable1.someStuff = 2
my_variable2.someStuff = 12
var3.someStuff = 14
참고 1 알다시피 0ea
, 매크로의 시작 부분에 사용하는 것이 정말 중요했습니다. 실제로 매크로를 기록하고 다시 실행하기 전에 커서를 첫 단어 끝에 놓았다면 결과는 다음과 같습니다.
variable1.someStuff = 2
my_variable2 = 12.someStuff
var3 = 14.someStuff
커서로 텍스트가 줄 변경 후 커서의 위치에 삽입되었을 것입니다 (이 경우 줄 끝)
비고 2 매크로는 매우 강력하며, 편안 할 때 재귀 매크로를 만들 수도 있습니다. 당신의 매크로는 다음과 같습니다.
`0ea.someStuff<Esc>j@q`
마지막 @q
은 매크로를 사용하는 대신 매크로를 자체적으로 호출했을 것입니다 2@q
. 당신은 방금 사용 @q
했고 모든 작업이 완료되었을 것입니다.
비주얼 블록
여기에는 사용 사례에 직접 적용되지 않지만 동시에 많은 행을 편집하는 데 유용한 유용한 트릭이 있습니다. CSS 코드의이 추출을 보자 :
li.one a{ background-image: url('/images/sprite.png'); }
li.two a{ background-image: url('/images/sprite.png'); }
li.three a{ background-image: url('/images/sprite.png'); }
당신이에서 스프라이트 이동 한 경우 images
에를 components
?
그럼 당신은 당신의 커서를 수 i
의 images
키를 누릅니다 <C-v>
. 블록을 선택할 수있는 시각적 블록 모드가 시작됩니다. 이제 t/
변경하려는 단어를 선택하고 단어의 2j
모든 항목 을 선택하도록 입력 할 수 있습니다 .
그 후에 c
는 단어를 변경하고 를 입력 하기 만하면 components
됩니다. 삽입 모드를 종료하면 다음을 볼 수 있습니다.
li.one a{ background-image: url('/components/sprite.png'); }
li.two a{ background-image: url('/components/sprite.png'); }
li.three a{ background-image: url('/components/sprite.png'); }
글로벌 명령
전역 명령은 패턴과 일치하는 행에 ex 모드 명령을 적용 할 수있는 도구입니다. 다시 한 번 여러 커서가 없어도 다른 위치에 동일한 변경 사항을 적용 할 수 있습니다.
구문은 다음과 같습니다.
:[range] g / pattern / command
[range]
매개 변수 에 대한 자세한 내용 은를 참조하십시오 :h :range
. 여기서는 자세히 설명하지 않겠습니다. 간단히 %
전체 파일을 '<,'>
나타내고 마지막 선택 항목을 1,5
나타내며 파일의 1-5 행을 나타냅니다.
이 매개 변수는 글로벌 명령으로 처리 될 행을 정의합니다. 범위를 지정하지 않으면 전역 명령이 %
기본적으로 사용 됩니다.
[pattern] 인수는 검색 엔진에 사용되는 검색 패턴입니다. 검색 기록을 통합 할 때이 필드를 비워 둘 수 있으며 전역 명령은 검색 기록에서 마지막 검색 패턴을 사용합니다.
마지막으로 [command] 매개 변수는 익숙한 ex 명령입니다.
이제 전역 명령의 동작은 매우 간단합니다.
- [range] 매개 변수에 정의 된 모든 행을 반복
- 현재 행이 정의 된 패턴과 일치하면 명령을 적용하십시오
[command] 매개 변수는 ex 명령이므로 많은 작업을 수행 할 수 있습니다. 흥미롭지 않고 디버깅 메시지가 많은 다음 의사 코드를 보자.
var myList = null
var i = 0
myList = new List()
echo "List instantiated"
for (i=0; i<10; i++)
myList.Add(i)
echo i . " added to the list"
echo "end of for loop"
이제이 코드가 작동하고 쓸모없는 echo
명령문 을 삭제하려고한다고 가정 해 봅시다 .
전체 파일에 전역 명령을 적용 할 수 있으므로 명령 앞에 접두사를 붙여야합니다 %
(또는 %
기본 범위 이므로 아무 것도 사용하지 않음 ).
삭제하려는 줄이 모두 패턴과 일치한다는 것을 알고 있습니다. echo
이 줄을 삭제하려면 다음 :delete
과 같이 약어 를 사용할 수있는 명령을 사용해야합니다.d
따라서 다음 기능을 사용해야합니다.
:%global/echo/delete
다음과 같이 약칭 할 수도 있습니다.
:g/echo/d
참고 %
사라는, global
로 축약 g
과 delete
같이 d
. 상상할 수 있듯이 결과는 다음과 같습니다.
var myList = null
var i = 0
myList = new List()
for (i=0; i<10; i++)
myList.Add(i)
참고 1 시간이 많이 걸리는 중요한 점은
normal
명령이 ex 명령이므로 전역 명령과 함께 사용할 수 있다는 것입니다. 그것은 정말로 강력 할 수 있습니다 : echo를 포함하는 모든 줄을 복제하고 싶습니다. 매크로 또는 마술 공식이 필요하지 않습니다 n.
. 간단하게 사용할 수 있습니다
:g/echo/normal YP
그리고 짜잔 :
var myList = null
var i = 0
myList = new List()
echo "List instantiated"
echo "List instantiated"
for (i=0; i<10; i++)
myList.Add(i)
echo i . " added to the list"
echo i . " added to the list"
echo "end of for loop"
echo "end of for loop"
NOTE 2 "특정 패턴과 일치하지 않는 라인에서 명령을 사용하려면 어떻게해야합니까?"
global
[pattern] 매개 변수와 일치하지 않는 행에 명령이 적용된다는 점을 제외하고 는 정확하게 작동 하는 반대 명령이 vglobal
생략 되었습니다. 우리가이 방법을 적용하면v
global
:v/echo/d
이전 예제에서 우리는 다음을 얻습니다.
echo "List instantiated"
echo i . " added to the list"
echo "end of for loop"
delete
명령은 포함되지 않았다 라인에 적용되었습니다 echo
.
여기 몇 가지 힌트가 멀티 커서 플러그인을 제거하고 Vim을 Vim 방식으로 사용하는 방법에 대한 아이디어를 제공하기를 바랍니다.
당신이 상상할 수 있듯이이 예제는 매우 간단하며 Vim 방식을 따를 때 실제로 몇 개의 커서가 거의 필요하지 않음을 보여주기 위해 만들어졌습니다. 내 조언은 유용하다고 생각되는 상황이 발생하면 적어두고 더 나은 해결책을 찾기 위해 시간이 좀 걸릴 것입니다. 시간의 99 %는 결국보다 빠르고 효율적인 방법을 찾을 수 있습니다.
또한 한 번 더 반복하지만 드류 닐 (Drew Neil)의 Practical Vim 을 읽어 보시기 바랍니다.
이 책은 "Vim 방식으로 생각하는 법을 배우는 법"에 관한 것이 아닙니다. 이를 통해 향후 문제에 대한 고유 한 솔루션을 효과적으로 구축 할 수 있습니다.
PS 편집 작업과이 긴 글을 수정 한 @Alex Stragies에게 특별한 감사를드립니다.