Yank một cột văn bản được sao chép từ clipboard


7

Tôi dường như thường muốn sao chép dán nhiều cột, ví dụ: tôi dán một cột

line one
line two
line three

Bây giờ tôi muốn có thể kéo một cột khác đằng sau nó. Giả sử bộ đệm kill của tôi có các mục sau:

added to one
added to two
added to three

Lệnh nào tôi cần phải gọi để có được những điều sau đây:

line one added to one
line two added to two
line three added to three

Cập nhật

Sử dụng chức năng hình chữ nhật của Emacs giúp khá nhiều, nhưng vẫn không tối ưu. Chẳng hạn, nếu sử dụng Emacs trong chế độ đồ họa và bạn đang kéo dài từ các chương trình bên ngoài, tức là sử dụng chức năng Sao chép-dán từ HĐH của bạn, bộ đệm giết không có thông tin meta hình chữ nhật, vì vậy yank hình chữ nhật không hoạt động. Một vấn đề khác là nếu bạn đang có một cột với chiều rộng bên trong khác nhau:

short line                        *
a much larger line which goes on
short line again

Và bạn muốn yank hình chữ nhật, bạn sẽ phải đặt con trỏ của bạn tại vị trí được đánh dấu (*). Mặc dù điều này là tầm thường với ba dòng, nhưng nó có thể khá cồng kềnh để đảm bảo bạn đang đặt con trỏ ở cạnh ngoài cùng của cột đầu tiên.


Tôi không chắc lắm, nhưng tôi nghĩ bạn muốn làm việc với hình chữ nhật .
Dân

Không chắc chắn có một câu trả lời đơn giản cho điều này. Khi văn bản được sao chép vào bảng tạm, mọi thông tin về các cột đã bị mất. Tôi nghĩ rằng bạn có thể sẽ cần phải làm một cái gì đó bên ngoài Emacs, để giữ thông tin "cột" này.
vẽ

Nếu chỉ tôi thành thạo hơn với elisp, tôi hy vọng đây chỉ là một vài dòng, nhưng thực sự mong đợi đây sẽ là một chức năng hiện có
hbogert

Bạn có thể làm điều này với một macro khá dễ dàng. Yank văn bản cột thứ hai của bạn bên dưới văn bản cột đầu tiên. Sau đó ghi lại một macro di chuyển giá trị trên cùng của dữ liệu cột hai vào cuối hàng đầu tiên của cột một dữ liệu, sau đó di chuyển xuống giá trị tiếp theo của dữ liệu cột hai và thực hiện cho đến khi hết dòng.
Jordon Biondo

Câu trả lời:


5

Đây là lệnh một lần bạn có thể sử dụng để kéo từng dòng của lệnh giết hiện tại ở cuối mỗi dòng tiếp theo, bắt đầu từ dòng hiện tại.

(defun yank-append-lines (&optional without-space)
  "Yank each line of the current kill at the end of each subsequent line.

A space will be added between each line unless WITHOUT-SPACE which can
be passed in via a prefix arg."
  (interactive "P")
  (save-excursion
    (let ((lines (split-string (current-kill 0) "\n")))
      (dolist (line lines)
        (goto-char (line-end-position))
        (unless without-space
          (just-one-space))
        (insert line)
        (unless (zerop (forward-line))
          (insert "\n"))))))

Việc thực hiện khá đơn giản. Lấy current-kill, chia nó theo dòng. Sau đó, cho mỗi dòng chia: đi đến cuối dòng chia, chèn một khoảng trắng, chèn một dòng sau đó di chuyển về phía trước một dòng.

Điều này cũng có thể được thực hiện với một macro có thể lặp lại để di chuyển một dòng từ một nơi trong bộ đệm đến cuối một dòng trong một phần khác của bộ đệm.

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.