다중 커서의 기본


55

최근에에 대해 배웠으며 multiple-cursors매우 유용한 패키지처럼 보입니다. 나는 원래 저장소 에 대한 문서를 살펴 보았지만 명령은 여전히 ​​조금 모호합니다.

그런 다음 Emacs Rocks!에서 비디오 를 보았지만 비디오는 훌륭하지만 비디오 를 수행 하는 방법multiple-cursors 보다는 수행 할 수있는 작업 에 주로 중점을 둡니다 .

가장 기본적인 기능을 설명하는 연습, 자습서 또는 예제가 있습니까?


4
multiple-cursorsREADME 파일을 읽는 것만으로도 매우 빠르게 시작할 수있었습니다 . 나의 추천은 단지 배우는 것 mc/mark-next-like-this입니다. 시도해보고 그 기능에 익숙해 지십시오. "여러 개의 커서를 사용할 수 있는지 궁금합니다 ..."로 시작하는 질문이있을 때마다 README를 다시 참조하십시오. 비디오는 초보자에게 도움이 될 것입니다.
nispio

전적으로 동의합니다! 그것을 사용하는 방법은 분명하지 않습니다. 방금 선을 마스킹 한 다음 KBD가 바인드 된 상태에서 mc / edit-line을 수행합니다 (Github에서 언급 한 것처럼 Mx를 통하지 않음). 여러 개의 커서가 표시되지만 텍스트 입력 후에 사라집니다.
Dima Fomin

답변:


19

@bastibe가 설명하는 용도 외에도 여러 커서를 사용하여 줄 그룹의 시작 / 끝에서 텍스트를 추가하거나 제거합니다.

  1. 관심 영역의 시작 또는 끝으로 포인트 이동
  2. 전화 set-rectangular-region-anchor(당신이 좋아하는 키에 바인딩, 나는 H-space당신이 하이퍼 키가 있다면 Magnars의 제안은라고 생각합니다 )
  3. 포인트 앞으로 또는 뒤로 라인으로 (이전 C-nC-p편집하려는 모든 줄에 커서를 때까지)
  4. 필요에 따라 텍스트를 삽입하거나 삭제하고 선택적으로 줄 끝으로 이동하여 ( C-e) 변경하십시오.

등을 사용 하여 줄을 따라 앞뒤로 이동할 수 있으며 forward-word, forward sentence각 줄의 텍스트가 동일하지 않더라도 각 줄의 네 번째 단어를 편집 할 수 있습니다.

예를 들어, 나는 항상 이런 종류의 작업을 수행합니다.

  • C-u M-!ls / test-dat / pp5 / * fsaRETURN

    이것은 pp5 디렉토리의 내용을 버퍼에 삽입합니다. 나는 !리스팅의 시작 부분 에 포인트 를 둔다 :

!/test-dat/pp5/ONAB-6-5_Frag#89.fsa
/test-dat/pp5/QCJB-22-5_Frag#90.fsa
/test-dat/pp5/ONGL-1-5_Frag#102.fsa
/test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • H-space, C-nx 4를 사용하여 모든 줄에 커서 추가
  • 각 줄을 C-k C-y space C-y C-a

!/test-dat/pp5/ONAB-6-5_Frag#89.fsa /test-dat/pp5/ONAB-6-5_Frag#89.fsa
!/test-dat/pp5/QCJB-22-5_Frag#90.fsa /test-dat/pp5/QCJB-22-5_Frag#90.fsa
!/test-dat/pp5/ONGL-1-5_Frag#102.fsa /test-dat/pp5/ONGL-1-5_Frag#102.fsa
!/test-dat/pp5/ONGL-1-5_Frag#78.fsa /test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • M-dx 3 C-d C-fx3 M-dx3 <-를 사용 하여 첫 번째 섹션을 변수 이름으로 자릅니다.

