버퍼에서 두 위치 사이를 전환하는 방법


38

때로는 서로 편집하면서 두 기능을 번갈아 자주 사용합니다. 이러한 상황 C-s <functionname>에서 다른 기능으로 전환 한 다음 이전에 편집했던 정확한 위치를 찾는 것은 지루하고 고통 스럽습니다 .

마커를 설정 한 다음 버퍼의 두 위치간에 쉽게 앞뒤로 이동할 수 있습니까?


3
당신은 잘못하고있다. 수직 분할보기가 있어야 두 기능을 동시에 볼 수 있습니다.
CaptainCodeman

8
OP가 "잘못하고있다"는 것에 동의하지 않습니다. 분할 창이 도움이 되더라도 OP는 두 기능을 편집 할 때 창 사이를 앞뒤로 이동해야합니다. 그 외에도이 질문은 특정 사용 사례보다 더 일반적입니다. OP는 버퍼의 다른 위치로 빠르게 이동할 수 있기를 원합니다. 아래의 많은 답변은 여러 가지 유용한 방법을 제공합니다.
Dan

@ Dan 멋진 사람이고 나는 당신에게 동의하지만 내 대답은 그의 문제를 해결하기위한 것이 아니라 다른 방법이 있음을 지적하기위한 것입니다.
CaptainCodeman

4
아래의 T. Vernon의 대답이 분할 창 대안을 제공하지만 @CaptainCodeman은 괜찮습니다. 내 의견은 게시물의 사전 언어에 대한 일반적인 요청으로 취급하십시오.
Dan

1
@CaptainCodeman 당신은 절대적으로 맞습니다. emacs가 세로 분할보기를 지원한다는 것을 알지 못했습니다. 따라서 세로 분할보기의 사용법을 자세히 설명하는 답변을 수락했습니다.
Vedaad Shakib

답변:


20

이맥스 창

C-x 2동일한 버퍼에 연결된 현재 창 아래에 다른 창 (= 프레임 분할)이 열립니다. 다른 창에 영향을주지 않고 어느 창에서든 점을 이동할 수 있습니다.

을 사용하여 한 창에서 다른 창으로 이동할 수 있습니다 C-x o. 내장 된 windmove 라이브러리는 창 사이를 쉽게 탐색 할 수있는 기능을 제공합니다.

이 방법이 적합하다면 간접 버퍼를 살펴볼 수도 있습니다 .

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


간접 버퍼 사용에 대해 몇 줄을 더 추가해야 할 수도 있습니다. 다른 창을 사용하는 것보다 훨씬 유용합니다 (그리고 조금 더 복잡합니다).
ffevotte

@Francesco 나는 당신이 지금 무엇을 의미하는지 (간접 버퍼에 대한 다른 대답과 함께) 실제로 사용하기 매우 쉬운 옵션입니다. 그것은 내가 생각했던 사용법이 아닙니다 : 간접 버퍼 사용은 다른 창을 사용하는 것을 대체하지 않지만 예를 들어 축소로 뷰를 변경할 수 있습니다. 시간을 찾으면 답변에 몇 마디를 추가하겠습니다.
T. Verron

56

레지스터 :

C-xrSPC달리기 point-to-register
C-xrj달리기jump-to-register

프롬프트가 표시되면 임의의 문자를 입력하여 레지스터를 지정하십시오. 1

북마크 :

C-xrm달리기 bookmark-set
C-xrb달리기bookmark-jump

마크 링 :

C-SPCC-SPC현재 위치를 마크 링으로 밉니다 (활성화하지 않고).
C-uC-SPC마크 링을 띄워 이전 위치로 점프합니다. 이것을 반복해서 사용하여 전체 링을 탐색 할 수 있습니다.

일부 명령 (특히 원래 위치에서 알 수 없거나 임의의 거리로 이동할 수있는 명령)은 자동으로 마크 링으로 밀려 나서 C-uC-SPC나중에 다시 돌아 오는 데 사용할 수 있습니다 . 여기에는가 포함되어 isearch있으므로 C-s어딘가로 이동 한 후 쉽게 다시 건너 뛸 수 있습니다.

교환 포인트 및 마크 :

