Làm thế nào để chọn các vùng không tiếp giáp trong Emacs?


31

Giả sử rằng tôi đã chọn một số văn bản trong bộ đệm hiện tại. Có thể chọn một đoạn văn bản khác, trong khi vẫn giữ lựa chọn trước đó (v.v.) không?

Đã thêm : Một động lực cho chức năng này như sau: Giả sử rằng tôi có một số văn bản trông như thế này:

paragraph 1 ...

paragraph 2 ...

paragraph 3 ...

paragraph 4 ...

paragraph 5 ...

Tôi muốn xóa một số đoạn (ví dụ 2, 4 và 6) và chèn chúng trước đoạn 1.



2
Có một gói multiselect: skamphausen.de/cgi-bin/ska/multiselect Trông hơi giống một bản hack nhanh.
Tobias

Tùy thuộc vào kích thước của những gì bạn đang chọn và tại sao, multiple-cursorscó thể cung cấp cho bạn một giải pháp.
Jordon Biondo

@wasamasa Tôi làm theo hướng dẫn được đưa ra trong liên kết bạn cung cấp. Sau lựa chọn đầu tiên, tôi đã chọn khu vực thứ hai giữ phím Meta. Nó đã được chọn, nhưng có hai vấn đề: (1) lựa chọn thứ hai dường như không phải là lựa chọn thực sự, vì sao chép hoặc xóa không hoạt động. (2) không thể chọn lựa chọn thứ ba bằng cách này.
Tên

1
Wiki Emacs có một phần hay về lựa chọn thứ cấp . Các cải tiến khác nhau làm cho nó có thể sử dụng nhiều hơn từ bàn phím, ví dụ.
vẽ

Câu trả lời:


43

Bạn có thể sử dụng append-next-kill(ràng buộc C-M-wtheo mặc định) để tích lũy văn bản bạn muốn chèn ở trên paragraph 1:

  1. Giết paragraph 2như bạn thường làm.

  2. Đánh dấu paragraph 4và nhấn C-M-wtrước khi giết nó. Lặp lại bước này cho tất cả các đoạn bạn muốn di chuyển trước đó paragraph 1.

Khi bạn hoàn thành, bạn có thể kéo văn bản tích lũy trước đó paragraph 1.


5
Ngay cả với những thứ cơ bản, luôn có một số điều mới để học! Điều này khá hữu ích, vì tôi thường lãng phí rất nhiều lần nhấn phím bằng cách di chuyển vòng giết khi tôi cần làm điều này. Ước gì tôi có thể nâng cấp thêm điều này ...
Tên người dùng có ý nghĩa

9

Bạn có thể sử dụng các thanh ghi kết hợp với vòng đánh dấu. Đẩy các dấu hiện tại bằng C-<SPC> C-<SPC>, khôi phục chúng sau này C-u C-<SPC>hoặc lưu chúng trong một thanh ghi, nói b, thông qua C-x r <SPC> bvà nhảy lại sau với C-x r j b.

Bây giờ đánh dấu một khu vực khác. C-u C-x r s asẽ sao chép vùng được đánh dấu để đăng ký avà xóa văn bản. Sau đó đánh dấu khu vực tiếp theo và C-u C-x r + asẽ thêm một lựa chọn khác vào đăng ký đó avà xóa nó.

Sau đó bạn có thể chèn nội dung với C-x r i a.

Xem phần "Lưu văn bản trong sổ đăng ký" trong hướng dẫn sử dụng Emacs.


5

Hỗ trợ khu vực hình chữ nhật mới trong Emacs-24.4 thực sự đã giới thiệu (một phần lớn) cơ sở hạ tầng cần thiết cho chức năng này [xét cho cùng, một khu vực hình chữ nhật một khu vực không tiếp giáp].

Vì vậy, bây giờ có thể thực hiện gói "chia vùng" chỉ cung cấp chức năng bạn yêu cầu.

Phải thừa nhận rằng, rất nhiều lệnh Emacs vẫn chưa được điều chỉnh để sử dụng cơ sở hạ tầng mới (ví dụ: các lệnh như vùng chữ hoa hoặc vùng trong vùng, thay thế truy vấn, ...) và do đó chưa hoạt động chính xác trên hình chữ nhật (vì vậy chúng cũng không hoạt động chính xác trên "vùng phân chia"), nhưng đây là những lỗi có thể được sửa chữa theo thời gian.


4

Cài đặt duyệt-kill-ring.el

sao chép và giết tất cả các khu vực quan tâm.

Đã đến điểm mà chèn lại nên bắt đầu.

M-x browse-kill-ring RET sẽ mở một bộ đệm và đặt con trỏ vào đó.

nđể chunk du lịch.

RET sẽ chèn chunk tại điểm trong bộ đệm gốc / khác.


3

Nếu các dòng bạn muốn thao tác có thể được phân biệt thông qua một trận đấu regex, bạn có thể sử dụng chế độ xảy ra để xem chúng trong một cửa sổ mới. Sau đó, bạn có thể sử dụng chế độ-chỉnh sửa xảy ra để chỉnh sửa chúng, với bộ đệm ban đầu phản ánh những thay đổi bạn thực hiện trong bộ đệm Xảy ra.

Điều này hoạt động tuyệt vời, ví dụ, kết hợp với chế độ nhiều con trỏ : bởi vì các dòng bạn đã chọn xuất hiện trong bộ đệm Xảy ra được hiển thị liên tục bất kể chúng ở bao xa trong bộ đệm ban đầu, bạn có thể đánh dấu tất cả chúng hoặc một tập hợp con và sau đó kích hoạt mc/edit-linesvà chỉnh sửa tất cả chúng cùng một lúc. (Vâng, tôi biết rằng nhiều con trỏ có thể tự làm tất cả mc/mark-all-like-this, nhưng thật tuyệt khi có các tùy chọn.)

