Sao chép vùng từ emacs mà không có dòng mới


7

Tôi muốn có thể dễ dàng chọn một vùng văn bản từ Emacs và sau đó dán nó vào một ứng dụng hoặc trình duyệt khác - với tất cả các dòng mới bổ sung đoạn văn được loại bỏ để hiển thị đoạn văn trong ứng dụng khác có thể hoạt động chính xác.

Các unfill-regionchức năng trong unfillgói có vẻ tốt cho việc này, nhưng cần thêm công việc để tự động hóa việc này đúng cách. Trước khi tôi làm điều đó, điều này đã tồn tại?

Câu trả lời:


6

Tôi sử dụng như sau:

(defun my-copy-simple (beg end)
  "Save the current region to the kill ring after stripping extra whitespace and new lines"
  (interactive "r")
  (copy-region-as-kill beg end)
  (with-temp-buffer 
    (yank)
    (goto-char 0)
    (while (looking-at "[ \t\n]")
      (delete-char 1))
    (compact-uncompact-block)
    (mark-whole-buffer)
    (kill-region (point-min) (point-max))))

Điều này phụ thuộc vào chức năng sau, mà tôi đã sử dụng trong một thời gian để thay thế cho mặc định M-q fill-paragraph. Tôi không lưu ý nó đến từ đâu, tôi nghĩ đó là của Xah Lee?

(defun compact-uncompact-block ()
  "Remove or add line ending chars on current paragraph.
This command is similar to a toggle of `fill-paragraph'.
When there is a text selection, act on the region."
  (interactive)

  ;; This command symbol has a property “'stateIsCompact-p”.
  (let (currentStateIsCompact (bigFillColumnVal 4333999) (deactivate-mark nil))

    (save-excursion
      ;; Determine whether the text is currently compact.
      (setq currentStateIsCompact
            (if (eq last-command this-command)
                (get this-command 'stateIsCompact-p)
              (if (> (- (line-end-position) (line-beginning-position)) fill-column) t nil) ) )

      (if (region-active-p)
          (if currentStateIsCompact
              (fill-region (region-beginning) (region-end))
            (let ((fill-column bigFillColumnVal))
              (fill-region (region-beginning) (region-end))) )
        (if currentStateIsCompact
            (fill-paragraph nil)
          (let ((fill-column bigFillColumnVal))
            (fill-paragraph nil)) ) )

      (put this-command 'stateIsCompact-p (if currentStateIsCompact nil t)) ) ) )

2
tôi nghĩ rằng các bộ phận có thể được cải thiện. xem gist.github.com/xahlee/d364cbbff9b3abd12d29 không thực sự cần khối compact-unactact-block kể từ khi nó chuyển đổi.
Xah Lee

Cảm ơn vì điều này, Tyler và @XahLee. Trông giống như những gì tôi cần.
jmay

1
@xahless nó không cần khối compact-unactact, nhưng nếu bạn đã có nó, bạn cũng có thể sử dụng nó. Tôi hầu như không bao giờ nhớ sử dụng bản sao đơn giản của tôi, nhưng bây giờ cub là không thể thiếu!
Tyler

3

Nếu bạn chỉ muốn xóa dòng mới, thì hãy sử dụng replace-regexp-in-stringkết quả của buffer-substringviệc loại bỏ chúng.

Nếu bạn muốn xóa tất cả khoảng trắng thừa (thường là "không đáng kể"), hãy thử chức năng ni-buffer-substring-collapsed-visibletừ thư viện narrow-indirect.el.

Nó trả về nội dung bộ đệm giữa hai vị trí, nhưng với khoảng trắng được thu gọn (khoảng trắng thêm được loại bỏ, bao gồm cả dòng mới).

Và nếu bạn cũng sử dụng thư viện `subr + .el ' thì văn bản vô hình cũng bị xóa.


0

Có một gói được gọi là "unlill.el" cho mục đích này: https://github.com/purcell/unfill

Nó đi kèm với một unfill-toggleunfill-regionlệnh.

Ai đó cũng đã đăng mã để "hủy" một đoạn trên EmacsWiki: https://www.emacswiki.org/emacs/UnfillPar Đoạn

;;; Stefan Monnier <foo at acm.org>. It is the opposite of fill-paragraph    
(defun unfill-paragraph (&optional region)
  "Takes a multi-line paragraph and makes it into a single line of text."
  (interactive (progn (barf-if-buffer-read-only) '(t)))
  (let ((fill-column (point-max))
        ;; This would override `fill-column' if it's an integer.
        (emacs-lisp-docstring-fill-column t))
    (fill-paragraph nil region)))
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.