그리고 Tu Do 의견으로 C-xC-x실행 exchange-point-and-mark은 두 위치 사이를 점프하는 데 매우 유용합니다. 또한 마크 / 영역을 활성화하지만 C-SPC강조 표시를 지우는 데 사용할 수 있습니다 .


1 당신은 elisp에서 레지스터 기능있는 거 복용을 이용, 사용하는 경우 일부 충돌하지 않는, 오히려 문자보다, 이름을 기호를되도록 할 수 있습니다 물론, 당신이하지 않으면 대화 형으로 설정된 레지스터 (와 충돌하지 싶어 할 그).


2
C-x C-x두 위치 사이에서 앞뒤로 이동할 수 있으므로 추가해야합니다 . C-u C-SPC마크 링을 띄우고 다시 실행하면 다른 곳으로 포인트가 이동합니다.
Tu Do

18

필의 답변 외에도 몇 가지 옵션이 더 있습니다.

  • helm-all-mark-rings : 친숙한 인터페이스에서 로컬 및 글로벌 마크 링의 내용을 볼 수 있으므로 항상 원래 위치로 돌아갈 수 있습니다. 로 마크를 누를 수 있습니다 C-SPC C-SPC. 데모:

투구 마크 링

  • helm-semantic-or-imenu : 현재 파일에서 사용 가능한 모든 정의를 나열합니다. 커서가 정의 안에 있으면 형광펜을 활성화 할 때 해당 정의를 미리 선택합니다.

  • sr-speedbar : 각 파일의 정의를 나열하는 파일 브라우저. IDE의 개요 트리와 유사합니다.


9

레지스터와 마커 (모두에 대한 PHILS의 대답과 내 다른, @ 참조 외에 차가워의 마커에 대한 대답), 북마크 , 특히 중 하나 autonamed 또는 일시적 북마크이 도움이 될 수 있습니다. 이러한 특수 책갈피 유형을 사용 하려면 Library Bookmark + 가 필요합니다 .

  • 자동 이름이 지정된 책갈피 는 이름을 지정할 필요가없는 책갈피 입니다. 키를 누르면 생성 및 삭제가 빠릅니다. 동일한 키는 특정 시점에 책갈피를 작성하거나 삭제합니다. 기본적으로이 속성은에 바인딩되어 C-x p RET있지만 물론 모든 키를 사용할 수 있습니다.

  • 자동 이름이 지정된 책갈피는 일반적인 책갈피와 마찬가지로 영구적입니다. 그러나 선택적으로 자동으로 삭제하도록 할 수 있습니다.

  • 임시 책갈피를 만들거나 기존 책갈피를 임시로 만들 수도 있습니다 . 예를 들어 자동 이름이 지정된 책갈피를 임시 자동으로 만들도록 선택할 수 있습니다.

  • 주어진 책갈피 세트 사이 를 빠르게 순환 할 수 있습니다 . 예를 들어, autonamed 북마크 사이의주기에, 명령을 사용 bmkp-next-autonamed-bookmark-repeat하고 bmkp-previous-autonamed-bookmark-repeat(키에 바인딩).

  • 당신은 할 수 있습니다 즐겨 찾기에 위치 강조 가 그들을 발견하기 쉬운, 그래서 다른 방법을.


7

허용 된 답변에 언급 된 간접 버퍼와 관련하여 ...

M-x clone-indirect-buffer현재 버퍼에 대한 간접 버퍼를 만듭니다. 새 버퍼의 이름에 '<2>'가 추가됩니다 (또는 이미 중복 버퍼 이름이있는 경우 더 큰 수). 새 버퍼가 새 창에서 열립니다. 다음을 사용하여 하나의 윈도우로 전환 할 수 있습니다 C-x 0또는 C-x 1.

함께 M-x winner-mode하면 쉽게 두 위치 사이를 전환 할 수 있습니다. C-c <left>/ M-x winner-undoC-c <right>/ M-x winner-redo창 구성간에 전환합니다. 이 경우 구성은 하나의 파일을 보는 두 버퍼의 위치가됩니다.

참고 : winner-undowinner-redo기능은 구성 목록에서 작동합니다. 구성이 변경되면 (예 : 이동 점) 현재 구성이 목록의 헤드가되고 winner-redo유효하지 않습니다.이 경우 winner-undo이전 위치로 돌아갑니다.

