有没有办法在Vim中模拟ReSharper的“扩展选择”功能?

时间:2009-04-18 00:13:33

标签: vim editor resharper text-editor

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

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

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

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

5 个答案:

答案 0 :(得分:3)

我快速解决了这个问题。它不能正常工作。如果您对其进行了改进,请随意在vim wiki上进行编辑和发布。

你有可能想为每种语言制作一个g: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>

答案 1 :(得分:2)

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

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

  1. iw - 选择内部单词。非常适合选择单词,同时排除周围的大括号或引号
  2. w - 多次点击以继续选择每个后续单词。
  3. b - 选择单词后缀
  4. ^ - 选择从当前位置到第
  5. 行的文字开头的所有内容
  6. $ - 从当前位置到行尾选择所有内容
  7. 我相信这里的其他人也可以添加到此列表中。哦,不要忘记Visual Block模式C-v在vim中尝试使用上述命令,它在两个维度上工作: - )

答案 2 :(得分:2)

如果您正在谈论Vim(并且您应该是:-),您可以使用v命令开始标记文本,然后您拥有所有标准光标移动命令(并且,如您所知,那里它们是 lot ),它们将扩展选择范围,以及移动光标。

然后,您只需对所选文本执行任何操作。

有关血腥的详细信息,请参阅here

答案 3 :(得分:2)

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

  • viW - 选择单词
  • vis - 选择句子
  • vip - 选择段落
  • viB - 选择最里面括号内的文字
  • v2iB - 在下一个最里面的括号中选择文字
  • ggVG - 选择所有文字

答案 4 :(得分:1)

我认为Jeremy Wall正朝着正确的方向前进。为了进一步朝这个方向发展,你可以看看Tim Pope的“surround.vim”剧本。有一个很好的描述on github。或者,如果您愿意,请从vim.org获取。它可能会帮助你做一些你想做的事情,虽然它似乎没有一个功能可言,只需在标签内选择。如果我错了,请告诉我。

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

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

一个烦恼是光标最终位于可视块的末尾,因此,例如,你不能轻易地选择some()之间的所有内容,然后获取它们之前的函数名... < / p>

...但是,我刚刚在this post中发现您可以使用o更改此行为。酷!

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

无论如何,我很想知道是否还有其他人想出更通用的解决方案!