Cách chuyển đổi qua lại giữa hai vị trí trong bộ đệm


38

Đôi khi tôi thấy mình thường xuyên xen kẽ giữa hai chức năng mà tôi đang chỉnh sửa kết hợp với nhau. Trong những tình huống này, thật tẻ nhạt và đau đớn khi tiếp tục thực hiện C-s <functionname>để chuyển sang chức năng khác và sau đó tìm vị trí chính xác mà tôi đã chỉnh sửa trước đó.

Làm cách nào để đặt điểm đánh dấu và sau đó nhảy qua lại giữa hai vị trí trong bộ đệm một cách dễ dàng?


3
Bạn đang làm sai. Bạn nên có chế độ xem phân chia theo chiều dọc để bạn thấy cả hai chức năng cùng một lúc.
CaptainCodeman

8
Tôi không đồng ý rằng OP đang "làm sai." Mặc dù một cửa sổ phân chia sẽ hữu ích, OP vẫn sẽ cần phải nhảy qua lại giữa các cửa sổ khi chỉnh sửa cả hai chức năng. Bên cạnh đó, câu hỏi còn chung chung hơn trường hợp sử dụng cụ thể: OP muốn có thể nhảy xung quanh các vị trí khác nhau trong một bộ đệm một cách nhanh chóng. Rất nhiều câu trả lời dưới đây đưa ra một số cách hữu ích để làm điều đó.
Dan

@Dan Đó là người đàn ông tuyệt vời, và tôi đồng ý với bạn, nhưng phản ứng của tôi không nhằm giải quyết vấn đề của anh ấy - chỉ để chỉ ra rằng có một cách khác.
CaptainCodeman

4
@CaptainCodeman, điều đó tốt, mặc dù câu trả lời của T. Vernon dưới đây cung cấp giải pháp thay thế cửa sổ phân chia. Vui lòng coi nhận xét của tôi là một yêu cầu chung hơn cho ngôn ngữ chủ động trong bài viết.
Dan

1
@CaptainCodeman Bạn hoàn toàn đúng. Tôi đã không biết rằng emacs hỗ trợ chế độ xem chia dọc. Như vậy, tôi đã chấp nhận câu trả lời chi tiết về việc sử dụng các chế độ xem chia dọc này.
Vedaad Shakib

Câu trả lời:


20

Cửa sổ Emacs

C-x 2sẽ mở một cửa sổ khác (= chia khung) bên dưới cửa sổ hiện tại, được gắn vào cùng bộ đệm. Bạn có thể di chuyển điểm trong một trong hai cửa sổ mà không ảnh hưởng đến cửa sổ khác.

Bạn có thể di chuyển từ cửa sổ này sang cửa sổ khác bằng cách sử dụng C-x o. Việc xây dựng trong windmove thư viện cung cấp một số chức năng mà làm cho điều hướng giữa các cửa sổ dễ dàng hơn.

Nếu phương pháp này phù hợp với bạn, bạn cũng có thể muốn xem xét các bộ đệm gián tiếp .

nhập mô tả hình ảnh ở đây


Có lẽ bạn nên thêm một vài dòng về việc sử dụng bộ đệm gián tiếp: nó thực sự hữu ích hơn (và chỉ phức tạp hơn một chút) so với chỉ sử dụng một cửa sổ khác.
ffevotte

@Francesco Tôi hiểu ý của bạn bây giờ (với câu trả lời khác về bộ đệm gián tiếp), thực sự đó cũng là một tùy chọn rất dễ sử dụng. Đó không phải là cách sử dụng mà tôi có trong đầu: việc sử dụng bộ đệm gián tiếp của tôi không thay thế bằng cách sử dụng một cửa sổ khác, nhưng nó cho phép thay đổi chế độ xem với thu hẹp, chẳng hạn. Tôi sẽ thêm một vài từ vào câu trả lời khi tôi tìm thấy thời gian.
T. Verron

56

Đăng ký:

C-xrSPCchạy point-to-register
C-xrjchạyjump-to-register

Nhập bất kỳ ký tự để chỉ định một thanh ghi khi được nhắc. 1

Dấu trang:

C-xrmchạy bookmark-set
C-xrbchạybookmark-jump

Đánh dấu vòng:

C-SPCC-SPCđẩy vị trí hiện tại đến vòng đánh dấu (không để nó hoạt động).
C-uC-SPCbật vòng đánh dấu, nhảy đến vị trí trước đó. Bạn có thể sử dụng điều này nhiều lần để điều hướng qua toàn bộ vòng.

