LoginSignup
1
0

More than 5 years have passed since last update.

neovimのterminalモードマッピングの有効/無効をコマンドから切り替える

Last updated at Posted at 2015-12-26

ぶっちゃけなんで作ったのか思い出せないけど、なんか便利そうだから置いておく
確か、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

もっと簡単な方法があればぜひ教えてください.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0