실제 매핑을 단순화하기 위해 다른 모드에서 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