Vim 地图';f';在vi中呼叫

Vim 地图';f';在vi中呼叫,vim,button,map,controls,Vim,Button,Map,Controls,我可以把“jj”映射到 imap jj 我甚至可以将字母映射到标签导航 map tj :tabprevious<CR> map tk :tabnext<CR> 映射tj:tabprevious 地图tk:tabnext 但我无法将g映射为向上翻页(即使空格键充当向下翻页) map 地图g 根据“当你试图映射多个键序列时,你将无法以小写或大写字母开头(“太危险了,无法映射”),但标点符号和控制字符是公平的。”有人能证实这一点吗 如果是这样,如何将函数分配给未映射的键

我可以把“jj”映射到

imap jj

我甚至可以将字母映射到标签导航

map tj :tabprevious<CR>
map tk :tabnext<CR>
映射tj:tabprevious
地图tk:tabnext
但我无法将g映射为向上翻页(即使空格键充当向下翻页)

map
地图g

根据“当你试图映射多个键序列时,你将无法以小写或大写字母开头(“太危险了,无法映射”),但标点符号和控制字符是公平的。”有人能证实这一点吗

如果是这样,如何将函数分配给未映射的键(如“g”)

(编辑-原始答案建议使用本机Ctrl-f和Ctrl-b,但答案已更新,因为此处的目标是避免使用Ctrl和Shift)

需要补充的几点

假设我们现在选择了
X
,那么就把选择正确字符的问题留给您了

我能想到两个原因,为什么
MapX
不适合你

  • 您的vi版本可能不支持PageUp/PageDown。如果这是一个问题,那么尝试映射到vi的页面跳转(B表示后退,并伴有向前),例如
    映射X

  • 另一个选择是它不能“按预期”工作。在vi PageUp/PageDown中,操作“视口”而不是光标。因此,如果您正在查看文件的顶部,但光标不在顶部或不会执行任何操作。如果光标距离底部两行,PageDown也不会“工作”

    为了解决这个问题,您可以将“向上移动视口”和“将光标移动到视口顶部”结合起来,例如
    map X H
    (相反的是
    map X L
    )。或者指定要自己跳转的行数
    map X 30k
    (Op.
    map X 30j

  • 然后是选择要覆盖的正确字符的问题。Vi有很多本机命令,事实上很多,只有少数字符不执行本机命令。 所以,如果你的目标是避免RSI,那么当然要覆盖一些东西。但一定要覆盖一些对你个人来说不太有用的内容

    本机: f在您当前所在的行上搜索给定符号(可能非常有用,但我想不是很关键)
    g本身什么也不做,但gg将光标移动到文件的顶部。选择g可能会导致问题,因为vim(不是原始vi)会将两次快速按键解释为转到文件顶部,而不是执行两次页面升级。

    这并没有回答您的问题,但我认为这可能有助于解决您的RSI问题。它映射空格键以在快速和慢速移动模式之间切换。通常按j或k键将向下滚动一行。按空格键将打开快速移动模式,按j或k键将向下/向上滚动10行。再次按空格键可恢复正常。这只适用于vim,而不仅仅是普通的vi(尽管大多数“vi”程序只是指向vim的符号链接)

    它可以在正常和可视编辑模式下工作

    要使用它,请将此代码放在
    ~/.vimrc
    文件中的某个位置:

    map <Space> :call ToggleFastMoveMode()<CR>
    
    vmap <Space> :call ToggleFastMoveMode()<CR>gv
    
    let g:fastMoveMode = 0
    
    function! ToggleFastMoveMode()
        let g:fastMoveMode = 1 - g:fastMoveMode
        if (g:fastMoveMode == 0)
            noremap j j
            vnoremap j j
            noremap k k
            vnoremap k k
        else
            noremap j 10j
            vnoremap j 10j
            noremap k 10k
            vnoremap k 10k
        endif
    endfunction
    
    map:calltogglefastmovemode()
    vmap:调用ToggleFastMoveMode()gv
    设g:fastMoveMode=0
    功能!ToggleFastMoveMode()
    设g:fastMoveMode=1-g:fastMoveMode
    如果(g:fastMoveMode==0)
    诺雷马普j
    VNOREMAPJ
    诺雷马克
    VNOREMAPK
    其他的
    noremap j 10j
    vnoremap j 10j
    noremap k 10k
    VNOREMAPK 10k
    恩迪夫
    端功能
    
    我刚刚开始专门使用vi来解决我的问题,这是由于Ctrl+anything的缘故。我认为Ctrl键是万恶之源(即使在移动到shift键所在的位置之后)。h、j、k和l都很好,但我需要更多的选择。有什么建议吗?那就有点问题了。当然,如果您愿意,您可以覆盖f,但是您最好覆盖其中一个没有本机vi命令的字符。没有太多未使用的字符,因此通常使用CTRL、SHIFT或(通常是)键,使大多数自定义命令至少有两个键。此处提供了vi命令列表(包括未使用的字符)。但是,如果对给定的字符有更好的用途,则可以覆盖任何已使用的字符。然而,很多人在vi中使用CTRL-k/j或Shift-k/j进行页面的上下转换。Shift k(或k)未使用,Shift j(j)已被占用,但并不重要。我不想使用Shift或CTRL,因为它们位于不方便的位置(实际上是从tab到CTRL的所有按钮)。我不介意两个按钮(空格f表示前进,空格b表示后退),但我想要它,这样如果我按住它,它就会继续滚动,我就不想反复按下这两个按钮。我认为空格键是一个很好的Ctrl键,因为它没有其他用途。enter也是一个很好的选择,因为它执行与“j”g相同的功能,有点奇怪。就其本身而言,它什么也不做,但它并不完全是“未使用的”。在vim中(大多数系统中vi命令链接到vim),gg进入文件顶部,100gg进入第100行,gj和gk用于导航长包装行,因此它可能也不是最佳选择。我已经用一些新信息更新了下面的答案。我可以建议使用数字1和2来表示PageUp/Down吗?您已经有了ctrl-b和ctrl-f来表示PageUp和pagedown(或者ctrl-u和ctrl-d表示半页向上和半页向下,ctrl-e和ctrl-y表示行向上和行向下滚动)@Benoit我放弃了,开始使用ctrl-b/f/u/d,但是ctrl键对手腕非常有害。你必须不断地扭你的手。这就是答案<代码>我也遭受了自作自受的Eclipse和PyCharm驱动的RSI,并不断地哀叹Vim默认使用了“”键和弦。正如我们所建议的,在其他IDE中不断的按键和弦引起的可怕的手腕疼痛是我们许多人首先采用Vim的原因<代码>谢谢你的精彩表演!
    map <Space> :call ToggleFastMoveMode()<CR>
    
    vmap <Space> :call ToggleFastMoveMode()<CR>gv
    
    let g:fastMoveMode = 0
    
    function! ToggleFastMoveMode()
        let g:fastMoveMode = 1 - g:fastMoveMode
        if (g:fastMoveMode == 0)
            noremap j j
            vnoremap j j
            noremap k k
            vnoremap k k
        else
            noremap j 10j
            vnoremap j 10j
            noremap k 10k
            vnoremap k 10k
        endif
    endfunction