最好的两个世界:光标移动的箭头键或通过缓冲区翻转

时间:2010-06-02 22:40:07

标签: vim

我真的很喜欢这个使用左右箭头在缓冲区之间翻转的vim技巧:

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

(把它放在〜/ .vimrc中)

但是有时候当我在文件上滚动时我正在用三明治或其他东西咀嚼,我真的希望箭头键正常工作。 我认为最有意义的是箭头键只有在实际打开多个缓冲区时才具有上述缓冲区翻转功能。

有没有办法扩展上述内容来实现这一目标?

3 个答案:

答案 0 :(得分:3)

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

  • 游标非常有用,没有它们因为你有一个隐藏的缓冲区会让你烦恼很多
  • 某些插件使用<left><right>,因为它们的混淆程度低于lh;这些插件可能会破坏这种映射

无论如何,你可以试试这个:

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()

答案 1 :(得分:3)

我使用alt-direction在缓冲区之间切换。

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

答案 2 :(得分:1)

我在正常模式下将Tab和Shift + Tab映射到切换缓冲区(对我的大脑有意义,并且键没有做任何有用的事情)。

将此添加到.vimrc

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