7

ReSharper 有一个很好的功能,称为“扩展选择”:通过反复按CTRL+W(我认为这是默认设置),您可以从当前插入符号位置选择越来越多的内容。首先是一个单词,然后是越来越多的单词,一行,内部然后是外部行块(例如 if 块),然后是一个函数,等等......

基本上,通过反复按下组合键,您最终可以选择整个文件。我相信至少你们中的一些人会熟悉它。

我刚刚开始学习 vim 的所有复杂性,但我没有足够的经验来了解如何在 Vim 中实现这样的事情(尽管我认为这是可能的)。所以我的问题是针对 Vim 大师的:这可以做到吗?怎么做?

更新:一些背景故事。我一直在和我的前老板谈论 Vim 的所有好处,他认为这一切都很棒。他唯一的问题/问题是:它有“扩展选择”吗?到目前为止,我的问题是否定的。所以,如果有人知道答案,我最终会赢得讨论:P(也许创建一个新的 Vim 转换:-)

4

5 回答 5

3

答案是肯定的。进入可视模式后,您可以使用所有常规导航方法以及一些额外的导航方法。

我最喜欢的一些?首先在正常模式下按 v 以进入视觉模式,然后按:

  1. iw - 选择内部单词。非常适合选择一个单词,同时排除周围的大括号或引号
  2. w - 多次点击以继续选择每个后续单词。
  3. b - 选择 wordwise backwords
  4. ^ - 选择从当前位置到行首的所有内容
  5. $ - 从当前位置到行尾全选

我相信这里的其他人也可以添加到这个列表中。哦,别忘了 Visual Block 模式 Cv 用上面的命令在 vim 中试用它,它在二维中工作:-)

于 2009-04-18T00:37:18.007 回答
3

我快速解决了这个问题。它不能按原样工作。随意在 vim wiki 上进行编辑和发布,如果您对其进行了改进,也可以将其作为插件发布。

您可能想为每种语言制作 ag:resharp_list (例如,一个用于括号语言等)

所需要的只是原始光标位置的标记:标记和重置索引的超时自动命令。

"resharp emulator
"TODO this needs a marker
"also c-w is bad mapping as it has a lag with all the other-
"window mappings
"
let g:resharp_index = 0

let g:resharp_select =  ['iw', 'is', 'ip', 'ggVG']

func! ResharpSelect()
    if g:resharp_index >= len (g:resharp_select)
        let g:resharp_index = 0
    endif

    exe "norm \<esc>v" . g:resharp_select[g:resharp_index]
    let g:resharp_index = g:resharp_index + 1
endfun

nnoremap <c-w>  :call ResharpSelect()<cr>
vnoremap <c-w>  :call ResharpSelect()<cr>

"Something to reset on timeout. TODO this doesn't work
au CursorHold :let g:resharp_index = 0<cr>
于 2009-04-18T02:24:32.477 回答
2

如果你在谈论 Vim(你应该是 :-),你可以开始用v命令标记文本,那么你就有了所有标准的光标移动命令(而且,正如你所知,有很多),这将扩展选择,以及移动光标。

然后,您只需对所选文本做任何您想做的事情。

有关血腥细节,请参见此处

于 2009-04-18T00:37:44.263 回答
2

需要编写一个函数来保存当前选择,然后尝试越来越宽的选择,直到新选择超过已保存的选择或选择所有文本。一些可能的选择是:

  • viW - 选择单词
  • vis - 选择句子
  • vip - 选择段落
  • viB - 选择最里面的括号内的文本
  • v2iB - 在下一个最里面的括号内选择文本
  • ggVG - 选择所有文本
于 2009-04-18T00:40:10.310 回答
1

我认为杰里米沃尔的方向是正确的。为了进一步了解这个方向,您可以查看 Tim Pope 的“surround.vim”脚本。github 上有一个很好的描述。或者,如果您愿意,可以从vim.org 获取。它可能会帮助你做一些你想做的事情,尽管它似乎没有一个功能,比如在标签中选择。让我知道我是否错了。

最终,您真正想要的是封闭文本对象的层次结构。如果你没有,你应该阅读文本对象。这里有一个很好的概述。请注意,您可以使用计数一次抓取多个对象,或者迭代地执行此操作(vawasap}}}从正常模式尝试)。

您还可以获得定义其他文本对象的脚本,例如使用缩进定义文本对象的脚本。如果您根据通用标准进行格式化,它将适用于多种语言,并保证适用于 python。

一个烦恼是光标结束在可视块的末尾,因此,例如,您不能轻松地选择一些 () 之间的所有内容,然后获取它们之前的函数名称......

...但是,我刚刚在这篇文章中发现您可以使用o. 凉爽的!

我怀疑从长远来看,您会发现自己能够跳过中间选择更有效率。

无论如何,我很想看看其他人是否也提出了更通用的解决方案!

于 2011-06-10T21:53:50.297 回答