Vim - 根据上下文映射备用键行为

标签 vim

我将列号设置为相对模式,因为我喜欢不计数。 我还将 nnoremapped jgj,以便更轻松地使用换行。问题是,当我在包裹的线上做一个 Action (例如 2j)时,它不会将我向上移动两行,而是向上移动两“行”。

为了解决这个问题,我希望将 j 映射到 gj 进行常规移动,但在给定时表现得像常规 j 计数。我在我的 vimrc 中尝试了以下命令:

"  Up and down now don't skip line-wraps unless given count
fun! MoveLines( lines, type )
    if ( a:lines == 1 )
        let a:str = 'g' . a:type
    else
        let a:str = a:lines . a:type
    endif
    call feedkeys( a:str )
endfun

nnoremap <silent> j :<C-U>call MoveLines( v:count1, 'j' )<CR>

当我只按 j 时,效果很好。问题是当我尝试给它一个计数时:它递归地调用自身(如预期的那样)。我可以尝试使用 cursor,但不使用这种方式是否可以做到这一点?

如何在未给出计数时有条件地将 j 映射为 gj,但在给定计数时却像正常情况一样工作?

最佳答案

您可以使用v:count来获取给定的当前计数。如果未提供任何内容,则将其设置为零。

nnoremap <expr> j v:count == 0 ? 'gj' : 'j'

更多帮助请参见:

:h v:count
:h :map-<expr>

关于Vim - 根据上下文映射备用键行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37196077/

相关文章:

windows - gVIM !start 如何获取返回值?

vim - 在vim中,如何将所有现有缩进修改为2?

vim - 在 Vim 中总是显示缓冲区的前几行

regex - Vim,删除一个正则表达式中的空白行和注释行

用于类似 IDE 行为的 Vim FTP 插件

c++ - 用于探索由 c/c++ 编写的宏的 vim 插件

vim - Vim函数清除隐藏字符

vim - Vim 何时使用可视模式?

vim - VIM晒黑后奇怪的背景颜色发生变化

regex - 替换vim中第n个出现的单词