Bất kỳ thao tác chỉnh sửa nào khác sẽ được thực hiện dễ dàng hơn nếu bạn chỉ nhìn thấy các dòng bạn muốn làm việc, chẳng hạn như thiết lập tìm kiếm và thay thế regex phức tạp hoặc macro cần chạy lần lượt trên từng dòng của bộ đệm, cũng có thể được thực hiện theo cách này.


3

Điều này trả lời cho câu hỏi chung của bạn, nhưng không đặc biệt cho trường hợp sử dụng mà bạn đề cập (di chuyển các đoạn mã xung quanh).

Emacs bây giờ có cái mà nó gọi là một vùng không liền kề , đó là loại lựa chọn mà bạn đang hỏi về. Vanilla Emacs không cung cấp bất kỳ cách đặc biệt nào để tạo một vùng không liền kề, ngoại trừ nếu đó là một hình chữ nhật . Nhưng thư viện Zones thì có.

Khu vực thư viện cho phép bạn xác định nhiều vùng trong bộ đệm của mình. Một danh sách các khu vực là một khu vực không liên tục . Bạn cũng có thể nghĩ về nó như nhiều vùng, tùy thuộc vào cách bạn muốn sử dụng nó. Bạn có thể có nhiều danh sách vùng được xác định bất cứ lúc nào, mỗi danh sách được gán cho một biến vùng khác nhau và bạn có thể chuyển đổi giữa chúng.

Nếu bạn cũng sử dụng thư viện Bookmark + thì bạn có thể lưu danh sách các vùng liên tục và khôi phục chúng trong các phiên Emacs sau này. Bookmark + cũng cho phép bạn gán các thẻ tùy ý cho một dấu trang. Điều này có nghĩa là bạn có thể gắn thẻ danh sách các vùng.

Các vùng trong danh sách vùng đã cho thường nằm trong cùng một vùng đệm, nhưng chúng không cần. Trong đó, một danh sách khu vực là tổng quát hơn một khu vực không liên tục. Nó cũng chung chung hơn ở mỗi khu vực có thể chứa thông tin bổ sung, ngoài các giới hạn khu vực và nó có thể có một định danh.

Có một số cách để tạo ra một khu vực. Một trong những cách dễ nhất là sử dụng C-x n a: nó xác định một vùng từ vùng hoạt động và thêm nó vào vùng hiện tại. ( C-x n n( narrow-to-region) cũng làm điều này, ngoài việc thu hẹp.)

Đây là một số điều bạn có thể làm với một tập hợp (danh sách) các vùng:

  • Sắp xếp chúng.
  • Liên kết (kết hợp) các khu vực liền kề hoặc chồng chéo (bao gồm sắp xếp chúng).
  • Giao nhau với họ.
  • Thu hẹp bộ đệm vào một vùng trong danh sách. Chu kỳ giữa các hẹp. Xem nhiều thu hẹp .
  • Chọn một vùng trong danh sách là vùng hoạt động. Chu kỳ giữa các vùng.
  • Tìm kiếm chúng (chúng được tự động thống nhất trước). Đối với điều này, bạn cần thư viện Isearch + .
  • Truy vấn thay thế chúng.
  • Làm nổi bật và làm nổi bật chúng. (Đối với điều này, bạn cần thư viện Nổi bật hoặc thư viện facemenu+.el.

Xem thêm Thu hẹp gián tiếp , cho phép bạn tạo bộ đệm gián tiếp là bản sao của một bộ đệm nhất định và được thu hẹp thành các phần khác nhau của nó.


2

Một lựa chọn khác: Chuyển đoạn

Để hoàn thiện, bạn có thể đạt được sự sắp xếp lại các đoạn văn (theo tuần tự) với các vùng được đánh dấu và M-0 M-x transpose-paragraph(đối số 0 làm cho tra-parhoán đổi các đoạn có điểm và dấu nằm trong đó, tức là vùng bắt đầu và kết thúc)!

Bằng cách này, nó hoạt động cho tất cả transpose-.*các lệnh (-words, -sexp, -sentences, ...) và cực kỳ tiện dụng trong nhiều tình huống.


2

Một cách khác là sử dụng gói objed (Tôi là tác giả). Bạn có thể tự động đánh dấu bất kỳ đối tượng văn bản nào với mđiểm được di chuyển sang đối tượng tiếp theo của loại hiện tại. Bỏ đánh dấu bất kỳ đối tượng nào bằng cách điều hướng đến nó và nhấn m lần nữa. Dưới đây là một ví dụ screencast (hiển thị các dòng đánh dấu nhưng cũng hoạt động cho các đối tượng khác như đoạn văn, defun ...):

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


Khi tôi cố gắng cài đặt gói này từ Melpa, tôi gặp lỗi package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found.
Tên

@ Tên Nghe có vẻ như cần cập nhật danh sách gói của bạn. Hãy thử M-x package-refresh-contentsvà sau đó M-x package-install.
clemera

@Name Nó có hoạt động bây giờ không? Hãy cho tôi biết nếu bạn có thêm câu hỏi.
clemera

Tôi đã có thể cài đặt gói. Có vẻ như hoạt động tốt, tôi chưa thử nghiệm tất cả các tính năng của nó. Cảm ơn bạn.
Tên
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.