Lưu ý rằng một số lệnh (đặc biệt là các lệnh có thể di chuyển cho bạn một khoảng cách không xác định hoặc tùy ý từ vị trí ban đầu của bạn) sẽ tự động đẩy đến vòng đánh dấu để bạn có thể sử dụng C-uC-SPCđể quay lại sau đó. Điều này bao gồm isearch, vì vậy sau khi sử dụng C-sđể đi đâu đó, bạn có thể dễ dàng nhảy trở lại.

Điểm trao đổi và đánh dấu:

Và như Tự Do bình luận, C-xC-xchạy exchange-point-and-markrất hữu ích cho việc nhảy giữa hai địa điểm. Nó cũng kích hoạt nhãn / vùng, nhưng bạn có thể sử dụng C-SPCđể xóa phần tô sáng.


1 Nếu bạn đang tận dụng chức năng đăng ký trong elisp, hãy sử dụng một số biểu tượng không xung đột cho tên, thay vì char, để bạn không thể xung đột với các thanh ghi được đặt tương tác (tất nhiên trừ khi bạn muốn làm cái đó).


2
Bạn cũng nên thêm C-x C-x, vì nó có thể nhảy qua lại giữa hai vị trí. C-u C-SPCbật vòng đánh dấu và thực hiện lại sẽ di chuyển điểm khác.
Từ Đô

18

Ngoài câu trả lời của phils, còn có một số tùy chọn khác:

  • helm-all-mark-ring : Nó cho phép bạn xem nội dung của cả hai vòng đánh dấu cục bộ và toàn cầu trong một giao diện thân thiện, vì vậy bạn luôn có thể quay lại vị trí của mình. Bạn có thể đẩy đánh dấu với C-SPC C-SPC. Bản giới thiệu:

vòng helm-all-mark-nhẫn

  • helm-semantic-or-imothy : Liệt kê tất cả các định nghĩa có sẵn trong tệp hiện tại. Nếu con trỏ ở trong một định nghĩa, khi kích hoạt tô sáng chọn trước định nghĩa đó.

  • sr-speedbar : Một trình duyệt tệp liệt kê các định nghĩa của nó trong mỗi tệp. Nó tương tự như cây phác thảo trong IDE.


9

Bên cạnh các thanh ghi và điểm đánh dấu (xem câu trả lời của @ phils về cả hai và khác, câu trả lời của Icicles về điểm đánh dấu), dấu trang , đặc biệt là dấu tự động hoặc dấu tạm thời, có thể hữu ích cho việc này. Bạn cần thư viện Bookmark + cho các loại dấu trang đặc biệt này.

  • Một autonamed bookmark là một trong đó bạn không cần phải tên. Thật nhanh chóng để tạo và xóa: chỉ cần nhấn một phím. Khóa tương tự tạo hoặc xóa một dấu trang tại điểm. (Theo mặc định, điều này bị ràng buộc C-x p RET, nhưng tất nhiên bạn có thể sử dụng bất kỳ khóa nào.)

  • Dấu trang tự động là, giống như dấu trang nói chung, liên tục. Nhưng bạn có thể tùy chọn xóa chúng tự động.

  • Bạn cũng có thể tạo dấu trang tạm thời hoặc tạm thời tạo bất kỳ dấu trang nào. Ví dụ, bạn có thể chọn làm cho dấu trang tự động được tạm thời tự động.

  • Bạn có thể nhanh chóng xoay vòng giữa một bộ dấu trang nhất định. Ví dụ: để xoay vòng giữa các dấu trang được tự động hóa, hãy sử dụng các lệnh bmkp-next-autonamed-bookmark-repeatbmkp-previous-autonamed-bookmark-repeat(ràng buộc chúng với các phím).

  • Bạn có thể đánh dấu các vị trí được đánh dấu theo nhiều cách khác nhau, vì vậy thật dễ dàng để phát hiện ra chúng.


7

Liên quan đến bộ đệm gián tiếp được đề cập trong câu trả lời được chấp nhận ...

M-x clone-indirect-buffersẽ tạo một bộ đệm gián tiếp cho bộ đệm hiện tại. Tên của bộ đệm mới sẽ có '<2>' được thêm vào nó (hoặc số lớn hơn nếu bạn đã có tên bộ đệm trùng lặp). Bộ đệm mới được mở trong một cửa sổ mới. Bạn có thể chuyển trở lại một cửa sổ bằng cách sử dụng C-x 0hoặc C-x 1.

