woshichuanqilz
V2EX  ›  Vim

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

By woshichuanqilz at 2021 年 1 月 22 日 · 4473 次点击

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

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

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

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

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

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

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

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

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