2009-11-05 43 views
9

Tôi muốn có thể viết \bit và mở rộng thành thứ gì đó trong vim. Làm cách nào để mã hóa dấu gạch chéo ngược ở phía bên tay trái của chữ viết tắt?Sử dụng dấu gạch chéo ngược trong các chữ viết tắt vim

tôi đã cố gắng tất cả những:

:iab \bit replacement_text 
:iab <Bslash>bit replacement_text 
:iab <bs>bit replacement_text 

nhưng có E474: Invalid argument cho tất cả trong số này.

Chủ đề trợ giúp map_backslash gợi ý <Bslash>, nhưng điều này dường như không hoạt động.

+0

Aaarrgghh! Đó là một cái bánh quy. của bạn, tôi đã học được, là một điều {rhs}. Trong {lhs}, "\ b" (w/o quotes) hoạt động, nhưng E474 có khi một char thứ hai được thêm vào "\ bi". "\\" và "\\ b" được chấp nhận, nhưng "\\ bi" thì không. '' \ bit '' (w/o dấu nháy đơn bên ngoài) hoạt động, nhưng dấu ngoặc kép là một phần của ab. Như tôi đã nói, "Aaarrgghh!" +1 –

+0

nếu bạn gắn thẻ này vào câu trả lời @Ewan, tôi có thể bỏ phiếu này và sẽ dễ dàng hơn để xem các dấu ngoặc kép. Đây là công cụ thú vị ... – Peter

Trả lời

9

Bạn có thể xác định chữ viết tắt của mình trên "bit" và sau đó kiểm tra xem chữ viết tắt có phải là "\" không, nếu có, hãy trả lại văn bản mới hoặc "bit" ngược lại.

function! s:Expr(default, repl) 
    if getline('.')[col('.')-2]=='\' 
    return "\<bs>".a:repl 
    else 
    return a:default 
    endif 
endfunction 

:inoreab bit <c-r>=<sid>Expr('bit', 'foobar')<cr> 

Đó là loại thủ thuật tôi đã sử dụng trong MapNoContext().

CHỈNH SỬA: xem :h abbreviations vì những lý do khiến bạn không thể trực tiếp nhận được những gì bạn yêu cầu.

EDIT2: Nó có thể dễ dàng đóng gói theo cách này:

function! s:DefIab(nore, ...) 
    let opt = '' 
    let i = 0 
    while i != len(a:000) 
    let arg = a:000[i] 
    if arg !~? '<buffer>\|<silent>' 
     break 
    endif 
    let opt .= ' '.arg 
    let i += 1 
    endwhile 

    if i+2 != len(a:000) 
    throw "Invalid number of arguments" 
    endif 
    let lhs = a:000[i] 
    let rhs = a:000[i+1] 

    exe 'i'.a:nore.'ab'.opt.' '.lhs.' <c-r>=<sid>Expr('.string(lhs).', '.string(rhs).')<cr>' 
endfunction 

command! -nargs=+ InoreabBSlash call s:DefIab('nore', <f-args>) 

Và sử dụng với một đơn giản:

InoreabBSlash <buffer> locbit foobar 

hoặc

InoreabBSlash bit foobar 
1

bạn có thể

inoremap \bit replacementtext 

Ngoài ra nếu bạn không thích độ trễ một nhà lãnh đạo thay thế như backtick `(trên tab cho tôi)

:iab `f foobar 

nếu bạn không sử dụng chúng trong mã của bạn thường xuyên

+0

Điều này sẽ hoạt động, nhưng không chính xác theo cùng một cách. Sẽ có một tạm dừng gây phiền nhiễu sau mỗi lần chờ đợi phần còn lại của nó. Tôi không hoàn toàn nhìn thấy một cách xung quanh mà mặc dù. – sykora

+0

vâng, tôi đã tự mình thử - và không thích nó. – Peter

+0

Tôi có điều này cho một vài imaps (sử dụng = cho một số chức năng xử lý) bạn nhận được trên tạm dừng (nó buộc bạn chỉ cần gõ nhanh hơn :) – michael

0

Bạn chỉ có thể sử dụng một dấu gạch chéo như một tiền tố viết tắt nếu nó chỉ có một ký tự đơn sau nó, vì vậy :iab \b replacementtext sẽ làm việc.

2

tôi đề nghị sử dụng dấu gạch chéo trên cả hai mặt, vim là hạnh phúc theo cách đó:

inoreabbr \bit\ replacement_text 

Lưu ý rằng tôi đang sử dụng "nore" phiên bản của abbr, tốt hơn để được rõ ràng nếu bạn không có ý định một đệ quy sự bành trướng. Tôi đã sử dụng các từ viết tắt dưới đây trong một thời gian dài và chúng hoạt động tốt:

inoreabbr \time\ <C-R>=strftime("%d-%b-%Y @ %H:%M")<CR> 
inoreabbr \date\ <C-R>=strftime("%d-%b-%Y")<CR> 
+0

Sáng tạo thay thế. Dấu gạch chéo ngược theo sau biến điều này thành chữ viết tắt _non-id_ được cho phép. –

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