2010-10-13 25 views
34

Bất cứ ai cũng biết cách nhanh chóng tìm thấy sự xuất hiện tiếp theo của một ký tự (như lệnh f) nhưng đa dòng? I E. để nhanh chóng chuyển sang lần xuất hiện tiếp theo của một số ký tự trong một tệp?Sử dụng lệnh f của vim qua nhiều dòng

+1

Tôi [tóm tắt một số lựa chọn thay thế tại đây] (http://vi.stackexchange.com/questions/4486/expand-f-and-t-motion-to-next-lines#4525), bao gồm một tài liệu tôi đã viết trong đó * nhấp nháy * trên màn hình! – joeytwiddle

Trả lời

35

Đó không phải là những gì "/" không?

Nếu bạn đang tìm kiếm "x" tiếp theo, hãy thực hiện/x trong khi ở chế độ lệnh.

Sau đó, bạn có thể nhấn "n" để tiến tới x tiếp theo, và sau đó dấu x bên cạnh vv

Có rất nhiều vim cheat sheets ra khỏi đó với tất cả các loại lời khuyên.

+0

Cảm ơn! Tôi thực sự biết/và đã tự hỏi nếu bạn biết một cách nhanh hơn (xin lỗi tôi đã không nói rằng trong câu hỏi ban đầu). Thay vì gõ/và sau đó cần gõ thì có cách nào để thực hiện điều đó không? Cảm ơn! – Koko

+4

hmm ... "fx" là hai lần nhấn phím. nhấn "/ x " là ba lần nhấn phím. sau trận đấu đầu tiên, bạn có thể tiến tới các lần truy cập tiếp theo bằng một lần nhấn phím nữa trong cả hai trường hợp. những người bên cạnh một người dùng vi (m) có thể khó chịu với sự kém hiệu quả như vậy :) Bạn có luôn tìm kiếm cùng một nhân vật hoặc loại nhân vật không? Nếu vậy có thể có giải pháp cho bạn, đặc biệt nếu nó liên quan đến lập trình, như "di chuyển đến dấu ngoặc nhọn tiếp theo" –

+0

@Koko - câu trả lời là, vâng, có một ký tự để tìm lần xuất hiện tiếp theo, chữ 'n' . Và đó là bao gồm trong câu trả lời. – KevinDTimm

12

Có ví dụ về việc xác định lại f để bỏ qua trường hợp trong tệp trợ giúp 'eval.txt'.

:h eval.txt 

(tìm kiếm cho "bỏ qua trường hợp" một vài lần)

Chúng tôi có thể thay đổi đó để làm những gì bạn muốn. Thêm hàm sau vào tệp ~/.vimrc của bạn hoặc tốt hơn, tạo tệp plugin: ~/.vim/plugin/find-char.vim (tạo các thư mục nếu bạn chưa có chúng).

function FindChar() 
    let c = nr2char(getchar()) 
    let match = search('\V' . c) 
endfunction 

Sau đó, trong ~/.vimrc bạn thêm dòng sau:

nmap f :call FindChar()<CR> 

Bây giờ, f nên làm việc như bạn muốn nó.

BTW, điều này đã được thử nghiệm với Vim 7,2 trên Ubuntu 10.04.

+1

điều này sẽ không hoạt động nếu bạn đang tìm kiếm '$', '\', '^' hoặc '/' trong số những thứ khác (cũng có thể dấu sao, dấu hỏi, vv. Bạn có thể 'cho lệnh = "bình thường!/\ V" c. "^ M" '. Vẫn còn điều này sẽ không làm việc cho dấu gạch chéo ngược. – Benoit

+2

@Benoit: Ahh, các nhân vật đặc biệt, tôi nên biết rõ hơn. Tôi đã cập nhật phản hồi. –

+1

Bạn có thể bỏ qua câu lệnh if nếu bạn chỉ cần thêm vào mỗi mẫu tìm kiếm với '\ V' - hàm FindChar() để c = nr2char (getchar()) cho phép match = search ('\ V'. C) endfunction –

