원하는 위치에 여러 커서


14

내가 사용하고 정력-복수를-커서 플러그인.

커서를 원하는 곳에 정확히 놓고 싶습니다. 예를 들어 ( [x]커서 위치는 다음과 같습니다) :

Lorem ipsum dolor sit amet[1], consectetur adipiscing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna[2]
aliqua.

에서 숭고한 텍스트 나는 일반적으로 다음, 첫 번째 커서를 둘 것입니다 화살표 키를 사용하여 다음 위치로 이동 초에 1 점을 추가하는 듯.

VIM에 비슷한 것이 있습니까? 이 플러그인 또는 다른 플러그인으로.

편집하다

쓰기를 시도 할 때 주석에 이어, 그렇게 내 관심 등장
\section[My first section in this book]{My first section in this book}
A의 .tex파일. 내 첫 반응은 작성했다 \section[]{}후 내부에 같은 일을 쓰기 위해 두 커서를 넣어 []{}.

다른 예는 _someStuff여러 변수 이름 뒤에 추가하는 것 입니다. 예를 들어, 이것을 돌리십시오 :

variable1 = 2
my_variable2 = 12
var3 = 14

이것으로 :

variable1_someStuff = 2
my_variable2_someStuff = 12
var3_someStuff = 14

여러 커서를 사용하면 열 커서를 선택한 다음 단어의 끝으로 이동 한 다음 삽입 등을 수행 할 수 있습니다. 그러나 커서를 원하는 위치를 정확하게 선택하기가 쉽다고 생각합니다.



1
중요한 질문은 왜 그렇게하고 싶습니까? 무엇을하려고합니까? 여러 커서를 사용하는 것이 실제로 "Vim 방식을 따르는"것은 아니지만 내장 기능을 사용하여 최소한 효율적으로 원하는 것을 수행하는 다른 방법이있을 수 있습니다.
statox

@statox. 편집을 참조하십시오. 나는 내 마음에 온 두 가지 예를 들었다. 두 번째는 vim-multiple-cursors 플러그인으로 수행 할 수 있지만 첫 번째는 적어도 쉬운 방법으로는 불가능합니다.
tomasyany

@ 노베 고마워, 두 번째 스크립트가 그것을 만들었습니다.
tomasyany

답변:


30

여러 커서를 사용하는 것은 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매크로 기록을 시작하십시오 qq. 이것은 "미래의 모든 키 스트로크 기록을 레지스터라는 이름으로 시작합니다"를 의미 q합니다.

  • 편집 입력을 시작하십시오.

    • 0 줄의 시작 부분으로 이동
    • e 첫 단어의 끝으로 가다
    • a 커서 뒤에 추가
    • .someStuff 원하는 텍스트를 추가
    • <Esc> 삽입을 중지
    • j 다음 줄로 가다
    • q 매크로 기록을 중지하려면
  • 당신은 얻을 것이다:

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?

그럼 당신은 당신의 커서를 수 iimages키를 누릅니다 <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로 축약 gdelete같이 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생략 되었습니다. 우리가이 방법을 적용하면vglobal

: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에게 특별한 감사를드립니다.


매우 완전한 답변. 나는 실제로 모든 명령을 알고 있었지만 그런 식으로 사용하는 것을 결코 생각하지 못했습니다 ... 연습이 더 필요하다고 생각합니다. 그러나 때로는 'vim-way'가 일부 플러그인을 사용하는 것보다 오래 걸리는 경우가 있습니다 (예 : CSS 예제는 앞서 언급 한 플러그인으로 훨씬 빠르게 수행 할 수 있음). 때로는 실제로 훨씬 짧습니다 (실제로는 방대합니다) vim은 대부분 올바르게 사용된다면 텍스트 편집기보다 빠릅니다).
tomasyany

Btw, 나는 당신의 대답이 이미 완전하다고 생각합니다. 동의하지만 자세한 내용을 추가하고 싶다면 읽어 주시면 감사하겠습니다.
tomasyany

1
@tomasyany : 실제로 "vim way"를 사용하는 것이 더 길어 보일 수도 있습니다 (수동으로 변경을 수동으로 수행 한 것보다 작동하는 매크로를 만드는 데 더 많은 시간을 소비하는 횟수를 셀 수는 없습니다). 실제로는 결국 더 빠릅니다. 나는 Vim을 1 년 동안 사용해 왔으며 전문가가 되기는 힘들지만 연습하면서 편집 내용이 지속적으로 향상되는 것을 느낄 수 있습니다.
statox

1
아마도 gn텍스트 객체를 언급해야 합니다. 여러 커서의 일부 사용 사례를 다룹니다. 로 검색 한 /다음 dgn또는로 검색 cgn한 다음로 반복하십시오 ..
Justin M. Keyes 1

@ 저스틴 정말 익숙하지 않아 gn시도하고 추가 할 것입니다. 고마워요!
statox

5

나에게 주어진 유스 케이스는 .키 명령 을 알고 싶어하는 것 같습니다 (마지막 편집 명령 반복)

  • 처음으로 이동하여을 누르고 i텍스트를 삽입 한 다음<ESC>
  • 위치 2로 이동하고 .(점)을 누릅니다 ==> 동일한 텍스트가 삽입됩니다
  • 한 줄 아래로 이동하고 다시 삽입하려면 (연속 줄에 삽입 할 때) <ALT>-j.

나를위한 tex 예제는 다음과 같이 해결됩니다.

I\section[]{}<ESC>hhiMy first Sec...<ESC>lll.


꽤 좋은 해결책입니다. 나는 .핵심 명령을 완벽하게 알고 있었지만 그런 식으로 사용하는 것을 결코 생각하지 않았습니다. 좋은 방법이라는 데 동의합니다. 그러나 귀하의 답변은 실제로 실제 질문을 나타내는 것이 아니므로 그것을 받아들이는 것이 적절하지 않습니다.
tomasyany

1
글쎄, 당신의 질문 (원하는 사용 사례를 추가 한 후)은 "나는 정말 가위를 좋아하고 나사로 조이고 싶습니다. 어떻게하는지 말하십시오." 그리고 나 드라이버에 대한 멋진 사용하는 방법을 가리키는) 내가 아는하지 않기 때문에 (내가) 의견 포맷하는 방법, 답변으로 추가
알렉스 Stragies

4

더 Vim 방법.

첫 번째 과제 :

\section[foobar baz]{foobar baz}

워크 플로우 :

\section[]{}
hh
ifoobar baz<Esc>
$.

두 번째 과제 :

variable1 = 2
my_variable2 = 12
var3 = 14

명령:

3:norm ea_somestuff

결과:

variable1_somestuff = 2
my_variable2_somestuff = 12
var3_somestuff = 14
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.