monaco-editor实现全局内容和文件搜索

写在前面 欢迎关注公众号:java开发高级进阶, 有不会的可以直接公众号留言提问

monaco-editor不提供全局搜索,只提供单个文件内的搜索,那么如何实现全局搜索呢?

环境:Nodejs + React + Dva + monaco-editor + react-monaco-editor + antd

一、绑定快捷键

调用editor.addCommand方法绑定快捷键,通过monaco.KeyMod和monaco.KeyCode选择快捷键

快捷键要在编辑器创建完成时创建,故这段代码要写在editorDidMount里面

全局搜索要有一个搜索框供输入关键字,故在触发快捷键的时候让搜索框显示,默认是不显示。代码如下:

editorDidMount = (editor, monaco) => {
	editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KEY_F, () => {
		// 显现全局搜索框
		this.setState({
			showModel: true
		})
	});

	editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KEY_N, () => {
		// 显现文件搜索框
		this.setState({
			showFileModel: true
		})
	});
	editor.focus();
}
复制代码

二、搜索框实现

搜索框样式主要看自己的需求,我这里只写个简单的搜索框

如何实现搜索框根据内容多少滚动显示列表是我们要考虑的一个问题,经过一番搜索,我锁定了react-infinite-scroller,通过InfiniteScroll API实现滚动下拉效果。代码如下:

<div style={
   {height:'400px', overflow:'auto'}}>
	<InfiniteScroll
			pageStart={0}
			loadMore={true}
			hasMore={true || false}
			loader={null}
			useWindow={false}
	>
		{rowsList}
	</InfiniteScroll>
</div>
复制代码

三、关键字搜索功能

monaco-editor不提供全局搜索功能,如果要在monaco-editor基础上实现全局搜索,我们可以借助单个文件的搜索功能,然后遍历业务系统的所有文件,对每个文件的搜索结果进行汇总实现全局搜索。

这里需要考虑几个问题:

(1)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Monaco Editor 是一个非常强大的在线代码编辑器,它是 Visual Studio Code 的核心编辑器。Monaco Editor 支持多文件编辑,可以在同一个编辑器窗口中打开多个文件实现文件编辑。 要实现文件编辑,可以使用 Monaco Editor 提供的 `editor.createModel()` 方法创建多个模型,每个模型对应一个文件。然后,可以使用 `editor.setModel()` 方法将一个模型关联到编辑器上。通过这种方式,可以在一个编辑器窗口中打开多个文件。 以下是一个简单的示例,演示如何在 Monaco Editor实现文件编辑: ```javascript // 创建两个模型 var model1 = monaco.editor.createModel('Hello, world!', 'text/plain'); var model2 = monaco.editor.createModel('function add(a, b) {\n return a + b;\n}', 'text/plain'); // 创建编辑器 var editor = monaco.editor.create(document.getElementById('container'), { model: model1 }); // 切换模型 function switchModel(model) { editor.setModel(model); } // 在 UI 中显示多个文件 var file1 = document.createElement('div'); file1.textContent = 'File 1'; file1.addEventListener('click', function() { switchModel(model1); }); document.body.appendChild(file1); var file2 = document.createElement('div'); file2.textContent = 'File 2'; file2.addEventListener('click', function() { switchModel(model2); }); document.body.appendChild(file2); ``` 在上面的示例中,我们创建了两个模型(`model1` 和 `model2`),分别对应两个文件。然后,我们创建了一个编辑器,并将其关联到第一个模型。最后,我们在 UI 中创建了两个元素,分别对应两个文件,点击这些元素可以切换编辑器中显示的模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值