ONAB-6-5 <-! /test-dat/pp5/ONAB-6-5_Frag#89.fsa
QCJB-22-5 <-! /test-dat/pp5/QCJB-22-5_Frag#90.fsa
ONGL-1-5 <-! /test-dat/pp5/ONGL-1-5_Frag#102.fsa
ONGL-1-5 <-! /test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • 그런 다음 함수에서 실제 파일 이름을 감싸서로드하십시오. read.file ( C-d" C-e")RETURN

ONAB-6-5 <- read.file("/test-dat/pp5/ONAB-6-5_Frag#89.fsa")
QCJB-22-5 <- read.file("/test-dat/pp5/QCJB-22-5_Frag#90.fsa")
ONGL-1-5 <- read.file("/test-dat/pp5/ONGL-1-5_Frag#102.fsa")
ONGL-1-5 <- read.file("/test-dat/pp5/ONGL-1-5_Frag#78.fsa")

그리고 voila, 당신은 파일 목록을 코드로 변환하여 그 목록을 읽었습니다. 실제로하는 것보다 실제로 설명하기가 훨씬 어렵습니다!


3
이 작업을 자주 수행하면 키보드 매크로로 래핑 할 수 있습니다. 키보드 매크로 multiple-cursors는 정말 강력한 조합을 만들 수 있습니다.
nispio

@nispio가 동의했습니다! 때때로 나는 같은 과정을 반복하고 매크로가 유용 할 것입니다. 그러나 작업 흐름 중간에 약간의 차이가있어 매크로를 '파손'시키는 약간의 변경이 필요합니다.
Tyler

1
정규 표현식을 사용하여 커서가 이동하려는 위치를 정확하게 설명 할 수 있습니다. 이러한 경우 다음과 같은 phi-search명령을 사용하는 것보다 사용하는 것이 더 강력 할 수 있습니다.M-f (x3)
nispio

@nispio는 상황에 따라 다릅니다. 일관되게 구조화 된 이름을 사용하면 단어별로 쉽게 이동할 수 있습니다. 내장 emacs 검색 명령이 mc와 취하기 때문에 여러 커서에서 검색을 사용하지 않았습니다. 에 대해 몰랐어요 phi-search. 멋져요!
Tyler

22

기본적으로 다음과 같은 두 가지 유스 케이스가 있습니다 multiple-cursors.

  • 문자열을 교체하십시오. 마크 문자열의 인스턴스, 다음 사용 mc/mark-next-like-thismc/mark-previous-like-this그 이상의 인스턴스를 표시 할 수 있습니다. 그런 다음 즉시 C-w모든 인스턴스를 삭제하고 대신 새 문자열을 작성합니다. 나는 이것을 자주 사용하여 코드에서 변수의 이름을 바꿉니다.
  • 여러 장소를 동시에 편집하십시오. 이전과 같이 문자열의 여러 인스턴스를 표시하지만을 사용하여 선택 (커서가 아닌)을 즉시 취소 C-g하거나 다른 행의 동일한 열에 표시 및 포인트를 mc/edit-lines놓고 행당 하나의 커서를 얻는 데 사용하십시오 . 이제 이러한 모든 커서에서 작동하는 일반 편집 명령을 사용할 수 있습니다.

첫 번째 사용 사례는 특히 유용합니다 expand-region. 나는 한 er/expand-region결합 C-j, 그리고 mc/mark-next-like-thismc/mark-previous-like-thisC->C-<. 이를 통해 단어 위치를 쉽게 선택하고 해당 단어의 다음 / 이전 단어를 즉시 표시 할 수 있습니다.

두 번째 사용 사례는 대부분의 매크로 사용을 대신했습니다. 매크로를 기록한 다음 여러 장소에 적용하는 대신 모든 장소에 커서를 놓고 모든 장소에서 한 번에 작업을 수행합니다.


감사합니다 @bastibe. 당신 또는 특정 바인딩 multiple-cursors 예에 대한 추천 mark-next-like-thismark-previous-like-this?
Amelio Vazquez-Reina

게시물에 요약 된대로 @ user815423426, C->and 및 C-<for mark-next-like-this를 사용 mark-previous-like-this합니다.
bastibe '

