augroup nohai autocmd! " autocmd CmdlineLeave * call s:Nohai(expand('')) autocmd CmdlineEnter [/?] call s:Nohai(expand('')) augroup END function! s:Nohai(cmdwin_char) if a:cmdwin_char == '/' || a:cmdwin_char == '?' " nohlsearch " ^ doesn't work because the autocommand executes before leaving the " command line window call s:AddMapping(a:cmdwin_char) else call s:RemoveMapping() endif endfunction function! s:AddMapping(cmdwin_char) " silent! cnoremap :nohlsearch silent! cnoremap s:CR(a:cmdwin_char) endfunction function! s:RemoveMapping() silent! cunmap endfunction function! s:CR(cmdwin_char) if a:cmdwin_char == '/' || a:cmdwin_char == '?' return ':nohlsearch' " ... and unmap else return '' endif endfunction function! s:Search() " let s:on = 1 " 1. Turn on autocmd " 2. Search (find out if this is blocked by function-search-undo) " 2.a. Search automatically disables autocmd endfunction nnoremap (nohai-search-backward) :call s:Search() nnoremap (nohai-search) :call s:Search() nmap g? (nohai-search-backward) nmap g/ (nohai-search)