2011-12-13 25 views

Trả lời

4

Có một cái nhìn ở đây http://vim.wikia.com/wiki/Copy_the_search_results_into_clipboard, phần 'Sao chép các dòng có chứa truy cập tìm kiếm'.

này đã làm việc cho tôi (đăng ký rõ ràng a, yank pattern kết quả vào nó, sao chép vào clipboard):

qaq 
:g/pattern/y A 
:let @+ = @a 

Khi tôi cố gắng :g/pattern/y+ nó chỉ sao chép những dòng đầu tiên.

Phần đó trên liên kết cũng cung cấp chức năng bạn có thể viết để sao chép tất cả các dòng, nhưng nó vẫn giống như quy trình 2 bước (làm /pattern và sau đó gọi hàm): nhưng bạn có thể viết macro của riêng mình/phím tắt để thực hiện cả hai theo thứ tự.

+0

điều này câu trả lời trực tiếp sao chép toàn bộ các dòng có chứa regex. Nhưng trong liên kết được đưa ra ở trên, có một kịch bản có tên CopyMatches chỉ sao chép các phần phù hợp. – squid

1

Hãy thử cách sau. Đầu tiên xác định một hàm để lưu regexps phù hợp của bạn vào danh sách (: Danh sách trợ giúp).

:fun Add(list, item) 
: call add(a:list, a:item) 
: return a:item 
:endfun 

Lưu ý rằng nó cũng trả về mục được thêm vào. Điều này là không cần thiết, nhưng những gì bạn trở lại đây sẽ trở thành văn bản thay thế trong các : thay thế sau đây.

Tiếp theo, tạo danh sách trống.

:let list=[] 

Sau đó chạy regexp của bạn.

:%s/^\S\+/\=Add(list, submatch(0))/ 

Lưu ý rằng thay thế bắt đầu bằng \ = (xem: help phụ thay thế đặc biệt). Kết quả là chúng tôi thay thế biểu thức đối sánh bằng chính nó, nhưng đồng thời nắm bắt kết quả trong danh sách.

Hàm submatch() trả về các phần phù hợp của: thay thế lệnh. submatch (0) trả về toàn bộ trận đấu.

Lưu ý rằng như là một tác dụng phụ đệm được đánh dấu là đã được thay đổi. Nếu bạn đã lưu bộ đệm trước khi bạn thực hiện thay thế thì bạn có thể sửa lỗi này bằng cách nhấn u để hoàn tác hoặc bổ sung '| u 'đến lệnh của bạn. (Nếu bạn đang đi để khôi phục trở lại hoạt động sau đó nó không quan trọng những gì chúng ta trở về từ Add chức năng của chúng tôi.)

Bạn có thể xem các trận đấu của bạn với

:echo list 

hoặc bạn có thể gắn nó vào bộ đệm của bạn với

:$put=list 

Tôi hy vọng điều này sẽ hữu ích.Nó đơn giản một khi bạn biết làm thế nào, nhưng có khá nhiều để tiêu hóa ở đó.

Ồ, tôi gần như đã quên! Bạn có thể thêm các kết quả phù hợp vào khay nhớ tạm với

:let @+ = join(list, '^@') 

Sau đó, các kết quả phù hợp sẽ nằm trong bảng tạm, mỗi kết quả trên một dòng riêng biệt.

^@ đại diện cho một ký tự NUL, và được tạo ra với < C-V > < C-J >, có nghĩa bấm control-V, tiếp theo là kiểm soát-J. (Tại sao bạn phải sử dụng^@ đây là một chủ đề hoàn toàn của riêng mình.)

+0

Câu trả lời hay. Tôi nghĩ bạn có thể làm mà không có danh sách bằng cách thêm trực tiếp vào @ +. Tôi nghi ngờ câu trả lời của bạn sẽ hoạt động tốt hơn trong trường hợp chung, mặc dù – sehe

+0

Có điều đó sẽ làm việc quá, cảm ơn.OP có thể thích rằng, mặc dù lưu trữ các từ trong danh sách cũng cung cấp cho bạn các tùy chọn. – 1983

+0

bạn cũng có thể lưu trữ bảng tạm trong danh sách sau: 'let list = [] // let list = split (@ +, '\ n')' – Reman

2

lẽ bạn có thể tìm thấy một số nguồn cảm hứng trong những điều sau đây:

:saveas %.tmp 

để bắt đầu làm việc trên một bản sao

:v//d 
:exec '%s/^.\{-\}\(' . @/ . '\).*$/\1/g' 

Vì vậy, ví dụ: thực hiện tìm kiếm /word\d trên văn bản sau:

Tincidunt. Proin sagittis2. Curumeur auctor metus không mauris. Nunc condimentum nisl không augue. Donec leo urna, dignissim vitae, porttitor ut, iaculis ngồi amet, sem.

Lớp aptent taciti sociosqu3 litora torquent quảng cáo trên mỗi conubia nostra, mỗi inceptos himenaeos. Suspendisse potenti. Quisque augue metus, hendrerit ngồi amet, commodo vel, scelerisque ut, ante. Khán giả euismod euismod risus. Mauris ut metus ngồi amet mi cursus commodo. Morbi congue mauris ac sapien. Donec justo. Sed congue nunc vel mauris0. Pellentesque vehicula orci id libero. Trong hac habitasse platea dictumst. Nulla sollicitudin, purus1 id elementum dictum, dolor augue hendrerit ante, vel semper metus enim et dolor. Pellentesque molestie9.

sẽ đánh dấu các từ như được hiển thị. Làm

:v//d|exec '%s/^.\{-\}\(' . @/ . '\).*$/\1/g' 

kết quả trong bộ đệm sau:

sagittis2 
sociosqu3 
mauris0 
purus1 
molestie9 
+0

OP nên nhớ rằng bạn chỉ nhận được một kết quả phù hợp trên mỗi dòng điều này. Nếu bạn muốn nhiều kết quả phù hợp trên mỗi dòng, hãy thử ':% s/MYREGEXP/\ r & \ r/g | v // d'. – 1983

1

append tất cả kết quả tìm kiếm để reg X (chữ hoa) cách nhau bởi newline:

:g/^/call setreg('X', matchstr(getline('.'), '^\S\+') . "\n") 

để xóa reg x:

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