OP의 상황에서 이것은 다음과 같은 과정으로 이어진다.

  1. 승자 모드 켜기 M-x winner-mode
  2. 방문 파일 (파일 이름 : File1.txt, 버퍼 이름 : File1.txt)
  3. M-x clone-indirect-buffer (새로운 간접 버퍼 이름 : File1.txt <2>)
  4. 현재 창을 유일한 창으로 설정 C-x 1
  5. 첫 번째 편집 위치를 찾고 변경하십시오.
  6. 원래 버퍼 방문 파일 C-x b로 전환하십시오 (3 단계 이후 다른 버퍼로 전환하지 않은 경우 기본값은 원래 버퍼 임). 그러면 승자가 다시 전환 할 수있는 새로운 구성이 만들어집니다.
  7. 대체 편집 위치를 찾고 변경하십시오.

이전 편집 위치 (창 구성) 로의 전환은 스위치 사이의 창 구성이 변경되는지 여부에 따라 다릅니다.

  • 변경 한 경우 C-c <left>/를 사용하여 전환하십시오 M-x winner-undo.
  • 변화는 사용하여 스위치를하지 않은 경우 C-c <left>/을 M-x winner-undo다시과 C-c <right>/ M-x winner-redo전진을 위해.

변경은 다른 winner-undo또는 이외의 것 winner-redo입니다.


3

당신이 사용하는 경우 evil-mode, Vim은 층은 다음 C-oC-i같은 작동합니다.

evil-jump-backward/ 명령을 실행합니다 forward. C-o점프 목록에서 이전 위치로 이동합니다.이 위치는 자동으로 설정됩니다 (마크는 모션 명령에서 설정 됨). C-i반대로 간다. 우리는 또한 사용할 수 있습니다 TABC-o대신 C-i. 따라서 두 기능을 모두 사용하면 현재 버퍼에서 앞뒤로 이동할 수 있습니다.

이 기능은 크로스 버퍼 싶은 경우에, 체크 아웃 evil-jumpers: http://melpa.org/#/evil-jumper

«
evil-jumper는 Vim의 동작과 더 유사하게 점프리스트의 구현을 대체하는 evil-mode를위한 애드온입니다. 특히, 버퍼 경계를 뛰어 넘고 필요한 경우 데드 버퍼를 다시 활성화합니다. 점프 목록을 파일에 유지하고 세션간에 복원 할 수도 있습니다. »

참고 : 이 위키에서 배웠습니다 .


이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 의견을 남겨주십시오.
Dan

1
D' oh, 그리고 자동 의견에 따르면, 실제로는 답변이 다른 답변에 대한 의견 이 될 것으로 보입니다 . 당신이 의도 한 경우 무슨 일이 조금 확장 할 수 그 자체에 해답이 될 수 있습니다 C-oC-i합니까?
Dan

네가 옳아 ! 끝난.
Ehvince

2

차가워 요 를 사용 하면 mark-ring각 버퍼 의 마커 또는 global-mark-ring( 각 버퍼 에 단일 마커가있는) 마커 사이를 빠르게 탐색 할 수 있습니다 .

다중 명령 C-- C-SPC (버퍼의 경우 mark-ring) 또는 C-- C-x C-SPC( 의 경우 ) 를 사용하여이 작업을 수행합니다 global-mark-ring. 키를 한 번 누른 후에는 일반적인 고드름 사이클링 키 등을 사용하여 링의 마커 사이를 이동합니다.

접두어 인수가없는 동일한 키는 각각 바닐라 이맥스에서 set-mark-command와 같이 마크 ( )를 설정하고 글로벌 마크 ( pop-global-mark)를 팝합니다 .

각 마커의 라인 텍스트는 완료 후보로 사용됩니다. 입력 할 때 미니 버퍼 입력은 후보를 일치하는 항목으로 좁 힙니다 (예 : 하위 문자열 또는 정규식 일치). 일치하는 마커 사이를 빠르게 순환하거나 직접 마커를 방문 할 수 있습니다. C-,사이클링을 위해 정렬 순서 ( )를 변경할 수도 있습니다 .


