mobaxterm用alt键作为meta键的方法

根据skywind3000大大的文章Vim 中正确使用 Alt映射,我的vim配置也将alt键作了映射,避免了很多弹钢琴似的操作。

我现在的用软件的风格,是吃饭的家伙尽量用免费的软件。 vim/neovim、R/Rstudio、eclipse/vscode全是开源免费的, 终端linux下用gnome-termal和terminator,mac下是iterm2。

windows用mobaxterm,相比较商业软件 xshell和 securecrt,最大的问题是不能映射Altmeta键,导致ssh到我的服务器上后不能用alt键,有些我精心设置的快捷功能不能实现。在它的软件设置菜单里,根本找不到设置项,网上查找提到要用autohotkey,装上去之后发现太麻烦。 后来还是根据前面skywind3000的文章里面一句话解决:

任意平台下面的 xterm 可以配置 ~/.Xdefaults 来设置这个行为。

放狗搜索下,在这个文件里加下面这个设置: XTerm*metaSendsEscape: true,解决问题。

一个小问题是这样就不能用alt+1,2,3.....切换tab,不知道有没有知道办法?
xshell里可以只映射左或右alt键作为esc,另一个alt保留原功能来解决。

补充个vim函数,正确映射alt键

function! Alt_meta_map()
    set ttimeout
    if $TMUX != ''
        set ttimeoutlen=20
    elseif &ttimeoutlen > 60 || &ttimeoutlen <= 0
        set ttimeoutlen=60
    endif
    map ÏP <F1>
    map ÏQ <F2>
    map ÏR <F3>
    map ÏS <F4>
    inoremap ÏP <Nop>
    inoremap ÏQ <Nop>
    inoremap ÏR <Nop>
    inoremap ÏS <Nop>
    inoremap <F5> <Nop>
    inoremap <F6> <Nop>
    inoremap <F7> <Nop>
    inoremap <F8> <Nop>
    inoremap <F9> <Nop>
    inoremap <F10> <Nop>
    inoremap <F11> <Nop>
    inoremap <F12> <Nop>
    function! s:metacode(key)
        if !(has('nvim') || has('gui_running') && !OSX())
            exec "set <M-".a:key.">=\e".a:key
        endif
        if has('gui_macvim')
            exec "map <D-".a:key."> <M-".a:key.">"
            exec "imap <D-".a:key."> <Nop>"
        endif
        exec "imap <M-".a:key."> <Nop>"
    endfunction
    for i in range(26)
        call s:metacode(nr2char(char2nr('a') + i))
        call s:metacode(nr2char(char2nr('A') + i))
    endfor
    let s:list = [',', '.', ';', ':', '/', '?', '{', '}', '-', '_']
    for c in s:list
        call s:metacode(c)
    endfor
    if has('gui_macvim')
        nnoremap <D-1> :tabn1<CR>
        nnoremap <D-2> :tabn2<CR>
        nnoremap <D-3> :tabn3<CR>
        nnoremap <D-4> :tabn4<CR>
        nnoremap <D-5> :tabn5<CR>
        nnoremap <D-6> :tabn6<CR>
        nnoremap <D-7> :tabn7<CR>
        nnoremap <D-8> :tabn8<CR>
        nnoremap <D-9> :tabn9<CR>
        nnoremap <D-0> :tablast<CR>
        inoremap <D-z> <ESC>
    else
        for i in range(10)
            call s:metacode(nr2char(char2nr('0') + i))
        endfor
        nnoremap <M-1> :tabn1<CR>
        nnoremap <M-2> :tabn2<CR>
        nnoremap <M-3> :tabn3<CR>
        nnoremap <M-4> :tabn4<CR>
        nnoremap <M-5> :tabn5<CR>
        nnoremap <M-6> :tabn6<CR>
        nnoremap <M-7> :tabn7<CR>
        nnoremap <M-8> :tabn8<CR>
        nnoremap <M-9> :tabn9<CR>
        nnoremap <M-0> :tablast<CR>
        nnoremap <M-c> "*y
        xnoremap <M-c> "*y
        nnoremap <M-x> "*x
        xnoremap <M-x> "*x
        nnoremap <M-v> "*gP
        xnoremap <M-v> "*gP
        inoremap <M-v> <C-r>*
        cnoremap <M-v> <C-r>*
        inoremap <M-z> <ESC>
        inoremap <M-w> <ESC>
        inoremap <M-q> <ESC>
        cnoremap <M-z> <ESC>
        cnoremap <M-w> <ESC>
        cnoremap <M-q> <ESC>
    endif
endfunction
call Alt_meta_map()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容