Emacs에서 비 연속 영역을 선택하는 방법은 무엇입니까?


31

현재 버퍼에서 일부 텍스트를 이미 선택했다고 가정하십시오. 이전의 선택을 유지하면서 다른 텍스트를 선택할 수 있습니까?

추가 : 나는 일부 텍스트가 있다고 가정하는 다음과 같다 :이 기능에 대한 하나의 동기는 다음과 같다 :

paragraph 1 ...

paragraph 2 ...

paragraph 3 ...

paragraph 4 ...

paragraph 5 ...

일부 단락 (예 : 2, 4 및 6)을 제거하고 단락 1 앞에 삽입하고 싶습니다.


1
있다 선택 .
wasamasa

2
multiselect 패키지가 있습니다 : skamphausen.de/cgi-bin/ska/multiselect 빠른 해킹처럼 보입니다.
Tobias

선택하는 크기와 이유에 multiple-cursors따라 솔루션이 제공 될 수 있습니다.
Jordon Biondo

@wasamasa 나는 당신이 제공 한 링크에 주어진 지시를 따랐습니다. 첫 번째 선택 후 메타 키를 유지하면서 두 번째 영역을 선택했습니다. 선택되었지만 두 가지 문제가 있습니다. (1) 복사 또는 삭제가 작동하지 않으므로 두 번째 선택은 실제 선택이 아닌 것 같습니다. (2)이 방법으로는 세 번째 선택을 선택할 수 없습니다.
이름 :

1
Emacs Wiki는 2 차 선택 에 대한 좋은 섹션이 있습니다. 예를 들어 다양한 기능 향상으로 키보드에서 더 유용하게 사용할 수 있습니다.
Drew

답변:


43

당신은 사용할 수 있습니다 append-next-kill(바인딩 C-M-w당신이 위에 삽입 할 텍스트를 축적 기본적으로) paragraph 1:

  1. paragraph 2평소처럼 죽 이십시오.

  2. 그것을 죽이기 전에 표시 paragraph 4하고 누르 C-M-w십시오. 이전으로 이동하려는 모든 단락에 대해이 단계를 반복하십시오 paragraph 1.

완료되면에 누적 된 텍스트를 찍을 수 있습니다 paragraph 1.


5
기본 사항에도 불구하고 항상 배울 새로운 것들이 있습니다! 이 작업을 수행해야 할 때 킬 링을 움직여 많은 키 누름을 낭비하기 때문에 이것은 매우 유용합니다. 좀 더 투표 할 수 있으면 좋겠다 ...
의미있는 사용자 이름

9

마크 링과 결합 된 레지스터를 사용할 수 있습니다. 으로 현재 마크를 푸시 C-<SPC> C-<SPC>하고 나중에로 복구하거나을 통해 C-u C-<SPC>레지스터에 저장 한 다음을 사용하여 나중에 뒤로 이동 합니다.bC-x r <SPC> bC-x r j b

이제 다른 지역을 표시하십시오. C-u C-x r s a표시된 영역을 복사하여 a텍스트 를 등록 하고 삭제합니다. 그런 다음 다음 영역을 표시하고 C-u C-x r + a해당 레지스터에 다른 선택 항목을 추가 a하고 삭제합니다.

그런 다음로 내용을 삽입 할 수 있습니다 C-x r i a.

Emacs 매뉴얼의 "레지스터에 텍스트 저장하기"섹션을 참조하십시오.


5

Emacs-24.4의 새로운 사각형 영역 지원은 실제로이 기능에 필요한 인프라를 도입했습니다 (대부분 사각형 영역 비 연속 영역입니다).

따라서 원하는 기능 만 제공하는 "분할 영역"패키지를 구현할 수 있습니다.

물론 많은 Emacs 명령은 여전히 ​​새로운 인프라 (예 : upcase-region 또는 undo-in-region, query-replace와 같은 명령)를 사용하도록 조정되지 않았으므로 아직 사각형에서 제대로 작동하지 않습니다. (따라서 "분할 영역"에서도 제대로 작동하지는 않지만) 버그는 시간이 지남에 따라 수정되어야 할 버그입니다.


4

browse-kill-ring.el 설치

관심있는 모든 지역을 복사하고 죽이십시오.

다시 삽입을 시작해야 할 지점이 있습니다.

M-x browse-kill-ring RET 버퍼를 열고 커서를 넣습니다.

n덩어리를 이동하려면 입력하십시오 .

RET 원본 / 기타 버퍼의 지점에 청크를 삽입합니다.


3

조작하려는 행을 정규식 일치를 통해 구별 할 수있는 경우 발생 모드 를 사용 하여 새 창에서 볼 수 있습니다. 그런 다음 발생 편집 모드 를 사용하여 원본 버퍼를 사용하여 발생 버퍼에서 변경 한 내용을 반영하여 편집 할 수 있습니다.

예를 들어 다중 커서 모드 와 함께 사용 하면 훌륭하게 작동 합니다 . Occur 버퍼에 나타나도록 선택한 선이 원래 버퍼에 얼마나 멀리 있는지에 관계없이 연속적으로 표시되므로 모두 또는 서브 세트 를 한 번에 활성화 mc/edit-lines하고 편집하십시오. (예, 다중 커서가이 모든 것을 스스로 할 수 있다는 것을 알고 mc/mark-all-like-this있지만 옵션이 있으면 좋습니다.)

