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
Nguồn
2009-11-05 14:13:59
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 –
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