¿Cómo iniciar sistemáticamente la command-line de Vim para hacer que una asignación funcione en cualquier modo?

Intento normalizar el acceso al modo de command-line de Vim desde cualquier otro modo para simplificar mis asignaciones reales. Por ejemplo, para hacer que la tecla <f6> funcione desde cualquier lugar, defino las siguientes asignaciones:

 noremap <script> <unique> <silent> <f6> <sid>:echomsg 'Hello World!'<cr> noremap! <script> <unique> <silent> <f6> <sid>:echomsg 'Hello World!'<cr> 

Las asignaciones anteriores reasignan a la asignación de teclas <sid>: muestra a continuación antes de que comiencen a funcionar:

 noremap <unique> <expr> <sid>: <sid>StartCmdLineMode() noremap! <unique> <expr> <sid>: <sid>StartCmdLineMode() function! s:StartCmdLineMode() let a=mode() if a ==# 'n' return ':' " Type <cv><cv> to insert ^V. elseif a =~ '[vV^V]' return ":\<cu>" elseif a ==# 'no' return "\<cc>:" elseif a ==# 'i' return "\<co>:" elseif a ==# 'c' let b=getcmdtype() if b ==# ':' return "\<ce>\<cu>" else return "\<cc>:" endif else return '' endif endfunction 

¿Hay una forma segura en lugar de mi enfoque ofuscado?

¿Cuándo no funciona lo siguiente?

 nnoremap <F6> <ESC><ESC>:command<CR> 

Mientras tanto, se me ocurrió el siguiente enfoque:

 noremap <script> <unique> <SID><\O> <Nop> inoremap <script> <unique> <SID><\O> <C-\><CO><SID><\O> cnoremap <script> <unique> <SID><\O> <C-\><CN><SID><\O> noremap <script> <unique> <SID><\N> <Nop> noremap! <script> <unique> <SID><\N> <C-\><CN><SID><\N> 

Para cada modo Vim, la secuencia de teclas <SID><\O> se asigna para escaping de manera apropiada (por ejemplo, <C-\><CO> ) del modo actual de Vim (por ejemplo, modo inserción) a su modo normal. El lado derecho de cada mapeo termina en su lado izquierdo (por ejemplo, <SID><\O> ) para intentar recursivamente escaping nuevamente. La recursión script-local ( <script> , <SID> ) se detiene tan pronto como la última secuencia de key de escape alcanza el modo normal de Vim en el que la secuencia de teclas <SID><\O> se asigna a nada ( <Nop> ).

Del mismo modo, la secuencia de teclas <SID><\N> se asigna para que no solo escape una vez ( <SID><\O> ) de, por ejemplo, modo inserción antes de volver, sino que permanezca permanentemente en modo normal.

Con la ayuda de las definiciones anteriores asigné las teclas de function <F1> y <S-F1> siguiente manera:

 noremap <script> <unique> <expr> <F1> <SID>ToggleHelp(':<CU>help', '<SID>') noremap! <script> <unique> <expr> <F1> <SID>ToggleHelp(':<CU>help', '<SID>') noremap <script> <unique> <expr> <S-F1> <SID>ToggleHelp(':<CU>helpgrep', '<SID>') noremap! <script> <unique> <expr> <S-F1> <SID>ToggleHelp(':<CU>helpgrep', '<SID>') function! s:ToggleHelp(cmd, sid) ToggleVar s:HelpCwordOn let a=s:HelpCwordOn ? '<cword>' : '<cWORD>' return a:sid . '<\O>' . a:cmd . ' ' . expand(a) . ' ' endfunction command! -bang -nargs=+ ToggleVar call <SID>ToggleVar(<bang>0, <f-args>) function! s:ToggleVar(bang, var) let {a:var}=exists(a:var) ? !{a:var} : !a:bang endfunction 

En lugar de tener la tecla <F1> simplemente abra la ayuda de Vim en una nueva window, inicia el command :help con la palabra interna ( <cword> ) debajo del cursor. Al presionar consecutivamente la tecla <F1> , se cambia a la palabra externa ( <cWORD> ) y se vuelve a agrupar.

Las 4 asignaciones del caso de uso anterior también se pueden definir de la siguiente manera para no repetirse; es decir, manteniéndolo "seco":

 let a='noremap' let b='<script> <unique> <expr>' let c='<F1>' let d='<S-F1>' let e='<SID>ToggleHelp('':<CU>help' let f='grep' let g=''', ''<SID>'')' let h=b . ' ' . c . ' ' . e . g let i=b . ' ' . d . ' ' . e . f . g exec a . ' ' . h exec a . '! ' . h exec a . ' ' . i exec a . '! ' . i