怎样不让 [大写W] 跳过 [小括号)]

比如evil 模式下 (define-key '光标位置evil-lisp)当我dW的时候 仅删除evil-lisp 而不是evil-lisp)

你用小写的 w 就可以了吧?

如果你仔细研究过 Vim,会发现 Vim 的 W 也是这种行为,没必要刻意去 hack,用小写的 w 就 ok 了。

谢谢回复。 小写w 是可以实现

(add-hook 'emacs-lisp-mode-hook #'(lambda ()
                                    (modify-syntax-entry ?- "w")
                                    (modify-syntax-entry ?_ "w")))

但是会存在这样的问题: 比如我现在('emacs-*光标在此处*lisp-mode-hook) 当我仅仅想把lisp替换的时候 按下cw 这时候会将lisp-mode-hook 都给删掉

最好就是能实现 )也对W分词有效 这样完美了,但是不知道怎么实现,也没有思路

vi/evil 的行为就是这样,最简单的就是改用 dt) 来删除:

            dt)
     v----------------|
(((((delete-whole-world)))))
     ^----| dw             |
     ^---------------------|
            dW

或者可以研究一下 emacssuperword-mode

1 个赞

主要是因为在输入dt) 太麻烦了,才想这么改的

我观点刚好相反,dW 一共 3 个键在同一侧,按起来吃力,小拇指很受伤。dtX 不方便的地方是结尾那个字符不固定。

W 对应的函数是 evil-forward-WORD-end,改变它的默认行为就改变了 dW

默认dw只删掉foo-bar中的foo,我喜欢让他删掉整个symbol,所以(defalias #'forward-evil-word #'forward-evil-symbol)了,这样和楼主(modify-syntax-entry ?- "w")的作用类似,但是对各种major-mode都有用。

参考:http://emacs.stackexchange.com/a/20717/12854

这技巧太棒了!!!

副作用就是:有时候 邮箱仅仅删掉foo 结果又把整个句子都删掉了。 所以 我想改的小写w 保持原样,大写W #'forward-evil-symbol 起这个作用 ,要是能这样就完美了

我试了一下 大写W行为没法 (define-key evil-normal-state-map (kbd "W") 'evil-forward-word-begin) 是代码问题么?

只用一句(defalias #'forward-evil-WORD #'forward-evil-symbol)试试呢

稍稍还有点问题,好像还不行 W 和w 一个功能了

是不是把forward-evil-word也alias了,重启一下?

  (defalias  #'forward-evil-WORD #'forward-evil-symbol)
  ;; (defalias  #'forward-evil-word #'forward-evil-symbol)

这句话确实起作用了 但是效果变成了和小写w一样了。 下边这句作用就对 汗

是我的问题;; (define-key evil-normal-state-map (kbd "W") 'evil-forward-word-begin) 我把W 重新给映射了 。 现在好了。

大神,你太厉害了!

我也是从stackexchange抄的,链接编辑到上面的回复里了。

我只会一点点lisp,碰到什么讨论语法的帖子我都是在角落瑟瑟发抖的 :joy:

https://github.com/jixiuf/vmacs/blob/master/conf/conf-evil-symbol.el 针对symbol的 命令

;; WORD是中间没有空格的一串字符 ;; 与emacs中的symbol类似但是不同

;; 下面实现向前向后移动一个symbol, ;; |e|向前移动一个symbol,光标停在下个symbol的开始处| ;; |r|向前移动一个symbol,光标停在下个symbol的结束处|

;; |v|向后移动一个symbol,光标停在下个symbol的开始处| ;; |R|向后移动一个symbol,光标停在下个symbol的结束处|

;; |de|删除一个symbol,不包含空格,==die| ;; |dae|删除一个symbol,含空格| ;; |die|删除一个symbol,不含空格| ;; ;; ;; 这里占用了vim 原有的绑定,包括 e r R v ;; 其中原来的e我觉得用下不大 ;; emacs更倾向于在word 或symbol的开头后进行操作, ;; 所以基本上移动到word或symbol的开后进行操作就足够了 ;; 而我很少用vim的 r R进行替换操作,所以这两个键被占用了对我没有太大的影响

;; 而影响较大的是v键被占用了,v的功能是开始选中一片区域 ;; 之所以占用这个功能是,是我觉得向后移动到symbol的操作是个很常用的操作 ;; 我如果持续向后移动,只需要一直按住v就可以了 ;; 而所有的选中区域的功能我绑定到了别的键上即sv, ;; 我把s键扩展成了一系列功能键