To leave completion untouched, try using
cnoreabbrev W w
It will replace?W
in command line with?w
, but only if it is neither followed nor preceded by word character, so :W<CR>
will be replaced with :w<CR>
, but :Write
won’t. (Note that this affects any commands that match, including ones that you might not expect. For example, the command :saveas W Z
will be replaced by :saveas w Z
, so be careful with this.)
Update
Here is how I would write it now:
cnoreabbrev <expr> W ((getcmdtype() is# ':' && getcmdline() is# 'W')?('w'):('W'))
As a function:
fun! SetupCommandAlias(from, to)
exec 'cnoreabbrev <expr> '.a:from
.' ((getcmdtype() is# ":" && getcmdline() is# "'.a:from.'")'
.'? ("'.a:to.'") : ("'.a:from.'"))'
endfun
call SetupCommandAlias("W","w")
This checks that the command type is?:
and the command is?W
, so it’s safer than just cnoreabbrev W w
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…