模仿vim操作,自定义 evil-mode 中,光标快速行首行尾切换的函数问题

大家都知道,在使用 vim 中有个非常方便的操作,是通过绑定快捷键实现光标快速行首行尾的移动。

nnoremap <expr>s col(".")==1?"$":"0"
vnoremap <expr>s col(".")==1?"$h":"0"

那么同样的在 emacs 中使用 evil-mode 也想实现这个快捷功能!
一个简单的思路是:判断光标当前 point 与行首的 postions 是否相等。如果相等就将光标移动到行尾,否则就移动到行首。

evil-normal-state 中,使用这个思路是完全没问题的,但对于 evil-visual-state 会自动将光标当前 point + 1,所以得针对这两种模式都要进行判断。自定义函数如下:
(defun evil/quick-line-s-e()
  (interactive)
  (when (or
		 (evil-normal-state-p)
		 (evil-visual-state-p)
		 (evil-motion-state-p))
	(if
		(or
		 (equal (line-beginning-position) (point))
		 (equal (+ (line-beginning-position) 1) (point))
		 )
		(goto-char (line-end-position))
	  (goto-char (line-beginning-position))
	  )
	)
  )

目前,这个函数绑定快捷键后,使用倒是没有什么问题!但不知是否存在潜在的问题!所以想请使用 evil-mode 的大佬们看看这个函数是否有需要纠正修改的地方!

1 个赞

你是说move-beginning-of-line和move-end-of-line这两个命令?一般绑定在C-a和C-e的那两个吗

1 个赞

题外话:为啥这么爱用感叹号呢。。。

2 个赞

:rofl:可能是个人输入习惯,感觉输入感叹号比输入句号更顺手! :stuck_out_tongue_closed_eyes:就不知不觉养成了习惯!

我是习惯将这两个命令的实现,绑定到同一个键上,通过判断去对应执行,比如

(define-key evil-normal-state-map (kbd "s") 'evil/quick-line-s-e)
(define-key evil-motion-state-map (kbd "s") 'evil/quick-line-s-e)

在函数中,也试过使用

(move-end-of-line nil)
(move-beginning-of-line nil)

的方式,发现和

(goto-char (line-end-position))
(goto-char (line-beginning-position))

效果是一样的,所以就随便选择了 goto-char 的方式。
那么,你的意思是说 move-end-of-line / move-beginning-of-line 的方式更好一些吗?

我用mwim,很顺手

1 个赞

哦哦,我还好奇为啥还单独设置函数,我习惯这个 C-a 和 C-e,因为它可以用在命令行,浏览器等等太多地方了,非常顺手

1 个赞

嗯嗯~目的一致!为了顺手、操作方便!:blush:

好的,我也试试!感谢大佬 :blush: