2009-02-11 30 views
5

Vấn đề của tôi rất đơn giản. Tôi tìm kiếm một mẫu cụ thể trong một tệp (giả sử nhãn trong tệp Tex)chuyển hướng đến một tập tin tìm kiếm trong Vim

:g/label/# 

nhưng có rất nhiều lần xuất hiện. Vì vậy, tôi muốn chuyển hướng đầu ra này sang một tệp khác để có thể làm việc dễ dàng với nó.

Bạn có mẹo hoặc lệnh mà tôi không biết?

+0

ý nghĩa của # đây là những gì? –

+0

@Aman Jain: Tôi sử dụng # để hiển thị số dòng. –

Trả lời

3

Điều bạn đang làm về cơ bản là 'grep -n label file' từ dòng lệnh. Vì vậy, bạn có thể chạy lệnh đó và> nó vào một tập tin một cách dễ dàng đủ.

Nguồn gốc của 'grep' thậm chí từ cơ bản cùng một nguồn.

+0

Cảm ơn sự giúp đỡ của bạn. Giải pháp của bạn hoạt động hoàn hảo tất nhiên. Nó đơn giản đến mức tôi không tìm thấy nó. –

2

tôi đã nhận được này của net tại một số điểm:

function GoToLine(mainbuffer) 
    let linenumber = expand("<cword>") 
    silent bd! 
    silent execute "buffer" a:mainbuffer 
    silent execute ":"linenumber 
    silent nunmap <Enter> 
endfunction 
command -nargs=1 GoToLine :call GoToLine(<f-args>) 

function GrepToBuffer(pattern) 
    let mainbuffer = bufnr("%") 
    silent %yank g 

    enew 
    silent put! g 
    execute "%!egrep -n" a:pattern "| cut -b1-80 | sed 's/:/ /'" 
    silent 1s/^/\="# Press Enter on a line to view it\n"/ 
    silent :2 

    silent execute "nmap <Enter> 0:silent GoToLine" mainbuffer "<Enter>" 
    " silent nmap <C-G> <C-O>:bd!<Enter> 
endfunction 
command -nargs=+ Grep :call GrepToBuffer(<q-args>) 

Đặt nó trong vimrc của bạn, sau đó: Grep Foo

Yêu cầu chương trình grep bên ngoài để hoạt động đúng.

+0

Tôi không thấy sự khác biệt này chỉ khác như thế nào "/ mẫu n " –

+0

Rất tiếc, đã có một chút để trả lời nhanh. Làm lại câu trả lời của tôi. Hy vọng nó giúp. – tommym

+0

Cảm ơn bạn. Tôi nghĩ điều này sẽ giúp tôi. Nó còn tốt hơn cả những gì tôi hỏi. –

0

(Chỉ cần một ý tưởng - chưa được kiểm tra.)

Bạn có thể xóa tất cả các dòng bằng hình trong đó, ghi vào tập tin khác, và hoàn tác xóa.

:g/label/d 
:w matches 
u 
4
:redir > matches.txt|execute 'g/foo/#'|redir END 

Xem :h :redir, bạn cũng có thể chuyển hướng đến thanh ghi, các biến, clipboard, vv

11

nó không phải là rõ ràng từ các bài bản gốc những gì bạn có nghĩa là bằng cách "làm việc một cách dễ dàng với nó", nhưng nó thường hữu ích để xem và nhanh chóng chuyển giữa tất cả các kết quả phù hợp trong bộ đệm mà không cần "trích xuất" các kết quả phù hợp với một bộ đệm riêng biệt.

vim đã một grep nội bộ được xây dựng trong. Ví dụ của bạn sẽ là một cái gì đó như thế này (trong vim, % biểu thị tập tin hiện tại)

:vimgrep /label/ % 

này sẽ đưa bạn đến sự xuất hiện đầu tiên và báo cáo có bao nhiêu trận đấu có là. Điều tuyệt vời là bạn có thể nhìn vào tất cả các trận đấu được liệt kê bằng cách mở danh sách lỗi QuickFix sử dụng

:cope 

Bây giờ bạn chỉ có thể di chuyển xung quanh và nhấn enter trên một dòng để nhảy đến vị trí chính xác của trận đấu.

Danh sách lỗi nhanh chóng là chính xác cùng một bộ đệm bạn sử dụng nếu bạn chạy thực hiện từ bên trong vim và trình biên dịch của bạn ném lỗi: nó cung cấp cho bạn danh sách các lỗi và vị trí.

Sau khi bạn đã nhảy đến một vị trí được chỉ bằng quickfix, bạn có thể chuyển tiếp và lùi trong danh sách qua :cn:cp. :ccl đóng danh sách lỗi.

Bạn cũng có thể mở rộng "lỗi" danh sách của bạn thông qua :vimgrepa /newpattern/ % hoặc :vimgrepadd

The (tài liệu) caveat là grep nội bộ của vim đó là chậm hơn so với hầu hết các trường grep mẹ đẻ (nhưng bạn làm được nó "miễn phí" trong cửa sổ , ví dụ). Nếu bạn đã cài đặt grep, bạn có thể sử dụng: grep thay vì: vimgrep cho các kết quả tương tự.

trích dẫn :help grep

Vim có hai cách để tìm kiếm trận đấu cho một mô hình : nội bộ và bên ngoài. Lợi thế của grep nội bộ là nó hoạt động trên tất cả các hệ thống và sử dụng các mẫu tìm kiếm Vim mạnh mẽ . An chương trình grep bên ngoài có thể được sử dụng khi Vim grep không làm những gì bạn muốn.

Phương thức nội bộ sẽ chậm hơn, vì tệp được đọc vào bộ nhớ. Các ưu điểm là: - Bộ tách dòng và mã hóa được tự động nhận dạng, như thể một tệp đang được chỉnh sửa. - Sử dụng các mẫu tìm kiếm Vim. Có thể sử dụng các mẫu nhiều dòng. - Khi bổ trợ được bật: các tệp nén và từ xa có thể được tìm kiếm.

Bạn cũng có thể sử dụng danh sách vị trí nếu bạn đã sử dụng danh sách lỗi để xử lý lỗi biên dịch. chỉ cần thêm l (ví location) vào đầu của lệnh grep (:lvimgrep, :lvimgrepa:lgrep, :lgrepa) và sử dụng :lopen:ln:lp:lcl thay vì :c* người.

Đối với các lệnh hơn tham khảo ý kiến ​​

:help grep 
:help quickfix-window 
:help quickfix 
:help quickfix-error-lists 
+0

Cảm ơn câu trả lời của bạn. Những lệnh này cũng đã giúp làm những gì tôi muốn và tôi đã học được một cái gì đó mới. Vâng, vấn đề của tôi là tôi đã sử dụng cùng một nhãn trong một tập tin tex vì vậy tôi cần thiết để tìm thấy sự xuất hiện của nó một cách dễ dàng đó là dễ dàng hơn trong một tập tin mà tôi có thể đặt tất cả. –

+0

Câu trả lời hay nhất. –

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