Как последовательно запустить командную строку Vim, чтобы сделать картографирование в любом режиме?

Я пытаюсь нормализовать доступ к режиму командной строки Vim из любого другого режима, чтобы упростить мои фактические сопоставления. Например, чтобы заставить ключ <f6> работать в любом месте, я определяю следующие сопоставления:

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

Вышеприведенные сопоставления переназначения на сопоставление <sid>: key приведены ниже, прежде чем они приступят к работе:

 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 

Есть ли более простой способ, чем мой запутанный подход?

Когда выполняются следующие действия?

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

Тем временем я придумал следующий подход:

 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> 

Для каждого режима Vim последовательность <SID><\O> отображается для правильного выхода (например, <C-\><CO> ) из текущего режима Vim (например, вставки) в обычный режим. Правая часть каждого отображения заканчивается в левой части (например, <SID><\O> ), чтобы рекурсивно попытаться снова сбежать. Рекурсия script-local ( <script> , <SID> ) прекращается, как только последняя последовательность управляющих клавиш достигает нормального режима Vim, в котором последовательность клавиш <SID><\O> отображается без изменений ( <Nop> ).

Аналогично, последовательность клавиш <SID><\N> отображается не только для того, чтобы выходить один раз ( <SID><\O> ), например, в режиме вставки, прежде чем возвращаться, но постоянно оставаться в нормальном режиме.

С помощью приведенных выше определений я отобразил функциональные клавиши <F1> и <S-F1> следующим образом:

 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 

Вместо того, чтобы клавиша <F1> просто открыла помощь Vim в новом окне, она запускает команду :help с внутренним словом ( <cword> ) под курсором. Последовательно нажимая клавишу <F1> , один переключается на внешнее слово ( <cWORD> ) и снова переключается обратно.

4 отображения из приведенного выше примера использования также могут быть определены следующим образом, чтобы не повторять себя; т.е. держать его «сухим»:

 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