原VIM用户:请问TAB缩进、单词拆分、列块模式等到底有没有人完美解决的

TAB键模式

尝试了子龙山人的代码,不知道为什么,在我的环境下没有效果。会报错 现在使用的是如下代码:

    (defun st/insert-tab()
      (interactive)
      (insert-tab)
    )

    (defun st/indent-tab()
      (setq default-tab-width   4          ;制表符宽度为4
            indent-tabs-mode    nil           ;不使用tab键缩进
            )
      "下述语句也是有效的,但是统一使用全局快捷键配置"
      ;(setq indent-line-function 'st/insert-tab)
    )
    (global-set-key (kbd "<backtab>") 'un-indent-by-removing-4-spaces)
    (global-set-key (kbd "<tab>") 'st/insert-tab)
    (defun un-indent-by-removing-4-spaces ()
      "remove 4 spaces from beginning of of line"
      (interactive)
      (save-excursion
        (save-match-data
          (beginning-of-line)
          ;; get rid of tabs at beginning of line
          (when (looking-at "^\\s-+")
            (untabify (match-beginning 0) (match-end 0)))
          (when (looking-at "^    ")
            (replace-match "")))))
    (add-hook 'prog-mode-hook 'st/indent-tab)
   (add-hook 'text-mode-hook 'st/indent-tab)

这段代码基本能实现TAB和S-TAB功能,但是不是很好用。 比如说,如果这里移除,一定要移除4个空格,如果前面只剩下3个,那么S-TAB就不会回退了。

w/dw单词问题

尝试1

以前尝试过这段代码,是有效,但是和VIM区别比较大:

            (with-eval-after-load 'evil
               (defalias #'forward-evil-word #'forward-evil-symbol))

上面这段代码,会把 / \这样的一些东西都算进去,而且 yaw 复制全词还会把前面的空格也复制下来。

尝试2

  1. 然后尝试了下面这段代码,也不完美。在最后一个单词时,按w,会跳到下一行去。
  2. 并且如果是两行#ifdef ,dw时会把下一行的#也给删除了。 如:
#ifdef xxx
#ifdef xxxxx

在xxx上面dw,会变成 #ifdef ifdef xxxxx

    (defun forward-evil-word (&optional count)
      ""
      (let ((init-point (point)))
        (forward-symbol (or count 1))

        (if (= (point) init-point)
            count 0)))

      (setq evil-symbol-word-search t)

有没有人真正解决了的? 实在是不方便

visual block模式编辑问题

比如说按CTRL+V进入了块模式,但是此时按 i,不能在前面插字符,而是出来了这样的东西:

iedit模式

SPC s e进入iedit模式,原本会和gtags冲突,在论坛里解决了。 但是这个iedit模式,对于 dw指令,也是不支持的。。只能用s,而且只能删除自己 比如说

test a
test b
test c

使用iedit删除只能删除test,最开始的空格是保留的。

 a
 b
 c

这个只要改个正则就好了,不管是只匹配3个和4个还是匹配小于等于4个都可以做到。

w/dw单词问题

我用的defalias,这样之后evil操作肯定是按symbol来的,\/这些符号的话,应该是syntax-table的问题,describe-syntax看一下它们是什么语素,比如word-constituent包括在symbol里面,"这样的string就不算在里面。然后用modify-syntax-entry改一下,比如(modify-syntax-entry ?' "\"" web-mode-syntax-table)把单引号看作string。

daw会把前面的空格包括进去这个我也碰到过,不过不多,因为你这里的问题换成diw就好了,另外是什么时候会有问题,我忘了。。

visual block模式编辑问题

visual block下插入要按I吧,我记得vim也是一样的

iedit

没把空格选进去的话,删除没动空格,也是合理的行为吧。我用基于iedit的evil-multiedit,可以visual选中test_再向下一个个递增选取。

2 个赞

感谢。。

w/dw

试了下diw确实有效. 语义打不出来。。弄了一堆乱码,,算了先用用再看。。

确实是这样的,弄错了。

iedit

evil-multiedit试了下,也在论坛上搜索了下,搞不出来。。算了,后面再慢慢弄