woshichuanqilz
V2EX  ›  Vim

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

  •  
  •   woshichuanqilz · Jan 22, 2021 · 4602 views
    This topic created in 2116 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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