어떤 모드에서든 매핑이 작동하도록 Vim 명령줄을 일관되게 시작하려면 어떻게 해야 합니까?

어떤 모드에서든 매핑이 작동하도록 Vim 명령줄을 일관되게 시작하려면 어떻게 해야 합니까?

실제 매핑을 단순화하기 위해 다른 모드에서 Vim 명령줄 모드에 대한 액세스를 표준화하려고 노력합니다. 예를 들어 <f6>키가 모든 곳에서 작동하도록 하기 위해 다음 매핑을 정의했습니다.

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

위 매핑은 <sid>:작업을 시작하기 전에 아래 제공된 키 매핑으로 다시 매핑됩니다.

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

난독화된 메서드를 대체할 수 있는 간단한 방법이 있나요?

답변1

다음은 언제 작동하지 않습니까?

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

답변2

그 동안 나는 다음과 같은 접근 방식을 생각해 냈습니다.

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

각 Vim 모드에 대해 키 시퀀스 는 Vim의 현재 모드(예: 삽입 모드)에서 일반 모드로 <SID><\O>적절하게 이스케이프되도록 매핑됩니다 . <C-\><C-O>각 지도의 오른쪽은 왼쪽에서 끝나므로(예 <SID><\O>: ) 탈출이 재귀적으로 다시 시도됩니다. 마지막 이스케이프 키 시퀀스가 ​​Vim의 일반 모드(키 시퀀스 맵이 비어 있는 경우)에 도달하면 스크립트 로컬( <script>, ) 재귀가 중지됩니다.<SID><SID><\O><Nop>

마찬가지로, <SID><\N>키 시퀀스는 <SID><\O>return() 전에 삽입 모드를 한 번 종료할 뿐만 아니라 영구적으로 일반 모드를 유지하도록 매핑됩니다.

위의 정의를 사용하여 기능 키를 다음과 같이 <F1>매핑 했습니다.<S-F1>

noremap <script> <unique> <expr> <F1> <SID>ToggleHelp(':<C-U>help', '<SID>')
noremap! <script> <unique> <expr> <F1> <SID>ToggleHelp(':<C-U>help', '<SID>')
noremap <script> <unique> <expr> <S-F1> <SID>ToggleHelp(':<C-U>helpgrep', '<SID>')
noremap! <script> <unique> <expr> <S-F1> <SID>ToggleHelp(':<C-U>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

단순히 이 키를 사용하여 Vim의 도움말을 새 창에서 여는 대신 , <F1>커서 아래에 있는 :help내부 단어( )로 명령을 시작합니다 . <cword>이 키를 계속 누르면 <F1>외부 단어( <cWORD>)로 전환했다가 다시 되돌릴 수 있습니다.

위 사용 사례의 4가지 매핑은 중복을 피하기 위해 다음과 같이 정의할 수도 있습니다. 즉, "건조한" 상태로 유지합니다.

let a='noremap'
let b='<script> <unique> <expr>'
let c='<F1>'
let d='<S-F1>'
let e='<SID>ToggleHelp('':<C-U>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

관련 정보