ReSharper有一个很好的功能,称为“扩展选择”:通过反复按CTRL+W
(我认为这是默认值),您可以从当前的插入符号位置选择越来越多。首先它是一个单词,然后是越来越多的单词,一行,内部和外部的行块(例如if-block),然后是一个函数等......
基本上,通过反复按键组合,您最终可以选择整个文件。我相信至少你们中的一些人会熟悉它。
我刚开始学习vim的所有复杂功能,而且我没有足够的经验来看看这样的事情是如何在Vim中实现的(尽管我认为这是可能的)。所以我的问题是针对那里的Vim大师:这可以做到吗?如何做?
更新:一些背景故事。我一直在和我的前任老板谈论Vim的所有好处,他认为这一切都很棒。他唯一的问题是:它有“扩展选择”吗?到目前为止,我的问题是 no 。所以,如果有人知道答案,我最终会赢得讨论:P(并且可能会创建一个新的Vim转换:-)
)
答案 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进入可视模式然后点击:
我相信这里的其他人也可以添加到此列表中。哦,不要忘记Visual Block模式C-v在vim中尝试使用上述命令,它在两个维度上工作: - )
答案 2 :(得分:2)
如果您正在谈论Vim(并且您应该是:-),您可以使用v
命令开始标记文本,然后您拥有所有标准光标移动命令(并且,如您所知,那里它们是 lot ),它们将扩展选择范围,以及移动光标。
然后,您只需对所选文本执行任何操作。
有关血腥的详细信息,请参阅here。
答案 3 :(得分:2)
需要编写一个保存当前选择的函数,然后尝试越来越广泛的选择,直到新选择超过保存的选择或选择所有文本。一些可能的选择是:
答案 4 :(得分:1)
我认为Jeremy Wall正朝着正确的方向前进。为了进一步朝这个方向发展,你可以看看Tim Pope的“surround.vim”剧本。有一个很好的描述on github。或者,如果您愿意,请从vim.org获取。它可能会帮助你做一些你想做的事情,虽然它似乎没有一个功能可言,只需在标签内选择。如果我错了,请告诉我。
最终,你真正喜欢的是封闭文本对象的层次结构。如果没有,你应该阅读文本对象。一个很好的概述是here。请注意,您可以使用计数一次性获取多个对象,或者以迭代方式执行此操作(从正常模式尝试vawasap}}}
)。
您还可以获取定义其他文本对象的脚本,例如使用缩进定义文本对象的this one。如果您按照通用标准进行格式化,并且保证用于python,它将适用于多种语言。
一个烦恼是光标最终位于可视块的末尾,因此,例如,你不能轻易地选择some()之间的所有内容,然后获取它们之前的函数名... < / p>
...但是,我刚刚在this post中发现您可以使用o
更改此行为。酷!
我怀疑从长远来看,你会发现自己能够更有效地跳过中间选择。
无论如何,我很想知道是否还有其他人想出更通用的解决方案!