2011-07-01 18 views
5

Trong Intellij Idea, có một tính năng. Giả sử tôi đã sử dụng biến số myCamelCase ở đâu đó trong mã của tôi. Sau đó, nếu tôi nhập mCC và nhấn Ctrl - Nhập hoặc một số tổ hợp phím như vậy, nó sẽ mở rộng thành myCamelCase. Có cái gì đó tương tự trong Vim?Mở rộng CamelCase trong Vim như Intellij Idea?

Trả lời

8

Được rồi, hãy tha thứ cho tôi để trả lời hai lần, nhưng vì lần thử đầu tiên của tôi bị mất điểm, tôi sẽ có một bước khác. Điều này phức tạp hơn tôi nghĩ, nhưng có thể không phức tạp như tôi đã làm nó (!).

Điều này hiện được sửa đổi để đề xuất tất cả các tên biến phù hợp.

Trước hết, đây là một chức năng để tạo ra các 'MCC' viết tắt từ chuỗi các 'myCamelCase':

function! Camel_Initials(camel) 
    let first_char = matchstr(a:camel,"^.") 
    let other_char = substitute(a:camel,"\\U","","g") 
    return first_char . other_char 
endfunction 

Bây giờ, đây là một chức năng mà phải mất một chữ viết tắt ('MCC') và quét bộ đệm hiện tại (lùi từ dòng hiện tại) cho "từ" có chữ viết tắt này. Một danh sách tất cả các trận đấu sẽ được trả về:

function! Expand_Camel_Initials(abbrev) 
    let winview=winsaveview() 
    let candidate=a:abbrev 
    let matches=[] 
    try 
     let resline = line(".") 
     while resline >= 1 
      let sstr = '\<' . matchstr(a:abbrev,"^.") . '[a-zA-Z]*\>' 
      keepjumps let resline=search(sstr,"bW") 
      let candidate=expand("<cword>") 
      if candidate != a:abbrev && Camel_Initials(candidate) == a:abbrev 
       call add(matches, candidate) 
      endif 
     endwhile 
    finally 
     call winrestview(winview) 
     if len(matches) == 0 
      echo "No expansion found" 
     endif 
     return sort(candidate) 
    endtry 
endfunction 

Tiếp theo, đây là một chức năng tùy chỉnh hoàn thành mà đọc từ dưới con trỏ và gợi ý các trận đấu được trả về bởi các chức năng trên:

function! Camel_Complete(findstart, base) 
    if a:findstart 
     let line = getline('.') 
     let start = col('.') - 1 
     while start > 0 && line[start - 1] =~ '[A-Za-z_]' 
      let start -= 1 
     endwhile 
     return start 
    else 
     return Expand_Camel_Initials(a:base) 
    endif 
endfunction 

Để tận dụng điều này, bạn phải xác định "completefunc":

setlocal completefunc=Camel_Complete 

Để sử dụng chèn chế độ hoàn thành, loại CTRL-XCTRL-U, nhưng tôi thường bản đồ này để CTRL-L:

inoremap <c-l> <c-x><c-u> 

Với mã này trong vimrc của bạn, bạn nên tìm dược đưa vào mCC tiếp theo CTRL-L sẽ thực hiện thay thế dự kiến. Nếu không tìm thấy mở rộng phù hợp, chữ viết tắt sẽ không thay đổi.

Mã không chặt chẽ, nhưng nó hoạt động trong tất cả các trường hợp đơn giản mà tôi đã thử nghiệm. Hy vọng nó giúp. Hãy cho tôi biết nếu có bất cứ điều gì cần làm sáng tỏ.

+0

Tuyệt vời! Đó là tất cả tôi có thể nói. Tôi vẫn tham lam/lười biếng đủ để yêu cầu bạn nhiều hơn. Nếu có nhiều hơn một mở rộng có thể: ví dụ: myCamelCase myCamelCart, cái cuối cùng được chọn. Thay vào đó, nó có thể được thực hiện để cư xử như hoàn thành từ khóa Ctrl-P trong vim? Một lần nữa, tuyệt vời! – dharm0us

+0

Tôi rất vui vì nó đã hoạt động! Xử lý nhiều trận đấu chỉ là vấn đề nhận Expand_Camel_Initials() để trả về một danh sách các giải pháp và sau đó thiết lập 'completefunc' để cho phép bạn lựa chọn giữa lúc đó. Tôi sẽ thử và có một cái nhìn vào nó vào cuối tuần này. –

+0

Được rồi, nó không đau đớn như tôi nghĩ ... Tôi đã chỉnh sửa câu trả lời của tôi và bây giờ nó sẽ hoạt động như bạn muốn. Hãy cho tôi biết nếu bạn có bất kỳ vấn đề gì (tôi chưa có cơ hội để kiểm tra nó đúng cách). –

0

Có một plugin cho điều này trong Vim gọi là vim-abolish. Sử dụng bản đồ crc để mở rộng thành vỏ lạc đà.

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