1

Bạn có thể tạo ra một bản đồ để đi đến ký tự tiếp theo dưới con trỏ:

:map f yl/\V<c-r>"<c-m> 

các \ V sẽ đảm bảo những biểu tượng được kết hợp theo nghĩa đen.

Ngoài ra, bạn có thể muốn xem các lệnh *#, đã được xác định cho bạn, mặc dù chúng có thể không phải là thứ bạn muốn.

4

Aaaa, vimscript. Mất khoảng 2 năm để viết 20 dòng tốt: D. Đây là phiên bản mới nhất, đẹp nhất: hoạt động cho TẤT CẢ các chế độ: hình ảnh, toán tử đang chờ xử lý, bình thường.

let prvft='f' 
let prvftc=32 
fun! MLvF(c,...) 
    let [g:prvftc,g:prvft]=[a:c,a:0? 'f':'F'] 
    let pos=searchpos('\C\V'.nr2char(g:prvftc),'bW') 
    call setpos("'x", pos==[0,0]? [0,line('.'),col('.'),0] : [0,pos[0],pos[1],0]) 
    return "`x" 
endfun 
fun! MLvf(c,...) 
    let [g:prvftc,g:prvft]=[a:c,a:0? 'F':'f'] 
    let pos=searchpos('\C\V'.nr2char(g:prvftc).(mode(1)=='no'? '\zs' : ''),'W') 
    call setpos("'x", pos==[0,0]? [0,line('.'),col('.'),0] : [0,pos[0],pos[1],0]) 
    return "`x" 
endfun 
fun! MLvT(c,...) 
    let [g:prvftc,g:prvft]=[a:c,a:0? 't':'T'] 
    let pos=searchpos('\C\V'.nr2char(g:prvftc).'\zs','bW') 
    call setpos("'x", pos==[0,0]? [0,line('.'),col('.'),0] : [0,pos[0],pos[1],0]) 
    return "`x" 
endfun 
fun! MLvt(c,...) 
    let [g:prvftc,g:prvft]=[a:c,a:0? 'T':'t'] 
    let pos=searchpos('\C\V\_.'.(mode(1)=='no'? '\zs' : '').nr2char(g:prvftc),'W') 
    call setpos("'x", pos==[0,0]? [0,line('.'),col('.'),0] : [0,pos[0],pos[1],0]) 
    return "`x" 
endfun 
no <expr> F MLvF(getchar()) 
no <expr> f MLvf(getchar()) 
no <expr> T MLvT(getchar()) 
no <expr> t MLvt(getchar()) 
no <expr> ; MLv{prvft}(prvftc) 
no <expr> , MLv{prvft<#'Z'? tolower(prvft) : toupper(prvft)}(prvftc,1) 

Hoặc siêu bị cắt xén:

let [pvft,pvftc]=[1,32] 
fun! Multift(x,c,i) 
    let [g:pvftc,g:pvft]=[a:c,a:i] 
    let pos=searchpos((a:x==2? mode(1)=='no'? '\C\V\_.\zs' : '\C\V\_.' : '\C\V').(a:x==1 && mode(1)=='no' || a:x==-2? nr2char(g:pvftc).'\zs' : nr2char(g:pvftc)),a:x<0? 'bW':'W') 
    call setpos("'x", pos[0]? [0,pos[0],pos[1],0] : [0,line('.'),col('.'),0]) 
    return "`x" 
endfun 
no <expr> F Multift(-1,getchar(),-1) 
no <expr> f Multift(1,getchar(),1) 
no <expr> T Multift(-2,getchar(),-2) 
no <expr> t Multift(2,getchar(),2) 
no <expr> ; Multift(pvft,pvftc,pvft) 
no <expr> , Multift(-pvft,pvftc,pvft) 
6

Có muốn biết chính xác những điều tương tự tôi nhìn qua các câu trả lời ở đây. Không ai trong số đó là chính xác những gì tôi muốn vì vậy tôi cobbled với nhau một vài người trong số họ.

Câu trả lời của q335 là gần nhất vì nó xử lý các phần đệm đúng cách cần thiết để làm điều gì đó như dt} (xóa tất cả mọi thứ, nhưng không bao gồm dấu ngoặc nhọn tiếp theo) nhưng câu trả lời của Curt xử lý tìm kiếm ký tự đặc biệt và sử dụng một hàm duy nhất tôi là thích hợp hơn nhiều vì vậy tôi không thêm quá nhiều cho tôi.vimrc

