Emacs一行内移动cursor的最佳方案是什么?

最近移除了evil,习惯的键位利用hydra模拟了一些,但是vim里面 f/F 键我还没有找到合适替代方案,之前习惯用来在一行内移动cursor。

无论是avy,swiper还是isearch,觉得用在一行内移动cursor没什么必要,按照word移动又太慢了:(

大家有什么好的建议吗~

1 个赞

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 这个命令。

1 个赞

是我的话多半会用 C-s (isearch-forward)。

1 个赞

Melpa上有的package:

我用过一段时间iy-go-to-char, 但是我会误操作(如果有好几个candidate会不小心就按多了),后来自己包裹了一个avy的功能,限制在行内移动。

1 个赞

棒!!熟悉的手感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)

output


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))
2 个赞

可以按fd/jk来从insert到normal,虽然我还是用的esc(60%键盘,在数字键那一行的最左)

我感觉吧,有时可能就是直接简单前后移省事。比较长的行,可以一个word一个word的移。当然,这得看你的按键绑定。

另外我调快我键盘的重复频率。这样前后移其实也快。

1 个赞

easymotion 插件,可运行在 vim 和 emacs 上