V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
woshichuanqilz
V2EX  ›  Vim

vim 如何设置在 f 找到对应的字符的时候进入 insert mode

  •  
  •   woshichuanqilz · 2021-01-22 12:17:08 +08:00 · 3002 次点击
    这是一个创建于 1437 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家应该都知道 f 的功能就是在当前行找到一个对应的字符, 我想在找到对应的字符的时候直接进入 insertmode 就好象找到之后自动按下 i 键 这个应该怎么设置?

    22 条回复    2021-02-06 11:46:27 +08:00
    jdhao
        1
    jdhao  
       2021-01-22 12:23:48 +08:00 via Android
    f 只能跳到每行一个匹配的字符,要跳到下一个匹配的字符需要继续按 ;,谁知道你想在哪个字符进入 insert 模式。

    结论,你的需求自己都没想清楚
    matrix67
        2
    matrix67  
       2021-01-22 12:25:17 +08:00
    map f fi
    woshichuanqilz
        3
    woshichuanqilz  
    OP
       2021-01-22 12:32:29 +08:00
    @matrix67 这是找到地一个 i 字母没有进入 insert mode
    @jdhao 就比如是定位当前坐标向右第一个, 定义第二个可以用 2fx 来做

    我的意思是能不能对 f 这个功能做一个简单的扩展
    matrix67
        4
    matrix67  
       2021-01-22 12:34:20 +08:00
    @woshichuanqilz #3 哈哈 还真是。想简单了。
    morefreeze
        5
    morefreeze  
       2021-01-22 12:53:44 +08:00
    在插入模式下 c-o 后临时切到 normal 模式,然后 f 找到后还在插入模式,你要做的就是简化 c-o f 吧
    zzzmj
        6
    zzzmj  
       2021-01-22 12:58:57 +08:00
    操作下来,能节省按键次数吗
    jdhao
        7
    jdhao  
       2021-01-22 14:04:55 +08:00 via Android
    @woshichuanqilz 当然可以,重新映射 f 即可,需要你写一个方法,方法里面实现你想要的操作,按下 f,执行这个方法即可
    jdhao
        8
    jdhao  
       2021-01-22 14:10:16 +08:00
    @jdhao nnoremap <expr> f :<C-U>YourFunction()<CR>

    把 YourFunction() 按照你的设想实现即可,不过你既然问这个问题,估计你也实现不了。。所以还是老实用 vim 原有的功能,等你的 vim function 功力达到了再做这样的高级定制。
    teawithlife
        9
    teawithlife  
       2021-01-22 14:44:53 +08:00
    来个 quick and dirty 的办法
    nnoremap fa fai
    nnoremap fb fbi
    ...
    nnoremap fz fzi
    nnoremap fA fAi
    ...
    nnoremap fZ fZi
    jdhao
        10
    jdhao  
       2021-01-22 14:58:19 +08:00 via Android
    @teawithlife 这样根本没用,以 fa 为例,只能跳到每行第一个 a,然后进入 insert 模式。问题是每次都想找第一个出现 a 的地方吗,一行有多个 a 的时候,怎么跳转并且进入插入模式?
    omph
        11
    omph  
       2021-01-22 17:15:36 +08:00
    找到合适的插件
    darksword21
        12
    darksword21  
       2021-01-22 17:51:10 +08:00
    emacs 我知道,vim 是不是有个交 anzu 的好像类似的?
    darksword21
        13
    darksword21  
       2021-01-22 17:51:18 +08:00
    sona
        14
    sona  
       2021-01-22 19:37:15 +08:00


    找字母(这个行为当只发生一步的时候必然只会找到第一个顺序或逆序的结果)--- 插入
    这个操作只有两步,可以用两个字母代替

    找字母 --- 定位其中某一个 --- 插入
    这个操作总共三步,起码需要三步,无论如何你也不可能通过两个字母达到这个效果
    三个字母可以做出来这个功能,通过用字母标记对应字母位置的方式
    这种方式应该是有插件的,你可以找找
    但是这里虽然表面只需要三个字母,但你却需要一个额外的观察记忆标记字母并且使用,我个人觉得其实很繁琐

    找字母 --- 插入 --- 在插入模式下移动到下一个字母处
    这样可以通过两个按键达到找到第一个字母并进入的效果,同时通过快捷键移动到剩下的位置
    你可以很简单的通过 @teawithlife 的那个方法加上一个 imap 实现

    但我不明白你为什么需要这个功能,因为 vim 找到字母在 normal 模式下明显是更方便的
    你可以选择的操作更多,你可以操作当前的字母,当前的词汇,当前的文本对象,可以直接替换当前字母而不退出 normal 模式
    这样不是更好吗
    sona
        15
    sona  
       2021-01-22 19:48:06 +08:00   ❤️ 1
    额,回复完发现我错了,因为你需要的是自动插入,所以插入只是操作的结束,并不算一个步骤
    找 字母 本身就是两步,本身就需要两个字母
    找 字母 定位某一个 三步,必然需要三个字母或以上
    找 字母 在插入模式下移动到下个结果, 这样可以得到一种第一个位置只需要两个字母,剩下的位置需要更多按键的方式
    最后结论依然不变,找到字母保持 normal 我认为依然是对的
    no1xsyzy
        16
    no1xsyzy  
       2021-01-23 00:15:39 +08:00
    @jdhao nnoremap fa fai 了以后 2fa 就是 2fai
    gppola666
        17
    gppola666  
       2021-01-23 00:23:24 +08:00
    就多按一个 i 键,没必要,而且不一定是 i,还可能是 r,ciw,d$等等方式
    DrakeXiang
        18
    DrakeXiang  
       2021-01-23 00:46:29 +08:00   ❤️ 1
    这种很可能造成效率低下,要数有多少个目标字符,数错了成本就很大,数对了也只是少按一次键而已,而且你能保证你的目标字符都在你光标的同一侧吗?这恐怕很不好满足,有时候你的目标字符前后有特殊字符,一个 f 就能找到,然后通过 i 或者 a 来达到目的,但如果你把 f 改了,你就很可能无法使用 f 找到特殊字符,只能自己数,为了节省一个按键来牺牲灵活性,实在是得不偿失
    Takamine
        19
    Takamine  
       2021-01-23 07:45:26 +08:00 via Android
    一般来说我用 w 的频率更高,f 后可能还要;几次才能找到自己要的,而且找到特征字符之后也不一定都是 i,还会 a,diw 都有可能。
    bickman
        20
    bickman  
       2021-01-23 08:26:03 +08:00
    fi 就行了,或者自己定义宏
    bickman
        21
    bickman  
       2021-01-23 08:30:24 +08:00
    f 是向后查找,i 是插入字符,你想找到后插入字符就用 fi,或者自己定义宏,f 99%的情况下都不是一次就能查找到的,肯定要多 f 几次,如果直接进入 f 一下就进入插入模式,还这么查找,这样反而反人类,不知道楼主提这个问题是不是没有怎么搞明白 vim 基本思想,或者仔细思考过。
    woshichuanqilz
        22
    woshichuanqilz  
    OP
       2021-02-06 11:46:27 +08:00
    @bickman 请教一下我的目的是少按一个键, 是哪里违背了 vim 的基本思想, 按你的说法你的 vimrc 里面的 key remap 好像都违背 vim 的基本思想了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2857 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 13:52 · PVG 21:52 · LAX 05:52 · JFK 08:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.