2012-01-01 35 views
5

Trong VIM, bạn có thể tìm kiếm một chuỗi được chỉ định. Sau đó, bạn có thể nhấn n hoặc N để điều hướng trận đấu tiếp theo hoặc trước đó. Khi bạn nhấn n hoặc N, con trỏ sẽ được di chuyển đến văn bản phù hợp. Câu hỏi của tôi là, làm thế nào để nhanh chóng sao chép văn bản phù hợp dưới con trỏ?Tìm kiếm gia tăng VIM, cách sao chép chuỗi phù hợp dưới con trỏ?


Edit:

Những gì tôi cần là các trận đấu hiện nay dưới con trỏ, không phải tất cả các trận đấu trong tài liệu.

Cảm ơn,

+0

Bạn cũng có thể quan tâm đến câu hỏi "[Xóa mẫu tìm kiếm phù hợp trong VIM] (http://stackoverflow.com/q/7842333/254635)". –

+0

[Mục này] (http://vim.wikia.com/wiki/Copy_the_search_results_into_clipboard) trong Vim Tips FAQ bao gồm chủ đề này. – eckes

Trả lời

3

Người ta có thể viết một hàm trích xuất kết quả của mẫu tìm kiếm cuối cùng xung quanh con trỏ và tạo ánh xạ để gọi nó.

nnoremap <silent> <leader>y :call setreg('"', MatchAround(@/), 'c')<cr> 
function! MatchAround(pat) 
    let [sl, sc] = searchpos(a:pat, 'bcnW') 
    let [el, ec] = searchpos(a:pat, 'cenW') 
    let t = map(getline(sl ? sl : -1, el), 'v:val."\n"') 
    if len(t) > 0 
     let t[0] = t[0][sc-1:] 
     let ec -= len(t) == 1 ? sc-1 : 0 
     let t[-1] = t[-1][:matchend(t[-1], '.', ec-1)-1] 
    end 
    return join(t, '') 
endfunction 

Chức năng trên xác định thời gian bắt đầu và vị trí kết thúc của trận đấu và cẩn thận sẽ đưa ra các văn bản phù hợp, chính xác xử lý multiline mẫu và ký tự nhiều byte.

Tùy chọn khác là tạo ánh xạ đối tượng văn bản (xem :help text-object) cho hoạt động trên mẫu tìm kiếm cuối cùng khớp với con trỏ.

vnoremap <silent> i/ :<c-u>call SelectMatch()<cr> 
onoremap <silent> i/ :call SelectMatch()<cr> 
function! SelectMatch() 
    if search(@/, 'bcW') 
     norm! v 
     call search(@/, 'ceW') 
    else 
     norm! gv 
    endif 
endfunction 

Để sao chép khớp hiện tại bằng cách sử dụng các ánh xạ này, hãy sử dụng yi/. Đối với các đối tượng khác, ví dụ: đối tượng, bạn cũng có thể chọn bằng cách sử dụng vi/, hoặc xóa bằng cách sử dụng di/.

+0

Lưu ý rằng hàm ở trên xử lý chính xác các đối sánh một ký tự hoặc nhiều dòng. –

+1

Tôi khuyên bạn nên sử dụng 'v: register' trong ánh xạ:' nnoremap y ': let @'. V: register. '= MatchAroundCursor (@ /) ' ' – Benoit

+0

Cảm ơn ib. Tôi đã dán chức năng của bạn vào .vimrc của tôi. Làm thế nào để gọi cho họ? Tôi là một newbie trên VIM. Cảm ơn. –

0

Nhấn y và các văn bản dưới con trỏ sẽ được sao chép vào sổ đăng ký mặc định unamed, sau đó bạn có thể nhấn p để dán.

6

Bạn muốn thực hiện như sau

y//e 

Tổng quan:

Ý tưởng cơ bản là sau khi bạn tìm kiếm hoặc nhấn n hoặc N con trỏ sẽ nằm ở đầu văn bản phù hợp. Sau đó, bạn đã kết thúc tìm kiếm cuối cùng.

Giải thích

  • y sẽ yank từ vị trí hiện tại thông qua các chuyển động sau đây
  • // tìm kiếm bằng cách sử dụng mô hình tìm kiếm cuối cùng.
  • //e Các e cờ sẽ đặt con trỏ vào cuối của văn bản phù hợp

Như một lời cảnh báo này sẽ thay đổi mô hình tìm kiếm hiện tại, bởi vì nó cho biết thêm các /e cờ. Do đó, theo dõi n và/hoặc N sẽ di chuyển con trỏ đến cuối trận đấu.

Điều này rất giống với post sau đây.

+3

đây là badass. –

+0

Ngoài những bất lợi gây phiền nhiễu của việc thay đổi cờ, cách tiếp cận này không * hoạt động như dự định nếu trận đấu hiện tại chỉ dài một ký tự! –

0

Tôi đoán đây nên làm điều đó:

command! -register CopyExactMatchUnderCursor call s:CopyExactMatchUnderCursor('<reg>') 

function! s:CopyExactMatchUnderCursor(reg) 
    let cpos = getpos('.') 
    let line = cpos[1] 
    let idx = cpos[2] - 1 
    let txt = getline(line) 

    let mend = matchend(txt, @/, idx) 

    if mend > idx 
     let sel = strpart(txt, idx, mend - idx) 

     let reg = empty(a:reg) ? '"' : a:reg 
     execute 'let @' . reg . ' = sel . "\n"' 
    end 
endfunction 

Nó lấy vị trí con trỏ đầu tiên với getpos sau đó tìm kiếm kết thúc trận đấu (bắt đầu với cột nơi con trỏ đang sử dụng matchend) và sau đó trả về chuỗi con trong thanh ghi được cung cấp - theo mặc định " được sử dụng.

Tất cả các phương pháp cần thiết về cơ bản đều nằm trong câu trả lời @eckes.

+0

Hàm trên không giải quyết được vấn đề nói chung: nó không có nghĩa gì nếu khớp hiện tại kéo dài trên nhiều dòng. –

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