最近移除了evil,习惯的键位利用hydra模拟了一些,但是vim里面 f/F
键我还没有找到合适替代方案,之前习惯用来在一行内移动cursor。
无论是avy,swiper还是isearch,觉得用在一行内移动cursor没什么必要,按照word移动又太慢了:(
大家有什么好的建议吗~
最近移除了evil,习惯的键位利用hydra模拟了一些,但是vim里面 f/F
键我还没有找到合适替代方案,之前习惯用来在一行内移动cursor。
无论是avy,swiper还是isearch,觉得用在一行内移动cursor没什么必要,按照word移动又太慢了:(
大家有什么好的建议吗~
lisp代码用lispy差不多就是你想的什么好处都有的效果,其他的语法复杂的语言嘛……要是不用evil能和evil一样方便,还要evil干啥……
evil ~~
没啥好的想法的话就实现的跟 vim 一样好了,有一个叫作 search-forward 的函数,你可以稍微了解一下,可以帮助你实现查找的功能
哈哈 evil各种mode切来切去,结果C-[
变成按的最多的键了,想换种方式体验一下~
可还是舍不得各种方便的功能2333
好的xD 我回头看看能不能给这个函数加个scope模拟一下
我贡献一个比较搓的实现吧,不过大体上跟 vim 的差不多了,可以稍微优化一下
(defun my-look-forward-char (arg char)
"查找字符"
(interactive "*p\ncZap: ")
(let ((p (point)))
(and (search-forward
(char-to-string char) (point-at-eol) t arg)
(progn
(backward-char)
(if (= p (point))
(my-look-forward-char 2 char))))))
(defhydra hydra-esc (:color pink
:hint nil)
"
---hydra---
"
("f" my-look-forward-char)
("F" (lambda (char) (interactive "c")
(search-forward
(char-to-string char) (point-at-bol) t -1)))
("<escape>" nil))
(search-forward string around fail count)
查询目标字符串,并在目标字符串的最后一个字符处设置位点
返回 t 表示查询成功,移动位点只是附带效果
string: 要查找的内容,必须是字符串
around: 查询范围, 它被指定为缓冲区中的某个位置,
设定为 nil: 查询到缓冲区末尾
fail: 查询失败该怎么办,
设定为 nil: 如果查询就发出一个出错信号
设定为 t:查找失败返回 nil
count: 待查找字符串出现的次数
char-to-string 就是将字符转换成字符串的函数
point-at-eol 当前行行尾 point
多说一句,如果想要实现 vim 下 t 这个命令的话,可以使用一个变量存储上次搜索的字符,然后使用 last-command 这个命令来判断是不是再次使用了 t 这个命令。
是我的话多半会用 C-s
(isearch-forward
)。
Melpa上有的package:
我用过一段时间iy-go-to-char, 但是我会误操作(如果有好几个candidate会不小心就按多了),后来自己包裹了一个avy的功能,限制在行内移动。
棒!!熟悉的手感233
既然安装了 avy,顺手查看一下,不难发现有个 avy-goto-char-in-line
函数。如果不够用,可以自行封装几个:
...
(defun avy-goto-word-0-in-line ()
(interactive)
(avy-goto-word-0 nil (point-at-bol) (point-at-eol)))
(defun avy-goto-word-1-in-line (char &optional arg)
(interactive (list (read-char "char: " t)
current-prefix-arg))
(avy-goto-word-1 char arg (point-at-bol) (point-at-eol) nil))
(global-set-key (kbd "C-c j") 'avy-goto-word-1-in-line)
APPEND: 2018-08-23 10.32.10
带上方向(backword / forward)之后,出现候选词的概率大大降低:
(defun avy-goto-word-1-backward-in-line (char &optional arg)
(interactive (list (read-char "char: " t)
current-prefix-arg))
(avy-goto-word-1 char arg (point-at-bol) (point) nil))
(defun avy-goto-word-1-forward-in-line (char &optional arg)
(interactive (list (read-char "char: " t)
current-prefix-arg))
(avy-goto-word-1 char arg (point) (point-at-eol) nil))
可以按fd
/jk
来从insert到normal,虽然我还是用的esc(60%键盘,在数字键那一行的最左)
我感觉吧,有时可能就是直接简单前后移省事。比较长的行,可以一个word一个word的移。当然,这得看你的按键绑定。
另外我调快我键盘的重复频率。这样前后移其实也快。
easymotion 插件,可运行在 vim 和 emacs 上