Dưới đây là kết quả của tôi:

"Makes f and t work across multiple lines 
nmap <silent> f :call FindChar(0, 0, 0)<cr> 
omap <silent> f :call FindChar(0, 1, 0)<cr> 
nmap <silent> F :call FindChar(1, 0, 0)<cr> 
omap <silent> F :call FindChar(1, 1, 0)<cr> 
nmap <silent> t :call FindChar(0, 0, 1)<cr> 
omap <silent> t :call FindChar(0, 0, 0)<cr> 
nmap <silent> T :call FindChar(1, 0, 1)<cr> 
omap <silent> T :call FindChar(1, 0, 0)<cr> 

"Functions 
fun! FindChar(back, inclusive, exclusive) 
    let flag = 'W' 
    if a:back 
    let flag = 'Wb' 
    endif 
    if search('\V' . nr2char(getchar()), flag) 
    if a:inclusive 
     norm! l 
    endif 
    if a:exclusive 
     norm! h 
    endif 
    endif 
endfun 
+0

Dường như hoạt động ok, nhưng nó không giữ lại char được tìm kiếm để sử dụng bởi ';' và ',' – joeytwiddle

+0

Chuyển động để đóng dấu ngoặc nhọn:]} - nếu bạn muốn xóa: d]} - cũng hoạt động đối với parens]) - chuyển động để mở niềng răng là [{ –

+0

Không hoạt động đối với tôi khi được bắt đầu bằng một số, ví dụ 'c2fa' thay đổi thành _first_' a'. –

5

Christian Brabandt của ft_improved plugin mở rộng tích hợp để tìm kiếm trong dòng này, quá f/t lệnh.

+3

Cảm ơn, tôi đã thử điều đó. Nhưng tôi đã sử dụng http://github.com/dahu/vim-fanfingtastic (có thể làm việc với lệnh '.' nếu bạn cũng cài đặt http://github.com/tpope/vim-repeat). 9 tháng không có khiếu nại! – joeytwiddle

1

Cách hợp lý nhất để thực hiện việc này vào lúc này bị ẩn trong this comment.

Bạn chỉ cần cài đặt hai plugin: vim-repeatvim-fanfingtastic.

Cá nhân, tôi sử dụng Vundle để quản lý plugin vim của mình.

Vì vậy, đây là cách bạn có thể làm f, F vv công việc như mong muốn:

  1. Install Vundle.
  2. Thêm những dòng này để .vimrc của bạn:

    Plugin 'tpope/vim-repeat' 
    Plugin 'dahu/vim-fanfingtastic' 
    
  3. Run $ vim +PluginInstall +qall trong vỏ của bạn.
  4. Thì đấy!
1

Một cách tiếp cận cho vấn đề này là sử dụng plugin easymotion.

Điều này cho phép bạn sử dụng các chuyển động như f trên toàn bộ cửa sổ hiển thị của văn bản. Bạn kích hoạt plugin, sau đó nhập f và ký tự bạn đang tìm kiếm. Nó đánh dấu từng vị trí mà ký tự xuất hiện trên màn hình bằng màu đánh dấu (ví dụ: màu đỏ) và hiển thị vị trí bằng cách sử dụng một chữ cái (a, b, c, d, ...). Bạn chỉ cần nhấn ký tự tương ứng với vị trí bạn muốn nhảy tới.

README của plugin trên Github bao gồm một hoạt ảnh minh họa trực quan cách hoạt động của nó.

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