2010-04-09 23 views

Trả lời

3
(defun number-region (start end) 
    (interactive "r") 
    (let* ((count 1) 
    (indent-region-function (lambda (start end) 
        (save-excursion 
        (setq end (copy-marker end)) 
        (goto-char start) 
        (while (< (point) end) 
         (or (and (bolp) (eolp)) 
         (insert (format "%d. " count)) 
         (setq count (1+ count))) 
         (forward-line 1)) 
        (move-marker end nil))))) 
    (indent-region start end))) 
10

Cách tôi làm điều này, có thể không tối ưu, là sử dụng tìm kiếm regex và thay thế. Điều này, tất nhiên, yêu cầu bạn có thể xác định một regex để phù hợp với sự bắt đầu của các dòng bạn muốn số trên. Lấy ví dụ của bạn, tôi sẽ sử dụng một regex tìm kiếm như sau:

\([a-z]\) 

lưu ý dấu ngoặc, chúng ta sẽ cần chữ cái đầu tiên sớm. Và một thay thế regex như thế này:

\#. \1 

nơi:

\# là một hình thức đặc biệt mà được thay thế, bởi Emacs, bởi số lượng đúng (mặc dù thấy cảnh báo dưới đây);

. viết dừng; và

\1 viết khoảng trắng và nhóm được chụp.

CẢNH BÁO: Emacs sẽ đánh số các mục của bạn 0, 1, 2, .... Cho đến khi ai đó đăng bài cho chúng tôi biết cách bắt đầu từ 1, tôi luôn chèn phần tử giả 0 vào trước khi chỉnh sửa, sau đó xóa nó.

+2

Nếu bạn sử dụng '\, (1+ \ #). 'Để thay thế sẽ bắt đầu từ một. Bạn có thể sử dụng các biểu thức lisp tùy ý trong các thay thế ngay bây giờ, do đó người ta chỉ nói thay thế bằng 1 cộng với số trận đấu. – Singletoned

+0

Cảm ơn @Singletoned, tôi biết rằng ai đó trên SO sẽ phân loại vấn đề đó cho tôi. –

6

Bạn có thể sử dụng the Emacs Keyboard Macro Counter.

  • Đặt con trỏ một dòng TRÊN danh sách của bạn.

  • Bắt đầu một vĩ mô: F3

  • Chèn giá trị truy cập: C-x C-k C-i. Một 0 sẽ xuất hiện

  • Chèn DOT và một không gian: .

  • Di chuyển con trỏ đến dòng kế tiếp

  • Dừng macro: F4

  • Chọn danh sách của bạn

  • M-x apply-macro-to-region-lines

  • Bạn có thể xóa 0 bạn thêm vào phía trên và thưởng thức :)

LƯU Ý: này sẽ tạo ra một danh sách được đánh số. Nó sẽ không sử dụng chữ cái.

+0

tuyệt vời. Bạn cũng có thể thiết lập bộ đếm bằng cách sử dụng 'C-x C-k C-c' hoặc' bộ đếm-bộ-tính-km'. –

1

Dưới đây là một số mã dễ đọc để làm điều đó; sẽ dễ dàng tùy chỉnh nếu bạn thích tinkering.

Điều này sẽ đánh số khu vực hiện tại (trừ khi nó đã được đánh số) và cũng là dòng cuối cùng liên kết với các khóa M-n. Bạn có thể sử dụng phím chức năng "[F6]" khi cần.

Được sửa đổi để sử dụng chuỗi định dạng để sử dụng. Mặc định là 1. nhưng bạn có thể làm một cái gì đó như% d) để có được một khung thay vì a. và vân vân.

(defun number-region(fmt) 
    (interactive "sFormat : ") 
    (if (or (null fmt) (= 0 (length fmt))) 
     (setf fmt "%d. ")) 
    (save-excursion 
    (save-restriction 
     (narrow-to-region (point) (mark)) 
     (goto-char (point-min)) 
     (let ((num 1)) 
    (while (> (point-max) (point)) 
    (if (null (number-at-point)) 
     (insert (format fmt num))) 
     (incf num) 
     (forward-line)))))) 


(global-set-key "\M-n" 'number-region) 
0

Không phải là một câu trả lời trực tiếp câu hỏi của bạn, nhưng nếu bạn thấy mình thao tác danh sách đánh số thường xuyên, bạn có thể muốn xem xét org-mode. Cụ thể, section on plain lists.

5

Cách đơn giản hơn nhiều là sử dụng lệnh chỉnh sửa hình chữ nhật nâng cao của thư viện CUA. CUA được bao gồm trong Emacs (ít nhất là 23,1, tôi nghĩ rằng đó là trong các phiên bản trước đó), vì vậy không có bất kỳ mã mới để có được.

Bạn có thể sử dụng cua-set-rectangle-mark (ràng buộc với C-Return theo mặc định) để bắt đầu hình chữ nhật, sau đó sử dụng cua-sequence-rectangle để chèn giá trị ngày càng tăng. Nó cũng cho phép bạn kiểm soát định dạng và giá trị bắt đầu, do đó, có rất nhiều tính linh hoạt. CUA được thiết kế chủ yếu để làm cho Emac hoạt động giống như các trình soạn thảo văn bản chuẩn (với C-c cho bản sao, C-v để dán, vv), nhưng nó cũng bao gồm một số phần mềm không liên quan, như chỉnh sửa hình chữ nhật. Đừng hỏi tôi tại sao :). Nếu bạn muốn sử dụng chỉnh sửa hình chữ nhật mà không bật khóa móc CUA (đó là những gì tôi làm), hãy đặt cua-enable-cua-keys thành nil, có thể được thực hiện qua tùy chỉnh.

Các vấn đề liên quan