2009-04-18 61 views
7

ReSharper有一个很好的功能,称为“扩展选择”:通过反复按CTRL+W(我认为这是默认设置),您可以从当前的脱字符位置选择越来越多。首先它是一个词,然后越来越多的单词,一行,内部然后外部块的行(例如一个if块),然后功能等...有没有办法在Vim中模拟ReSharper的“扩展选择”功能?

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

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

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

+1

令人惊讶的是,在这里没有人回答认识到需要适当的(部分)解析器。 Resharper在代码的逻辑模型之上实现了这个(很棒的)功能:代码DOM。这也是使重构能够处理所做选择的原因。没有合适的解析器,你会选择“事物”,但不是适当的(子)表达式。后者会很有用,但目前Vim不支持_That。除非你指望Lisp支持:`vabababo2k`对lisp_来说是完美的:) – sehe 2011-09-06 13:54:08

+0

@sehe:当然,你是完全正确的。自从我问这个问题以来,我一直在想这个问题(好像很久以前!),并意识到,即使我以某种方式设法创建此功能,它将只适用于特定语言或一族语言。太糟糕了,不是吗? :) – 2011-09-07 17:52:23

+0

我也一直在琢磨这个。我对90%的解决方案感到满意(我现在可以手动对Vim进行非常快速的重构)。然而,“可用的”子表达式匹配选择扩展器真的是我的第一梦想特征。我确信很有可能提出一个解析器,它将为C#,Java,C++和C提供DoTheRightThing;我期望的唯一粘性边缘情况是C#与C++ 0x lambdas。所以我可能会把它们留出一段时间(并确保它是可插拔的)。我仍然在决定使用什么,因为我有种恶意的vim脚本。我倾向于python,但厌倦了排除用户基础的问题 – sehe 2011-09-07 19:40:12

回答

3

我很快就解决了这个问题。它不工作。随意编辑并在vim wiki上发布,或者如果你对它进行了改进,可以作为一个插件。

机会,你会想使AG:resharp_list每种语言(一个用于paranthesised语言如,等。)

所有这一切需要的是原来的光标位置的标记:他标记和一个超时自动命令重置索引。

"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> 
3

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

我的一些最爱?先打v当在正常模式下获得视觉模式然后打:

  1. IW - 选择内字。非常适合选择一个词,同时排除周围的大括号或引号
  2. w - 多次点击以继续选择每个后续单词。
  3. b - 选择字方式backwords
  4. ^ - 选择所有从当前位置到文本开始在网上
  5. $ - 选择所有从当前位置到行尾的

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

+0

我对视觉模式相对比较熟悉,但关键的区别是,你必须移动你的手指,并实际上想要选择下一个(或换句话说,_where_延长您的选择)。目标是将所有这些按顺序合并到单个组合键。 [我希望我已经清楚了,我不是母语英语演讲者] – 2009-04-18 12:18:32

2

如果你在谈论Vim(你应该是:-),你可以开始用v命令标记文本,那么你有所有的标准光标移动命令(并且,如你所知,它们有一个批号),这将扩展选择,以及移动光标。

然后,您只需使用所选文字执行任何操作。

查看here为血淋淋的细节。

2

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

  • VIW - 选择字
  • 可见 - 选择句子
  • 贵宾 - 选择段落
  • VIB - 最里面的括号
  • v2iB中选择文本 - 在未来选择文本最内圈的支架
  • ggVG - 全选文字
1

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

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

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

一个令人烦恼的事情是,游标最终会出现在视觉模块的末尾,例如,您不能轻易选择some()之间的所有内容,然后获取它们之前的函数名称......

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

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

无论如何,我会好奇的看看是否有其他人提出了更通用的解决方案!

相关问题