1

我患有一种疾病,无论软件功能多么完善,我总是不满意。

我对从光标开始快速删除/拉动/更改/等一系列文本的能力感到非常满意。

但似乎没有一种以我认为最佳的方式快速而精确地导航实际光标的好方法:

考虑在编辑代码时(在编辑散文时这不是问题),一个是处理繁重的语法,'"[{(<字符分布在空格之间(为了灵活性,我放弃了制表符,而是使用所有空格,但这并不影响这一点)。这意味着在非单词字符之间跳转的任何有用方法都将跳过代码边界,人们经常需要在代码边界之间执行编辑操作。

因此,虽然b,ew它们的移位(反向运动)对应物(以及我从未使用过的ge/ gE)在一定程度上是有帮助的,但它们并没有提供有用的粒度到零。

这是我的想法:一个神秘的键 X 作为前向搜索ft(以及它们的后向搜索对应物FT)的扩展,它需要两个按键参数而不是一个:

给定这个起始状态,光标位于n第二行的字符上:

watch: {
  files: ['<%= jshint.files %>'],
} //   Cursor Here ^

我可以输入Xjs,这将做的是在光标左侧搜索 first j,在光标右侧搜索 hte first s,然后对该范围执行操作。

例如cXjsfoo产量

watch: {
  files: ['<%= foo %>'],
}

cXjtbaz产量(有时等同于ciwbaz,但更精确,iw取决于 iskeyword!

watch: {
  files: ['<%= baz.files %>'],
}

dX%%猛拉%= baz.files %离开(即使surround.vimas%未被识别为匹配对,这也是不可能的,我也不一定希望它被视为一个):

watch: {
  files: ['<>'],
}

等等。

也许另一种思考方式是在指定动词后将光标移动到起始点的追溯方法。

是的,从技术上讲,这样做并不太难F%df%,但dX%%在我的脑海中更有意义,因此,F%df%对我来说,实际上从来没有比 eg 更快hhhhhhhdf%。进一步考虑X将很容易绑定到单个键,因此在这种情况下实际上是我们保存的两个按键。

我知道我可以通过 Sublime Text 复古模式的键绑定来做到这一点;它足够强大。但是 Vim 呢?可能吗?

4

2 回答 2

2
onoremap <silent> X :<C-u>execute 'normal! vlF' . nr2char(getchar()) . 'of' . nr2char(getchar())<CR>
vnoremap <silent> X :<C-u>execute 'normal! vlF' . nr2char(getchar()) . 'of' . nr2char(getchar())<CR>

<C-u>清除命令行(以防'<,'>自动插入);execute 'normal!'然后计算以下表达式并将其作为普通命令执行:

'vlF' . nr2char(getchar()) . 'of' . nr2char(getchar())

这将等待接下来的 2 个键(例如js)并将它们连接到vlFjofs中,从而产生一个从上一个跨越j到下一个的文本对象s。如果您的光标当前位于您输入的第一个字符上,则l之前是必需的。F

于 2013-08-15T05:36:27.903 回答
2

我不完全确定你所问的相关性。您问题中的所有示例都可以通过使用 Vim 中已有的内容轻松处理。

第一个示例([x]标记光标位置):

    watch: {
      files: ['<%= jshi[n]t.files %>'],
    }

    ciWfoo

    watch: {
      files: ['<%= fo[o] %>'],
    }

第二个例子:

    watch: {
      files: ['<%= jshi[n]t.files %>'],
    }

    ciwbaz

    watch: {
      files: ['<%= ba[z].files %>'],
    }

第三个例子:

    watch: {
      files: ['<%= ba[z].files %>'],
    }

    di<

    watch: {
      files: ['<[>]'],
    }

创建新的文本对象确实很有趣也很有用,但要确保你没有想太多。

于 2013-08-15T08:12:36.783 回答