2015-05-22 12 views
5

Bất cứ khi nào tôi duyệt mã được gấp trong vim và nhấn phím l Tôi muốn mở khóa đó theo cách đệ quy. Đối với điều đó tôi đã làm như sau: nmap l lzO. Mà làm việc ok, ngoài thực tế nhận được một E490: No fold found bất cứ khi nào tôi sẽ bấm l không trong một lần. Tôi đã sử dụng một cái cớ để tìm hiểu về Vimscript và viết một hàm cho điều đó và tránh lỗi.Gọi các phím hjkl từ dòng lệnh của vim

Bây giờ, tôi thiếu một phần của làm cách nào tôi có thể gọi lệnh vim như l hoặc lzO từ bên trong một hàm?

function! OpenFoldOrNot() 
    if foldclosed(line(".")) == -1 
     echo "just l" 
     l # TODO 
    else 
     echo "open fold" 
     lzO # TODO 
    endif 
endfunction 

nmap l :call OpenFoldOrNot()<CR> 

Trả lời

3

Hãy thử lệnh normal. Trong trường hợp này, bạn sẽ cần normal! để tránh thực hiện đệ quy chức năng của bạn.

3

Bạn có thể thử những điều sau đây, sử dụng lệnh normal (vimscript của tôi là rất gỉ):

function! OpenFoldOrNot() 
    if foldclosed(line(".")) == -1 
     normal! l 
    else 
     normal! lzO 
    endif 
endfunction 

nmap l :call OpenFoldOrNot()<CR> 
+0

Không cần cho 'execute', trừ khi bạn có ý định sử dụng định dạng có thể in được một số ký tự đặc biệt như '' hoặc ''. – mMontu

+0

Ah vâng, bạn nói đúng. Như tôi đã nói, vimscript của tôi là rất gỉ;) –

2

Hoặc bạn có thể sử dụng một bản đồ thể hiện để làm loại công việc này dễ dàng hơn.

nnoremap <expr> l foldclosed(line(".")) == -1 ? 'l' : 'lzO' 

Trong biểu thức bản đồ bên tay phải, {rhs}, của ánh xạ là biểu thức VimScript. Điều này được đánh giá để có được những gì để thực thi. Trong trường hợp của bạn, nó được sử dụng để xác định xem ánh xạ có gọi là l hoặc lz0.

Để biết thêm giúp đỡ see:

:h :map-expression 
+0

Tôi không biết về biểu hiện bản đồ, cảm ơn! –

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