代码之家  ›  专栏  ›  技术社区  ›  dreeves

两全其美:光标移动或缓冲区翻转的箭头键

vim
  •  3
  • dreeves  · 技术社区  · 15 年前

    我非常喜欢使用左箭头和右箭头在缓冲区之间切换的VIM技巧:

    "left/right arrows to switch buffers in normal mode
    map <right> :bn<cr>
    map <left> :bp<cr>
    

    (把它放在~/.vimrc中)

    但有时我在浏览文件时会大嚼三明治之类的东西,我真的希望箭头键能正常工作。 我认为最有意义的是箭头键只有在实际打开多个缓冲区的情况下才具有上述缓冲区翻转功能。

    有没有一种方法可以扩展上述内容来实现这一点?

    3 回复  |  直到 15 年前
        1
  •  3
  •   dreeves    15 年前

    我宁愿有一个完全不同的映射,因为:

    • 光标真的很有用,如果没有它们,因为你有一个隐藏的缓冲区,会让你很恼火。
    • 一些插件使用 <left> <right> 因为它们比 l h ;这些插件可能会破坏这种映射

    无论如何,您可以尝试以下操作:

    nnoremap <expr> <right> (len(filter(range(0, bufnr('$')), 'buflisted(v:val)')) > 1 ? ":bn\<cr>" : "\<right>")
    nnoremap <expr> <left> (len(filter(range(0, bufnr('$')), 'buflisted(v:val)')) > 1 ? ":bp\<cr>" : "\<left>")
    

    要查看以上各部分的文档:

    :h :map-<expr>
    :h len()
    :h filter()
    :h range()
    :h bufnr()
    :h buflisted()
    
        2
  •  2
  •   idbrii    15 年前

    我使用alt方向在缓冲区之间切换。

    nmap <A-Left> :bp<CR>
    nmap <A-Right> :bn<CR>
    

    如果修改HL的默认值,那么箭头会更有用。就像改变 whichwrap 允许HL通过行尾。)

    我用jk做了类似的事情,使它们不同于我的箭头:

    " work more logically with wrapped lines
    set wrap
    set linebreak
    noremap j gj
    noremap k gk
    noremap gj j
    noremap gk k
    

    这将包裹长线,JK将移动到下面的线条。(如果你有一条长线,那么你将移动到光标下面那条线的一部分。)非常适合编辑散文或长注释。

    也见

    help showbreak
    
        3
  •  1
  •   sml    15 年前

    当处于正常模式时,我映射tab和shift+tab来切换缓冲区(对我的大脑来说是有意义的,而且按键在其他方面没有做任何有用的事情)。

    把这个加到你的.vimrc里

    " Use Tab and Shift-Tab to cycle through buffers
    nnoremap <Tab> bnext<CR>
    nnoremap <S-Tab> :bprevious<CR>