美文网首页
实现 Monaco Editor 搜索功能

实现 Monaco Editor 搜索功能

作者: 翔子丶 | 来源:发表于2021-04-24 16:32 被阅读0次
    实现 Monaco Editor 搜索功能

    官网

    一直使用 Monaco Editor 作为项目中的代码编辑器,但是缺少搜索功能,直接使用浏览器的搜索不能实现定位,所以根据 API 写了一个搜索功能

    • 模拟网页搜索页面实现

      <section v-show="showInput" class="search-input">
        <a-input v-model="searchValue" ref="input" @change="findAllMatches(searchValue)" />
        <p style="color: #fff;font-size: 16px;margin-bottom: 0;">
          {{ allMatches.length ? matchIndex + 1 : matchIndex }}/{{ allMatches.length }}
        </p>
        <a-divider style="height: 30px;color:#ACAEB1;" type="vertical" />
        <a-icon
          style="color: #ACAEB1;font-size: 16px;margin-right: 8px;cursor: pointer;"
          type="down"
          @click="goto('preview', !allMatches.length || matchIndex >= allMatches.length - 1)"
          :style="{ cursor: !allMatches.length || matchIndex >= allMatches.length - 1 ? 'not-allowed' : 'pointer' }"
        />
        <a-icon
          style="color: #ACAEB1;font-size: 16px;margin-right: 8px;cursor: pointer;"
          type="up"
          @click="goto('next', !allMatches.length || matchIndex <= 0)"
          :style="{ cursor: !allMatches.length || matchIndex <= 0 ? 'not-allowed' : 'pointer' }"
        />
        <a-icon
          style="color: #ACAEB1;font-size: 16px;margin-right: 8px;cursor: pointer;"
          type="close"
          @click="showInput = false"
        />
      </section>
      
    • mounted 中定义 crtl + f 方法

      mounted () { this.$nextTick(() => { // 定义crtl+f搜索方法 this.monacoInstance.addCommand(monaco.KeyMod.CtrlCmd |
      monaco.KeyCode.KEY_F, () => { this.showInput = true this.$nextTick(() => { this.$refs.input.focus() }) }) }) }
      
    • 定义查找内容方法

      // 匹配所有选择内容 并将内容保存到allMatches数组中 用于点击上下按钮时获取range
          findAllMatches(searchText) {
            const { monacoInstance } = this
            this.allMatches = []
            if (searchText) {
              const data = monacoInstance.getModel().findMatches(searchText)
              data.forEach((item, index) => {
                const {
                  range: { startLineNumber, endLineNumber, startColumn, endColumn }
                } = item
                let range = new monaco.Range(startLineNumber, startColumn, endLineNumber, endColumn)
                this.allMatches.push(range)
                if (index === 0) {
                  monacoInstance.setSelection(range)
                  monacoInstance.revealRangeInCenter(range)
                }
              })
            }
            this.matchIndex = 0
            return this.allMatches
          },
      
    • 定义焦点跳转方法

      // 点击上下按钮 移动选中位置
          goto(type, flag) {
            if (flag) return
            type === 'preview' ? this.matchIndex++ : this.matchIndex--
            const { allMatches, matchIndex, monacoInstance } = this
            const range = allMatches[matchIndex]
            const model = monacoInstance.getModel()
            monacoInstance.setModel(model)
            monacoInstance.setSelection(range)
            monacoInstance.revealRangeInCenter(range)
          }
      

    相关文章

      网友评论

          本文标题:实现 Monaco Editor 搜索功能

          本文链接:https://www.haomeiwen.com/subject/pollrltx.html