검색 및 교체에 표준 M- %를 사용하지 않는 이유는 무엇입니까?
Dima Fomin

6

가끔 사용하는 추가 기능을 추가하고 싶습니다 multiple-cursors.

다음이 유용하다는 것을 알았습니다.

iy-go-to-char

때로는 다음 #또는 다음 ,또는 특정 구분 기호 로 이동해야하는 경우가 있습니다 . 각 커서마다 다른 단어 수를 이동해야 할 때 특히 유용합니다. 그것은 기능을 제공 iy-go-to-char하고 iy-go-to-char-backward당신이 결합 멋지게 사용할 수 있습니다.

확장 지역

iy각 커서 아래에 약간 다른 선이 있고 점 아래에서 인용 된 문자열을 선택하려는 경우 와 비슷한 이유로 실제로 유용합니다 .

맞춤 물건

이것들은 내 구성에서 생략 된 것이지만 유용합니다. 아마 내가 작성하지 않았을 것입니다.

입력 프롬프트
각 커서 아래에 다른 문자열을 넣는 요청에 대한 응답으로 Magnars 에서이 것을 얻었습니다. 코드는 간단하지만 무언가에 바인딩하고 여러 커서에 사용하는 것은 각 위치에 약간 다른 것을 삽입하는 편리한 방법입니다.

(defun prompt-for-insert ()
  (interactive)
  (insert (read-string "Insert: ")))

포인트 증가 번호
이것은 SO 또는 emacswiki에서 나왔습니다. 확실하지 않습니다. 그것은 그 자체로도 유용하며, 또한mc/insert-numbers

(defun my-increment-number-decimal (&optional arg)
  "Increment the number forward from point by 'arg'."
  (interactive "p*")
  (save-excursion
    (save-match-data
      (let (inc-by field-width answer)
        (setq inc-by (if arg arg 1))
        (skip-chars-backward "0123456789")
        (when (re-search-forward "[0-9]+" nil t)
          (setq field-width (- (match-end 0) (match-beginning 0)))
          (setq answer (+ (string-to-number (match-string 0) 10) inc-by))
          (when (< answer 0)
            (setq answer (+ (expt 10 field-width) answer)))
          (replace-match (format (concat "%0" (int-to-string field-width) "d")
                                 answer)))))))

eval-and-replace
이것은 매우 강력하며 실제로 유용한 비트 'n'조각을 가능하게합니다. 커서 뒤에있는 sexp가 무엇인지 평가하고 평가 결과를 삽입합니다.
와 결합 multiple-cursors-numbers예에 삽입 두 가지의 힘, 또는가는 일련의 0 1 2 0 1 2 0 1 2각 행 또는 무언가에 걸쳐. (이 두 가지를 모두 유용하게 사용했습니다) 또는 s.el기본 항목으로 지루한 Java 구성을 작성하는 데 사용하십시오 . 당신은 각각을 작성하고 CONFIG_VALUE_VARIABLE그것을 CONFIG_VALUE_VARIABLE = "configValueVariable"실행 하여 그것을 변환합니다 s-camel-case.

(defun eval-and-replace ()
  (interactive)
  (let ((value (eval (preceding-sexp))))
    (kill-sexp -1)
    (insert (format "%s" value))))

iy-go-to-char는 매우 도움이됩니다. 내가 찾던 것.
Heinrich Hartmann

1
  1. 선택한 항목의 끝 *으로 이동하십시오.
  2. 눌러 C-S-b또는 M-S-b선택한 부분을 얻을 때까지 뒤로를 선택합니다. Shift 왼쪽 화살표도 사용할 수 있습니다.
  3. 그런 다음 하나 이상의 항목을 선택할 때까지 (키가 키보드 키 위에 C->있으면 Shift 키를 누르십시오)를 누르 >십시오.

* 뒤로 선택하는 것이 중요합니다. 그렇지 않으면 첫 번째 선택에서 커서가 잘못된 위치에 놓입니다.

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