我正在寻找替换vim的“替换字符”命令 - 具体来说,我希望能够选择一些文本并用我键入的某些字符替换每个字符(难度:没有“复古”模式)
示例:
从
开始 I am some text with an arbitrary number: 12358998281
我想要一种简单的方法来选择12358998281
并将其转换为99999999999
,以便得到结果
I am some text with an arbitrary number: 99999999999
(在vim中,这可以通过将光标移动到12358998281
的开头,选择ve
,然后按r9
)来完成。
我可以通过选择文本,打开“查找”对话框,确保启用“正在选择”和“通过正则表达式”,搜索。,然后在生成的多选中键入我的角色。但这非常费力,它阻止我在多选中执行此过程(例如,如果文件的多个部分中存在12358998281
,我可能希望用{{1}快速替换它的所有实例,而不是执行上面的过程,获取替换,将其复制到剪贴板,然后替换为)。
Sublime是否有一个命令,就像vim的“替换”一样,我可以绑定到某个东西,或者我是否必须编写一个宏来获取我需要的东西?或者,我是从完全错误的方向接近这个吗?
更广泛的思考方式是“如果有帮助,我怎样才能将选择分解为所有字符的多选”。
答案 0 :(得分:0)
通过使用此包https://sublime.wbond.net/packages/RegReplace,您可以创建正则表达式模式并将它们绑定到快捷方式。
此外,如果一个单词出现多次,您可以将光标放在单词的任何部分,并按CTRL + D多次。按一次CTRL + D按钮将选择光标下的单词,每按一次将选择下一个单词出现。
如果您的单词包含一些随机字符,您还可以使用https://sublime.wbond.net/packages/Expand%20Selection%20to%20Whitespace将选区扩展为空格,然后按CTDL + D选择该单词的下一个匹配项。
编辑:使用包正则表达式快捷方式确实必须在绑定它们之前创建正则表达式。但CTRL + D没有它就可以工作。 我没有看到使用“扩展选择到空白”而不是像我在答案中所写的那样使用CTRL + D。
我已经检查了你在问题中写的视觉用法,这个解决方案似乎要快得多。您不必将光标放在单词的开头,因为它可以在单词中,并且不需要查找/替换,因为您将通过按住CTRL + D一秒钟来多选所有出现,并且您将成为免费编辑。
如果标准CTRL + D不能用于某些文本,或者选择空格选择太多文本,您也可以使用https://sublime.wbond.net/packages/Expand%20Selection%20to%20Quotes选择引号内的文本并将其与CTRL + D组合。
答案 1 :(得分:0)
我最终用一个简单的(如果不优雅的)插件来解决这个问题:
import sublime_plugin
import sublime
class MultiSelectWithinSelectedCommand(sublime_plugin.TextCommand):
def run(self, edit):
selection = self.view.sel()
new_regions = []
for selected_region in selection:
if selected_region.empty():
selection.add(self.view.word(selected_region))
for selected_region in selection:
if selected_region.a > selected_region.b:
region_begin = selected_region.b
else:
region_begin = selected_region.a
for pos in range(selected_region.size()):
subregion_begin = region_begin + pos
subregion_end = subregion_begin + 1
new_regions.append(sublime.Region(subregion_begin, subregion_end))
selection.clear()
selection.add_all(new_regions)
一旦我把它放在我的插件目录中,我会像往常一样在keymap文件中绑定一个命令:
{ "keys": ["alt+f"], "command": "multi_select_within_selected" }
(任意选择alt + f),并使用按键对所有选定的字符进行多选(之后,我可以按下我的替换字符)。