Với M-x winner-modebạn có thể dễ dàng chuyển đổi giữa hai địa điểm. C-c <left>/ M-x winner-undoC-c <right>/ M-x winner-redochuyển đổi giữa các cấu hình cửa sổ. Trong trường hợp này, các cấu hình sẽ là các vị trí trong hai bộ đệm đang xem một tệp.

Lưu ý: winner-undovà các winner-redochức năng hoạt động trên một danh sách các cấu hình. Nếu cấu hình được thay đổi, ví dụ điểm di chuyển, thì cấu hình hiện tại sẽ trở thành đầu danh sách và winner-redokhông hợp lệ, trong trường hợp winner-undonày sẽ đưa trở lại vị trí trước đó.

Đối với tình hình của OP, điều này dẫn đến quá trình sau đây;

  1. Bật chế độ người chiến thắng M-x winner-mode
  2. Truy cập tệp (tên tệp: File1.txt, tên bộ đệm: File1.txt)
  3. M-x clone-indirect-buffer (tên bộ đệm gián tiếp mới: File1.txt <2>)
  4. Biến cửa sổ hiện tại thành cửa sổ duy nhất C-x 1
  5. Tìm vị trí chỉnh sửa đầu tiên, thực hiện thay đổi.
  6. Chuyển sang tập tin truy cập bộ đệm ban đầu, C-x b(mặc định sẽ là bộ đệm ban đầu trừ khi việc chuyển sang bộ đệm khác diễn ra kể từ bước 3). Điều này tạo ra một cấu hình mới cho người chiến thắng để chuyển trở lại.
  7. Tìm vị trí chỉnh sửa thay thế, thực hiện thay đổi.

Việc chuyển sang vị trí chỉnh sửa trước đó (cấu hình cửa sổ) phụ thuộc vào việc thay đổi được thực hiện đối với cấu hình cửa sổ giữa các công tắc;

  • Nếu một thay đổi được thực hiện chuyển đổi bằng cách sử dụng C-c <left>/ M-x winner-undo.
  • Nếu không có thay đổi nào được thực hiện, hãy sử dụng C-c <left>/ M-x winner-undocho lùi và C-c <right>/ M-x winner-redocho chuyển tiếp.

Một sự thay đổi bất cứ điều gì khác hơn là một winner-undohoặc winner-redo.


3

nếu bạn sử dụng evil-mode, lớp vim, C-oC-isẽ hoạt động như nhau.

Họ chạy các lệnh evil-jump-backward/ forward. C-onhảy đến vị trí cũ hơn trong danh sách nhảy, được đặt tự động (các dấu được đặt trên các lệnh chuyển động). C-iđi ngược lại. Chúng tôi cũng có thể sử dụng TABsau một C-othay vì C-i. Vì vậy, sử dụng cả hai chức năng sẽ đưa bạn qua lại trong bộ đệm hiện tại của bạn.

Nếu bạn muốn tính năng này là bộ đệm chéo, hãy xem evil-jumpers: http://melpa.org/#/evil-jumper

«
Evil-jumper là một tiện ích bổ sung cho chế độ tà ác thay thế việc thực hiện danh sách nhảy sao cho nó bắt chước chặt chẽ hơn với hành vi của Vim. Cụ thể, nó sẽ nhảy qua ranh giới bộ đệm và hồi sinh bộ đệm chết nếu cần thiết. Danh sách nhảy cũng có thể được lưu vào một tệp và được khôi phục giữa các phiên. »

Lưu ý: Tôi đã học nó trên wiki này


Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ.
Dan

1
Và, bởi nhận xét tự động đó, tôi thực sự muốn nói rằng câu trả lời có vẻ như được dự định là một nhận xét cho câu trả lời khác. Nếu bạn dự định đây là một câu trả lời theo đúng nghĩa của nó, bạn có thể mở rộng một chút về những gì C-oC-ilàm gì không?
Dan

Bạn đúng ! làm xong.
Ehvince

2

Nếu bạn sử dụng Icicles thì bạn có thể nhanh chóng điều hướng giữa các điểm đánh dấu trong mark-ringmỗi bộ đệm hoặc global-mark-ring(có một điểm đánh dấu trong mỗi bộ đệm).