복잡한 정규식 검색 및 바꾸기 설정 또는 버퍼의 각 행에서 차례로 실행해야하는 매크로와 같이 작업하려는 행만 볼 경우 더 쉽게 수행 할 수있는 다른 편집 작업 이 방법으로도 수행 할 수 있습니다.


3

이것은 일반적인 질문에 응답하지만 언급 한 유스 케이스 (코드 조각 이동)에는 특별히 응답하지 않습니다.

이맥스는 이제 비 연속 영역 이라고 부르는 것을 가지고 있는데, 이것은 당신이 요구하는 선택입니다. Vanilla Emacs는 사각형 이 아닌 경우를 제외하고 비 연속 영역을 만드는 특별한 방법을 제공하지 않습니다 . 그러나 도서관 구역 은 않습니다.

라이브러리 영역을 사용하면 버퍼에 여러 영역 을 정의 할 수 있습니다 . 영역의리스트는 비 연속 영역이다 . 사용 방법에 따라 여러 지역 으로 생각할 수도 있습니다. 언제든지 여러 구역 목록을 정의 할 수 있으며 각 구역 목록은 서로 다른 구역 변수에 할당되며 서로 전환 할 수 있습니다.

라이브러리 Bookmark + 도 사용하는 경우 영역 목록을 지속적으로 저장하고 이후 Emacs 세션에서 해당 영역을 복원 할 수 있습니다. Bookmark +를 사용하면 임의의 태그를 책갈피에 지정할 수도 있습니다. 즉, 영역 목록에 태그를 지정할 수 있습니다.

주어진 영역 목록의 영역은 일반적으로 동일한 버퍼에 있지만 반드시 그럴 필요는 없습니다. 이 경우 영역 목록이 비 연속 영역보다 일반적입니다. 또한 각 영역은 영역 제한 외에 추가 정보를 포함 할 수 있으며 식별자를 가질 수 있다는 것이 더 일반적입니다.

영역을 만드는 방법에는 여러 가지가 있습니다. 가장 쉬운 방법 중 하나는 사용하는 것입니다 C-x n a. 활성 영역에서 영역을 정의하고 현재 영역 세트에 추가합니다. ( C-x n n( narrow-to-region)도 좁히는 것 외에도이 작업을 수행합니다.)

다음은 여러 영역 (목록)으로 수행 할 수있는 작업입니다.

  • 그것들을 정렬하십시오.
  • 인접 또는 겹치는 영역을 통합 (통합)합니다 (정렬 포함).
  • 그것들을 교차 시키십시오.
  • 버퍼를 목록의 영역으로 좁 힙니다. 좁히는 과정을 반복하십시오. 다중 축소를 참조하십시오 .
  • 목록에서 영역을 활성 영역으로 선택하십시오. 지역 간 순환
  • 그것들을 검색하십시오 (먼저 자동으로 연결됩니다). 이를 위해서는 Isearch + 라이브러리가 필요합니다 .
  • 그것들을 쿼리 대체하십시오.
  • 강조하고 강조 표시를 해제하십시오. (이를 위해서는 라이브러리 하이라이트 또는 라이브러리 가 필요 합니다 facemenu+.el.

Narrow Indirect를 참조하십시오.이 버퍼 를 사용하면 지정된 버퍼의 복제본이고 다른 부분으로 좁혀지는 간접 버퍼 를 만들 수 있습니다 .


2

다른 옵션 : 단락 바꾸기

완벽을 기하기 위해 표시된 영역으로 (순차적으로) 단락 순서를 바꿀 수 있습니다 M-0 M-x transpose-paragraph(제로 인수는 tra-par포인트와 마크가있는 위치, 즉 영역이 시작하고 끝나는 단락 을 교체합니다)!

그건 그렇고 이것은 모든 transpose-.*명령 (-단어, -sexp,-문장, ...)에서 작동하며 많은 상황에서 매우 편리합니다.


2

또 다른 방법은 objed 패키지 를 사용하는 것입니다 (저는 저자입니다). m포인트가 현재 유형의 다음 객체로 자동 이동 된 텍스트 객체를 표시 할 수 있습니다 . 탐색하여 객체를 표시 해제하고 m을 다시 누릅니다. 다음은 스크린 캐스트의 예입니다 (마킹 라인을 표시하지만 단락, defuns ...와 같은 다른 객체에서도 작동 함).

여기에 이미지 설명을 입력하십시오


Melpa에서이 패키지를 설치하려고하면 오류가 발생 package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found합니다.
이름

@Name 패키지 목록을 업데이트해야 할 것 같습니다. 시도한 M-x package-refresh-contents다음 M-x package-install.
clemera

@Name 지금 작동합니까? 더 궁금한 점이 있으면 알려주세요.
clemera

패키지를 설치할 수있었습니다. 잘 작동하는 것 같습니다. 모든 기능을 테스트하지는 않았습니다. 고맙습니다.
이름
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.