emacs evil-mode 中如何删除半句话?

自己在写论文的期间,经常在句子内间进行跳动,编辑。比如下面一句话: Recently, attempts have been made to eliminate some of these ambiguities by using more elaborated lighting models, and richer, natural illumination environments [19, 20]. 我想通过快捷键删除这半句话:attempts have been made to eliminate some of these ambiguities by using more elaborated lighting models, 不知道有没有对应的快捷键进行删除操作的。vim中有进行整句话删除操作的vis 以及vas.网上搜索了下,一直没有对应的快捷键。vim中也没有搜索到对应的快捷键。

1 个赞

M-a跳到句首,M-k删一句。

只想删除半句话,不需要一整句话全部删除。因为这个功能在自己写论文的时候是非常常用的功能了。特别是句内编辑的时候还是经常常用的功能的。句间操作的话vim提供了很好的编辑功能了。

那就定位到中间然后M-k删到句尾

兄弟。你没看懂我的问题,我的问题是在逗号和句号,逗号逗号之间进行删除操作。

那你不可以f键定位标点然后删除?

可以。但是不灵活。比如这半句话跨行了,相当于你还要多操作一次。不知道vim有没有默认的快捷键做这个事情的。网上搜索了下,没找到类似的默认功能。

把逗号添加到emacs的分句正则

(setq sentence-end (concat ",\\|" (sentence-end)))

这个也十一个解决方法。但是感觉不是很完美。我们emacs中使用evil-mode来编辑文本。比如我想删除一句话,经常执行vas快捷键(也就是vim默认的快捷键)就可以删除这句话了。备注:这句话可以跨行。但是如果添加你这个设置,相当于我就不能通过vas快捷键进行整句话的删除了。最好是单独在设置一个快捷键来做这个事情比较好。

自己改个motion吧,分开半句和一句

(evil-define-text-object my/evil-a-subsentence (count &optional beg end type)
  "Select a subsentence(delimitered by comma)."
  :extend-selection nil
  (list (progn
          (re-search-backward "[,.] ?")
          (forward-char)
          (when (eq (char-after (point)) ? ) (forward-char))
          (point))
        (re-search-forward "[,.] ?")))

(general-define-key
 :keymaps 'evil-outer-text-objects-map
 "S" 'my/evil-a-subsentence)

(general-define-key
 :keymaps 'evil-inner-text-objects-map
 "S" 'TODO)

没有general-define-key的同学可以用evil-define-key代替。

牛逼了,哥们。

不是 「d f 逗号」 么?

  1. 把光标移到 Recently, 后面
  2. d f ,

你按慢点不就看见了(which-key),按 viva 后等一下,所有的 evil text object 将出现,你要的不就是 a

  1. 把当前光标放在想操作的 text object 中;
  2. v 选中想要的 text object 或者就你的例子来说,直接 daa 删除就完了。

evil 把 vim 的 text object 学了个十足,甚至有过之而无不及!evil-args 默认的 delimiter 是 ,;。不够你用?自己设置 evil-args-delimiters 吧,文本想怎么分就怎么分。

f/tF/T 只能针对当前光标之前或之后,如果我想对光标前后同时操作就不便了,虽然组合起来多按几次也可以(只能对当前行,跨行不行),更简单高效的方式是使用 Text Objects。

我操作了下,你说的命令daa基本上是可以删除两个逗号之间的距离。但是实际上我想通过快捷键比较方便地删除两个逗号之间的文本,或者一个句号一个逗号之间的文本(备注,这里两个句号不包括,因为vim或者evil-mode已经提供了句间操作的命令)。

或者说想傻瓜式的删除最近两个标点符号(逗号,句号,冒号,感叹号)。

现在基本上可以了,添加下面的代码就可以了。 (setq evil-args-delimiters '("." “!” “:” “?” “,”))

daa 只是举个例子,如果你真的明白这三个字符分别代表什么意思,你应该知道你提到的 visvas 中的 s 是指的 sentence,你也应该知道把第二个字符 a 换成 i 就会删除两个逗号(或分号,说的是默认设置)之间的文本而不包含后面那个逗号。第一个字符也可以不用 d,根据需要换成 vcy…,等等无数的操作。

我建议你还是先读一读 vim 帮助文件 motion.txt 的第六小节: Text object selection

The commands that start with “a” select "a"n object including white space, the commands starting with “i” select an “inner” object without white space, or just the white space. Thus the “inner” commands always select less text than the “a” commands.

说过了啊,evil-args-delimiters!而且这个适当设一下就好,又不是非要 text objects 一路到底,没有什么方法可以满足所有需求,人可是活的,有的时候 f/tF/T 更方便,有的时候 text objects 更好,适当组合这些方法才是正道。

vim 命令 df, 删除到逗号,这应该能满足你的需求吧