Bạn làm điều này bằng cách sử dụng đa lệnh C-- C-SPC (cho bộ đệm mark-ring) hoặc C-- C-x C-SPC(cho global-mark-ring). Sau khi nhấn phím một lần, bạn sử dụng các phím đạp Icicles thông thường , v.v., để di chuyển giữa các điểm đánh dấu của vòng.

(Các khóa tương tự không có tiền tố arg đặt dấu ( set-mark-command) và bật dấu toàn cục ( pop-global-mark), tương tự như chúng làm trong vanilla Emacs.)

Văn bản của dòng của mỗi điểm đánh dấu được sử dụng như một ứng cử viên hoàn thành. Khi bạn nhập, đầu vào xe buýt nhỏ của bạn thu hẹp các ứng cử viên cho những người phù hợp (ví dụ: chuỗi con hoặc kết hợp regrec). Bạn có thể nhanh chóng xoay vòng giữa các điểm đánh dấu phù hợp hoặc truy cập trực tiếp vào bất kỳ điểm nào trong số chúng. Bạn thậm chí có thể thay đổi thứ tự sắp xếp ( C-,) để đi xe đạp.


2

Một khả năng tối thiểu nhưng thường hữu ích - khi bạn chỉ muốn xem lén chức năng khác - đang cài đặt

(setq scroll-preserve-screen-position t)

đưa bạn trở lại vị trí con trỏ bắt đầu chính xác của bạn khi chuyển đổi giữa C-vM-v.


1

evil-modethực hiện đánh dấu kiểu Vim . Bạn có thể đặt các điểm đánh dấu bằng ( m, nghĩa là evil-set-marker) và nhảy đến điểm đánh dấu bằng dấu backtick `( evil-goto-mark) hoặc đến dòng của dấu '( evil-goto-mark-line).

Do đó, bạn có thể tạo dấu "a" tại vị trí đầu tiên bằng ma, tạo dấu "b" tại vị trí thứ hai bằng ma, sau đó 'anhảy để đánh dấu "a" và 'bnhảy để đánh dấu "b".


1

sử dụng mã imothy và dưới đây

(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

Trong khoảng 20 năm qua, tôi đã sử dụng hai loại đá quý này:

(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)))

Tôi ràng buộc họ với C-. và C-, tương ứng và sử dụng chúng liên tục mà không nhận ra nó nữa.

Vâng, các thanh ghi và các dấu và như vậy linh hoạt và mạnh mẽ hơn nhiều, nhưng vẫn là một trong những trợ giúp nhỏ, nhanh chóng khiến tôi không thể chuyển sang các biên tập viên khác.


1
Ồ, bạn đã sử dụng cái này lâu hơn tôi còn sống.
Vedaad Shakib

Tôi đoán điều này sẽ không xảy ra trong thế giới Node hoặc Visual Studio Code, nhưng ai biết được ... :-) Vui mừng khi thấy những người trẻ tuổi và thông minh vẫn chọn Emacs. Ồ, và, tôi chưa 50 ;-)
Stefan Kamphausen

Điều này là khá tuyệt vời. Tôi đã cố gắng tìm cách chuyển đổi giữa hai vị trí tùy ý với chế độ đánh dấu tạm thời được bật và điều này giải quyết vấn đề thực sự tốt :) Cảm ơn bạn.
Bệnh dịch hạch

0

Bạn cũng có thể tận dụng các macro, vì chúng có thể nhanh chóng bị ràng buộc với các phím tiện lợi.

Ví dụ: ghi lại một bước nhảy đến vị trí N bằng cách sử dụng <F3> M-g g N <F4>và gán nó cho khóa F5 với C-x C-k b <F5>. Sau đó làm tương tự với vị trí M và F6. Từ giờ bạn có thể chỉ cần thay thế F5 và F6 để nhảy giữa N và M.

Thậm chí đơn giản hơn, vì <F4>thực thi macro được ghi cuối cùng và <C-u> F4tiếp theo là cuối cùng, bạn có thể bỏ qua bước ràng buộc chính và chỉ cần thay thế các vị trí bằng cách sử dụng <F4><C-u> F4.


Một khả năng khá triệt để khác là tạo một bộ đệm gián tiếp trong một cửa sổ khác với <C-x> 4 c. Bộ đệm này có cùng nội dung nhưng có thể có vị trí điểm khác nhau. Bây giờ chỉ cần xen kẽ giữa các cửa sổ với <C-x> ocách thông thường.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.