2011-12-30 40 views
10

Hãy nói rằng tôi có tập tin văn bản này lập bảng:cách thu gọn khoảng trắng trong một khu vực?

field1  variable_length_field variable_length_field 
aaaaaa  aaaa      aaaaaaaaa 
bbbbbb  bbbbbbbbbbbbbbbbbbbb  bbbb 

Làm thế nào tôi có thể chuyển đổi nó để:

field1 variable_length_field variable_length_field 
aaaaaa aaaa aaaaaaaaa 
bbbbbb bbbbbbbbbbbbbbbbbbbb bbbb 

Tôi biết tôi có thể sử dụng replace-regexp trên khu vực, nhưng Emacs regexps không đến một cách tự nhiên . Tôi đang tìm kiếm một cái gì đó như delete-whitespace-rectangle, nhưng điều đó không làm những gì tôi mong đợi, hoặc tôi đang lạm dụng nó. Có khả năng để làm điều này mỗi cột sẽ được mong muốn quá, ví dụ:

field1  variable_length_field variable_length_field 
aaaaaa  aaaa aaaaaaaaa 
bbbbbb  bbbbbbbbbbbbbbbbbbbb bbbb 
+0

Trường hợp _rectangle_ xuất hiện ở đâu? – sarnold

+0

Có hai hình chữ nhật ở đó có thể được thu gọn xuống một cột, nhưng việc tìm chúng đòi hỏi phải quét - giả sử rằng các trường dữ liệu không có chiều rộng cố định. – seh

+0

Bạn đề cập rằng tệp được "lập bảng", mà tôi lấy để có nghĩa là không phải khoảng trống tách biệt là các ký tự tab, mà đúng hơn là các trường được căn trái. Có phải trường hợp không có trường nào có thể chứa khoảng trắng? – seh

Trả lời

13

Chức năng này nên làm như lừa:

(defun just-one-space-in-region (beg end) 
    "replace all whitespace in the region with single spaces" 
    (interactive "r") 
    (save-excursion 
    (save-restriction 
     (narrow-to-region beg end) 
     (goto-char (point-min)) 
     (while (re-search-forward "\\s-+" nil t) 
     (replace-match " "))))) 

Và, kể từ khi câu hỏi đã được cập nhật để áp dụng cho các không gian trong một hình chữ nhật, hãy thử điều này:

(require 'rect) 
(defun just-one-space-in-rect-line (start end) 
    (save-restriction 
    (save-match-data 
     (narrow-to-region (+ (point) start) 
         (+ (point) end)) 
     (while (re-search-forward "\\s-+" nil t) 
     (replace-match " "))))) 
(defun just-one-space-in-rect (start end) 
    "replace all whitespace in the rectangle with single spaces" 
    (interactive "r") 
    (apply-on-rectangle 'just-one-space-in-rect-line start end)) 
+0

Điều đó gần như hoàn hảo. Điều này làm việc cho toàn bộ khu vực chứ không phải hình chữ nhật, câu hỏi được làm rõ. – user525602

+1

phiên bản thứ hai là hoàn hảo! Tôi đã cố gắng tìm hiểu làm thế nào để sử dụng hình chữ nhật trong elisp ngày hôm qua để giải quyết điều này nhưng không thể làm cho nó đúng. Đây là một ví dụ tuyệt vời để học hỏi. Cảm ơn! – user525602

0

Bạn đang sử dụng IDE? Nếu bạn đang sử dụng một cái gì đó giống như Eclipse, thì bạn có thể định dạng các tùy chọn khoảng trống trong nó. (Trong Eclipse, nhấn CTRL + 3 và tìm kiếm 'formatter'. Tôi xin lỗi vì không nhớ đường dẫn chính xác!) Sau đó, bạn sẽ có thể làm nổi bật mọi thứ và nhấn ctrl + shift + G để tự động định dạng mọi thứ.

Hãy cho chúng tôi biết nếu điều đó có ích! (Hoặc, nếu bạn muốn mã spinup sẽ thực hiện việc này, hãy cho chúng tôi biết ngôn ngữ.)

+1

"Emacs" được liệt kê trong cả thẻ _and_ body của câu hỏi. :) – sarnold

+0

Xin lỗi về điều đó, vẫn còn mới! Chúc may mắn. – Salmontres

3

Bạn có thể xử lý các yêu cầu hình chữ nhật của mình bằng các tiện ích chỉnh sửa hình chữ nhật của chế độ cua *.

  1. M-xcua-selection-modeRET hay (cua-selection-mode 1)
    (bản thân mình, tôi đã này được kích hoạt vĩnh viễn).

  2. Đánh dấu hình chữ nhật mà bạn muốn thu gọn khoảng trắng, sử dụng C-RET và các phím di chuyển thông thường.

  3. Gọi cua-replace-in-rectangle:
    M-r\s-+RETSPCRET

  4. C-RET một lần nữa để kết thúc chỉnh sửa hình chữ nhật.

(*) Điều này sẽ không hoạt động nếu bạn cần các lĩnh vực bên phải của hình chữ nhật để vẫn thẳng hàng, như trong trường hợp đó bạn sẽ cần phải chèn dấu cách mới để bù đắp cho những cái đó đã được gỡ bỏ. Bạn có thể sử dụng 2C-split2C-merge hoặc chỉ cần giết/yank hình chữ nhật bên phải để làm việc xung quanh điều đó.

+0

Tôi vừa mới đến câu trả lời này. Bạn có thể giải thích tại sao '\ s- +' khớp với bất kỳ số lượng khoảng trắng nào không? Tôi hiểu rằng '\ s' là một dấu cách và' + 'có nghĩa là một hoặc nhiều, nhưng tại sao ký hiệu' -'? –

+2

Không, '\ s' không có nghĩa là một dấu cách (n.b. không phải tất cả các ngôn ngữ regex đều giống nhau!). Trong Emacs, '\ s' có nghĩa là ký tự của cú pháp * được chỉ định bởi ký tự tiếp theo. Mã '-' là dành cho lớp cú pháp khoảng trắng. Bạn cũng có thể sử dụng dấu cách thay vì dấu gạch nối, nhưng dấu gạch ngang có thể đọc được nhiều hơn. Xem 'C-h i g (elisp) Regexp Backslash RET' và sau đó tìm kiếm trong trang cho' \ sCODE' – phils

9

Không thực sự trả lời câu hỏi của bạn nhưng có

M-SPC runs the command just-one-space, which is an interactive 
compiled Lisp function in `simple.el'. 

It is bound to M-SPC. 

(just-one-space &optional N) 

Delete all spaces and tabs around point, leaving one space (or N spaces). 

[back] 

đó là hữu ích khi bạn muốn xóa khoảng trắng trong một off trường hợp. Nó có thể phù hợp cho một trường hợp macro, nơi xóa được ở các dòng ngẫu nhiên không có mẫu cố định.

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