Você está certo, a desvantagem de :cmap
é que se aplica a todos os modos de linha de comando, portanto, também impede que você pesquise por essas sequências de caracteres.
Uma solução é verificar o tipo do modo de linha de comando, por meio de um mapeamento de expressão:
cnoremap <expr> w1 getcmdtype() == ':' ? 'w!' : 'w1'
Se você for esperto, você pode fazer meta-programação e definir todos os seus mapeamentos em um loop, apenas passando as strings de origem e destino.
Mesmo esses mapeamentos modificados ainda não permitem que você digite essas strings mapeadas, por exemplo, como argumentos de comando (assim você não pode facilmente :w w1
, apenas escapando do último via <C-V>
), embora.
Plugin
O plug-in cmdalias.vim - Criar aliases para comandos do Vim também verifica a posição do comando e, portanto, manipula argumentos. Ele também oferece um conveniente comando :Alias
, então você não precisa fazer metaprogramação.