ぶっちゃけなんで作ったのか思い出せないけど、なんか便利そうだから置いておく
確か、terminalモードでマップすると入力がめんどいから一瞬だけデフォルトに戻すかみたいな思惑で作った気がする.
" Copy and modify from mapping source in unite.vim
function! s:get_mapping_list(map_cmd) abort
redir => mapping_str
silent! execute a:map_cmd
redir END
let mapping_list = []
let mapping_lines = split(mapping_str, '\n')
let mapping_lines = filter(copy(mapping_lines), "v:val =~ '\\s\\+\\*\\?@'") + filter(copy(mapping_lines), "v:val !~ '\\s\\+\\*\\?@'")
for line in map(mapping_lines, "substitute(v:val, '<NL>', '<C-J>', 'g')")
" attribute
let attr = ''
" right
let map_rhs = matchstr(line, '^\a*\s*\S\+\s*\zs.*\ze\s*')
if map_rhs =~ '^\*\s.*'
let map_rhs = map_rhs[2:]
let attr = '*'
endif
" left
let map_lhs = matchstr(line, '^\a*\s*\zs\S\+')
if map_lhs =~ '^<SNR>' || map_lhs =~ '^<Plug>'
continue
endif
let map_lhs = substitute(map_lhs, '<NL>', '<C-j>', 'g')
let map_lhs = substitute(map_lhs, '\(<.*>\)', '\1', 'g')
call add(mapping_list, [map_lhs, map_rhs, attr])
endfor
return mapping_list
endfunction
let s:is_term_map_enable = 1
function! s:toggle_terminal_map() abort
if s:is_term_map_enable == 1
let g:toggle_mapinfo_list = <SID>get_mapping_list('tmap')
" Disable
for mapinfo in g:toggle_mapinfo_list
echo mapinfo[0]
execute 'tunmap' mapinfo[0]
endfor
let s:is_term_map_enable = 0
else
" Enable
for mapinfo in g:toggle_mapinfo_list
let map_cmd = (mapinfo[2] == '*') ? ('tnoremap') : ('tmap')
execute map_cmd mapinfo[0] mapinfo[1]
endfor
let s:is_term_map_enable = 1
endif
endfunction
command! -nargs=0 ToggleTerminaMap call <SID>toggle_terminal_map()
こんな感じのマッピングの有効/無効を切り替えられるはず
tnoremap <ESC> <C-\><C-n>
tnoremap <C-w>h <C-\><C-n><C-w>h
tnoremap <C-w>j <C-\><C-n><C-w>j
tnoremap <C-w>k <C-\><C-n><C-w>k
tnoremap <C-w>l <C-\><C-n><C-w>l
もっと簡単な方法があればぜひ教えてください.