2

다른 기능을 들여다보고 싶을 때 가장 작지만 종종 유용한 가능성

(setq scroll-preserve-screen-position t)

C-v와 사이를 전환 할 때 정확한 시작 커서 위치로 돌아갑니다 M-v.


1

evil-modeVim 스타일의 마커를 구현 합니다 . ( m)로 마커를 설정 evil-set-marker하고 백틱`( evil-goto-mark)가있는 마크 또는 마크의 라인 '( evil-goto-mark-line)으로 이동할 수 있습니다.

따라서 첫 번째 위치에서 ma"a"를로 만들고 두 번째 위치에서 "b"를 ma만든 다음 'a"a"로 이동 'b하여 "b"로 이동합니다.


1

imenu와 아래 코드 사용

(defvar rimenu-position-pair nil "positions before and after imenu jump")
(add-hook 'imenu-after-jump-hook
          (lambda ()
            (let ((start-point (marker-position (car mark-ring)))
                  (end-point (point)))
              (setq rimenu-position-pair (list start-point end-point)))))

(defun rimenu-jump ()
  "jump to the closest before/after position of latest imenu jump"
  (interactive)
  (when rimenu-position-pair
    (let ((p1 (car rimenu-position-pair))
          (p2 (cadr rimenu-position-pair)))

      ;; jump to the far way point of the rimenu-position-pair
      (if (< (abs (- (point) p1))
             (abs (- (point) p2)))
          (goto-char p2)
          (goto-char p1))
      )))

1

지난 20 년 동안 저는이 두 보석을 사용해 왔습니다.

(defun ska-point-to-register ()
  "Store cursorposition _fast_ in a register. Use ska-jump-to-register
to jump back to the stored position."
  (interactive)
  (point-to-register 8))

(defun ska-jump-to-register ()
  "Switches between current cursorposition and position
that was stored with ska-point-to-register."
  (interactive)
  (let ((tmp (point-marker)))
    (jump-to-register 8)
    (set-register 8 tmp)))

나는 그것들을 C-에 묶는다. 그리고 C-를 각각 더 이상 인식하지 않고 지속적으로 사용합니다.

예, 레지스터와 마커 등은 훨씬 유연하고 강력하지만 여전히 다른 편집자로 전환 할 수없는 작고 빠른 도우미 중 하나입니다.


1
와, 당신은 내가 살아있는 것보다 이것을 더 오랫동안 사용하고 있습니다.
Vedaad Shakib

나는 이것이 Node 또는 Visual Studio Code 세계에서 아직 일어나지 않을 것이라고 생각하지만, 누가 알겠는가 : :-) 젊고 똑똑한 사람들이 여전히 Emacs를 선택하는 것을 보게되어 기쁘다. 아, 그리고 나는 아직 50 세가 아니다 ;-)
Stefan Kamphausen

이것은 굉장합니다. 과도 마크 모드가 활성화 된 상태에서 두 개의 임의의 위치를 ​​전환하는 방법을 찾으려고 노력했으며 문제를 실제로 해결합니다.) 감사합니다.
PlagueHammer

0

편리한 키에 빠르게 바인딩 될 수 있으므로 매크로를 활용할 수도 있습니다.

예를 들어을 사용하여 위치 N으로 점프를 기록하고을 사용하여 <F3> M-g g N <F4>키 F5에 지정합니다 C-x C-k b <F5>. 그런 다음 M 및 F6 위치와 동일하게 수행하십시오. 이제부터 F5와 F6을 교대로 전환하여 N과 M 사이를 이동할 수 있습니다.

심지어 간단한 이후 <F4>실행하는 마지막 매크로 기록 및 <C-u> F4마지막에 다음, 당신은 사용하여 키 바인딩 단계와 단순히 대체 위치를 건너 뛸 수 있습니다 <F4><C-u> F4.


다른 급진적 인 가능성은로 다른 창에서 간접 버퍼를 만드는 것입니다 <C-x> 4 c. 이 버퍼는 내용은 같지만 포인트 위치가 다를 수 있습니다. 이제 <C-x> o일반적인 방법으로 창을 번갈아 가며 바꾸십시오.

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