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

2021-01-22 12:17:08 +08:00
 woshichuanqilz

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

2701 次点击
所在节点    Vim
22 条回复
jdhao
2021-01-22 12:23:48 +08:00
f 只能跳到每行一个匹配的字符,要跳到下一个匹配的字符需要继续按 ;,谁知道你想在哪个字符进入 insert 模式。

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

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

把 YourFunction() 按照你的设想实现即可,不过你既然问这个问题,估计你也实现不了。。所以还是老实用 vim 原有的功能,等你的 vim function 功力达到了再做这样的高级定制。
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
2021-01-22 14:58:19 +08:00
@teawithlife 这样根本没用,以 fa 为例,只能跳到每行第一个 a,然后进入 insert 模式。问题是每次都想找第一个出现 a 的地方吗,一行有多个 a 的时候,怎么跳转并且进入插入模式?
omph
2021-01-22 17:15:36 +08:00
找到合适的插件
darksword21
2021-01-22 17:51:10 +08:00
emacs 我知道,vim 是不是有个交 anzu 的好像类似的?
darksword21
2021-01-22 17:51:18 +08:00
sona
2021-01-22 19:37:15 +08:00


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

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

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

但我不明白你为什么需要这个功能,因为 vim 找到字母在 normal 模式下明显是更方便的
你可以选择的操作更多,你可以操作当前的字母,当前的词汇,当前的文本对象,可以直接替换当前字母而不退出 normal 模式
这样不是更好吗
sona
2021-01-22 19:48:06 +08:00
额,回复完发现我错了,因为你需要的是自动插入,所以插入只是操作的结束,并不算一个步骤
找 字母 本身就是两步,本身就需要两个字母
找 字母 定位某一个 三步,必然需要三个字母或以上
找 字母 在插入模式下移动到下个结果, 这样可以得到一种第一个位置只需要两个字母,剩下的位置需要更多按键的方式
最后结论依然不变,找到字母保持 normal 我认为依然是对的
no1xsyzy
2021-01-23 00:15:39 +08:00
@jdhao nnoremap fa fai 了以后 2fa 就是 2fai
gppola666
2021-01-23 00:23:24 +08:00
就多按一个 i 键,没必要,而且不一定是 i,还可能是 r,ciw,d$等等方式
DrakeXiang
2021-01-23 00:46:29 +08:00
这种很可能造成效率低下,要数有多少个目标字符,数错了成本就很大,数对了也只是少按一次键而已,而且你能保证你的目标字符都在你光标的同一侧吗?这恐怕很不好满足,有时候你的目标字符前后有特殊字符,一个 f 就能找到,然后通过 i 或者 a 来达到目的,但如果你把 f 改了,你就很可能无法使用 f 找到特殊字符,只能自己数,为了节省一个按键来牺牲灵活性,实在是得不偿失
Takamine
2021-01-23 07:45:26 +08:00
一般来说我用 w 的频率更高,f 后可能还要;几次才能找到自己要的,而且找到特征字符之后也不一定都是 i,还会 a,diw 都有可能。
bickman
2021-01-23 08:26:03 +08:00
fi 就行了,或者自己定义宏

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/747341

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX