升级依赖版本.

This commit is contained in:
lijiahang
2024-06-04 10:47:32 +08:00
parent 9386bfc5c1
commit cd59c51344
16 changed files with 896 additions and 588 deletions

View File

@@ -65,6 +65,9 @@ public class TerminalPreferenceModel implements PreferenceModel {
@Schema(description = "行高") @Schema(description = "行高")
private Double lineHeight; private Double lineHeight;
@Schema(description = "字间距")
private Integer letterSpacing;
@Schema(description = "文本字重") @Schema(description = "文本字重")
private String fontWeight; private String fontWeight;
@@ -129,6 +132,9 @@ public class TerminalPreferenceModel implements PreferenceModel {
@Schema(description = "WebGL 渲染插件") @Schema(description = "WebGL 渲染插件")
private Boolean enableWebglPlugin; private Boolean enableWebglPlugin;
@Schema(description = "unicode11 插件")
private Boolean enableUnicodePlugin;
@Schema(description = "图片渲染插件") @Schema(description = "图片渲染插件")
private Boolean enableImagePlugin; private Boolean enableImagePlugin;

View File

@@ -24,6 +24,7 @@ public class TerminalPreferenceStrategy implements IPreferenceStrategy<TerminalP
.fontFamily("_") .fontFamily("_")
.fontSize(13) .fontSize(13)
.lineHeight(1.12) .lineHeight(1.12)
.letterSpacing(1)
.fontWeight("normal") .fontWeight("normal")
.fontWeightBold("bold") .fontWeightBold("bold")
.cursorStyle("bar") .cursorStyle("bar")
@@ -48,6 +49,7 @@ public class TerminalPreferenceStrategy implements IPreferenceStrategy<TerminalP
String defaultPluginsSetting = TerminalPreferenceModel.PluginsSettingModel.builder() String defaultPluginsSetting = TerminalPreferenceModel.PluginsSettingModel.builder()
.enableWeblinkPlugin(true) .enableWeblinkPlugin(true)
.enableWebglPlugin(true) .enableWebglPlugin(true)
.enableUnicodePlugin(true)
.enableImagePlugin(false) .enableImagePlugin(false)
.build() .build()
.toJsonString(); .toJsonString();

View File

@@ -36,6 +36,14 @@
"@dangojs/a-query-header": "^0.0.31", "@dangojs/a-query-header": "^0.0.31",
"@sanqi377/arco-vue-icon-picker": "^1.0.7", "@sanqi377/arco-vue-icon-picker": "^1.0.7",
"@vueuse/core": "^9.3.0", "@vueuse/core": "^9.3.0",
"@xterm/addon-canvas": "^0.7.0",
"@xterm/addon-fit": "^0.10.0",
"@xterm/addon-image": "^0.8.0",
"@xterm/addon-search": "^0.15.0",
"@xterm/addon-unicode11": "^0.8.0",
"@xterm/addon-web-links": "^0.11.0",
"@xterm/addon-webgl": "^0.18.0",
"@xterm/xterm": "^5.5.0",
"axios": "^0.24.0", "axios": "^0.24.0",
"cron-parser": "^4.9.0", "cron-parser": "^4.9.0",
"dayjs": "^1.11.5", "dayjs": "^1.11.5",
@@ -49,18 +57,12 @@
"pinia": "^2.0.23", "pinia": "^2.0.23",
"query-string": "^8.0.3", "query-string": "^8.0.3",
"sortablejs": "^1.15.0", "sortablejs": "^1.15.0",
"streamsaver": "^2.0.6",
"ts-md5": "^1.3.1", "ts-md5": "^1.3.1",
"vue": "^3.2.40", "vue": "^3.2.40",
"vue-echarts": "^6.2.3", "vue-echarts": "^6.2.3",
"vue-i18n": "^9.2.2", "vue-i18n": "^9.2.2",
"vue-router": "^4.0.14", "vue-router": "^4.0.14"
"xterm": "^5.3.0",
"xterm-addon-canvas": "^0.5.0",
"xterm-addon-fit": "^0.8.0",
"xterm-addon-image": "^0.5.0",
"xterm-addon-search": "^0.13.0",
"xterm-addon-web-links": "^0.9.0",
"xterm-addon-webgl": "^0.16.0"
}, },
"devDependencies": { "devDependencies": {
"@arco-plugins/vite-vue": "^1.4.5", "@arco-plugins/vite-vue": "^1.4.5",
@@ -71,6 +73,7 @@
"@types/mockjs": "^1.0.7", "@types/mockjs": "^1.0.7",
"@types/nprogress": "^0.2.0", "@types/nprogress": "^0.2.0",
"@types/sortablejs": "^1.15.0", "@types/sortablejs": "^1.15.0",
"@types/streamsaver": "^2.0.4",
"@typescript-eslint/eslint-plugin": "^5.40.0", "@typescript-eslint/eslint-plugin": "^5.40.0",
"@typescript-eslint/parser": "^5.40.0", "@typescript-eslint/parser": "^5.40.0",
"@vitejs/plugin-vue": "^3.1.2", "@vitejs/plugin-vue": "^3.1.2",

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,9 @@
import type { IDisposable, ITerminalInitOnlyOptions, ITerminalOptions, Terminal } from 'xterm'; import type { IDisposable, ITerminalInitOnlyOptions, ITerminalOptions, Terminal } from '@xterm/xterm';
import type { FitAddon } from 'xterm-addon-fit'; import type { FitAddon } from '@xterm/addon-fit';
import type { SearchAddon } from 'xterm-addon-search'; import type { SearchAddon } from '@xterm/addon-search';
import type { WebLinksAddon } from 'xterm-addon-web-links'; import type { WebLinksAddon } from '@xterm/addon-web-links';
import type { WebglAddon } from 'xterm-addon-webgl'; import type { WebglAddon } from '@xterm/addon-webgl';
import type { Unicode11Addon } from '@xterm/addon-unicode11';
// 执行类型 // 执行类型
export type ExecType = 'BATCH' | 'JOB'; export type ExecType = 'BATCH' | 'JOB';
@@ -61,6 +62,7 @@ export const LogAppenderOptions: ITerminalOptions & ITerminalInitOnlyOptions = {
fontSize: 13, fontSize: 13,
lineHeight: 1.12, lineHeight: 1.12,
convertEol: true, convertEol: true,
allowProposedApi: true,
}; };
// dom 引用 // dom 引用
@@ -85,6 +87,7 @@ export interface LogAddons extends Record<string, IDisposable> {
webgl: WebglAddon; webgl: WebglAddon;
search: SearchAddon; search: SearchAddon;
weblink: WebLinksAddon; weblink: WebLinksAddon;
unicode: Unicode11Addon;
} }
// 执行日志 appender 定义 // 执行日志 appender 定义

View File

@@ -8,11 +8,12 @@ import { Message } from '@arco-design/web-vue';
import { useDebounceFn } from '@vueuse/core'; import { useDebounceFn } from '@vueuse/core';
import { addEventListen, removeEventListen } from '@/utils/event'; import { addEventListen, removeEventListen } from '@/utils/event';
import { copy as copyText } from '@/hooks/copy'; import { copy as copyText } from '@/hooks/copy';
import { Terminal } from 'xterm'; import { Terminal } from '@xterm/xterm';
import { FitAddon } from 'xterm-addon-fit'; import { FitAddon } from '@xterm/addon-fit';
import { SearchAddon } from 'xterm-addon-search'; import { SearchAddon } from '@xterm/addon-search';
import { WebLinksAddon } from 'xterm-addon-web-links'; import { WebLinksAddon } from '@xterm/addon-web-links';
import { WebglAddon } from 'xterm-addon-webgl'; import { WebglAddon } from '@xterm/addon-webgl';
import { Unicode11Addon } from '@xterm/addon-unicode11';
// 执行日志 appender 实现 // 执行日志 appender 实现
export default class LogAppender implements ILogAppender { export default class LogAppender implements ILogAppender {
@@ -130,15 +131,19 @@ export default class LogAppender implements ILogAppender {
const search = new SearchAddon(); const search = new SearchAddon();
const webgl = new WebglAddon(); const webgl = new WebglAddon();
const weblink = new WebLinksAddon(); const weblink = new WebLinksAddon();
const unicode = new Unicode11Addon();
terminal.loadAddon(fit); terminal.loadAddon(fit);
terminal.loadAddon(search); terminal.loadAddon(search);
terminal.loadAddon(webgl); terminal.loadAddon(webgl);
terminal.loadAddon(weblink); terminal.loadAddon(weblink);
terminal.loadAddon(unicode);
terminal.unicode.activeVersion = '11';
return { return {
fit, fit,
search, search,
webgl, webgl,
weblink weblink,
unicode
}; };
} }

View File

@@ -176,7 +176,7 @@
import { downloadExecJobLogFile } from '@/api/job/exec-job-log'; import { downloadExecJobLogFile } from '@/api/job/exec-job-log';
import { downloadFile } from '@/utils/file'; import { downloadFile } from '@/utils/file';
import XtermSearchModal from '@/components/xtrem/search-modal/index.vue'; import XtermSearchModal from '@/components/xtrem/search-modal/index.vue';
import 'xterm/css/xterm.css'; import '@xterm/xterm/css/xterm.css';
const props = defineProps<{ const props = defineProps<{
type: ExecType; type: ExecType;

View File

@@ -58,7 +58,7 @@
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import type { ISearchOptions } from 'xterm-addon-search'; import type { ISearchOptions } from '@xterm/addon-search';
import useVisible from '@/hooks/visible'; import useVisible from '@/hooks/visible';
import { nextTick, ref } from 'vue'; import { nextTick, ref } from 'vue';

View File

@@ -29,6 +29,7 @@ export interface TerminalDisplaySetting {
fontFamily?: string; fontFamily?: string;
fontSize?: number; fontSize?: number;
lineHeight?: number; lineHeight?: number;
letterSpacing?: number;
fontWeight?: string | number; fontWeight?: string | number;
fontWeightBold?: string | number; fontWeightBold?: string | number;
cursorStyle?: string; cursorStyle?: string;
@@ -61,6 +62,7 @@ export interface TerminalInteractSetting {
export interface TerminalPluginsSetting { export interface TerminalPluginsSetting {
enableWeblinkPlugin: boolean; enableWeblinkPlugin: boolean;
enableWebglPlugin: boolean; enableWebglPlugin: boolean;
enableUnicodePlugin: boolean;
enableImagePlugin: boolean; enableImagePlugin: boolean;
} }

View File

@@ -13,72 +13,86 @@
<a-form class="terminal-setting-form" <a-form class="terminal-setting-form"
:model="formModel" :model="formModel"
layout="vertical"> layout="vertical">
<a-space> <a-row :gutter="48">
<!-- 字体样式 --> <!-- 字体样式 -->
<a-form-item field="fontFamily" label="字体样式"> <a-col :span="12">
<a-select v-model="formModel.fontFamily" <a-form-item field="fontFamily" label="字体样式">
class="form-item-font-family" <a-select v-model="formModel.fontFamily"
placeholder="请选择字体样式" placeholder="请选择字体样式"
:options="toOptions(fontFamilyKey)" :options="toOptions(fontFamilyKey)"
:allow-create="true" :allow-create="true"
:filter-option="labelFilter"> :filter-option="labelFilter">
<template #option="{ data }"> <template #option="{ data }">
<span :style="{ fontFamily: data.value }">{{ data.label }}</span> <span :style="{ fontFamily: data.value }">{{ data.label }}</span>
</template> </template>
<template #label="{ data }"> <template #label="{ data }">
<span :style="{ fontFamily: data.value }">{{ data.label }}</span> <span :style="{ fontFamily: data.value }">{{ data.label }}</span>
</template> </template>
</a-select> </a-select>
</a-form-item> </a-form-item>
</a-col>
<!-- 字体大小 --> <!-- 字体大小 -->
<a-form-item field="fontSize" label="字体大小"> <a-col :span="12">
<a-select v-model="formModel.fontSize" <a-form-item field="fontSize" label="字体大小">
class="form-item-font-size" <a-select v-model="formModel.fontSize"
placeholder="请选择字体大小" placeholder="请选择字体大小"
:options="toOptions(fontSizeKey)" /> :options="toOptions(fontSizeKey)" />
</a-form-item> </a-form-item>
</a-col>
<!-- 行高 --> <!-- 行高 -->
<a-form-item field="lineHeight" label="行高"> <a-col :span="12">
<a-input-number v-model="formModel.lineHeight" <a-form-item field="lineHeight" label="行高">
class="form-item-line-height" <a-input-number v-model="formModel.lineHeight"
placeholder="请输入行高" placeholder="请输入行高"
:precision="2" :precision="2"
:min="1" :step="0.05"
:max="2" :min="1"
hide-button /> :max="2" />
</a-form-item> </a-form-item>
</a-space> </a-col>
<a-space> <!-- 字间距 -->
<a-col :span="12">
<a-form-item field="lineHeight" label="字间距 (px)">
<a-input-number v-model="formModel.letterSpacing"
placeholder="请输入字间距"
:precision="0"
:step="1"
:min="-5"
:max="5" />
</a-form-item>
</a-col>
<!-- 普通文本字重 --> <!-- 普通文本字重 -->
<a-form-item field="fontWeight" label="普通文本字重"> <a-col :span="12">
<a-select v-model="formModel.fontWeight" <a-form-item field="fontWeight" label="普通文本字重">
class="form-item-font-weight" <a-select v-model="formModel.fontWeight"
placeholder="请选择字重" placeholder="请选择字重"
:options="toOptions(fontWeightKey)" /> :options="toOptions(fontWeightKey)" />
</a-form-item> </a-form-item>
</a-col>
<!-- 加粗文本字重 --> <!-- 加粗文本字重 -->
<a-form-item field="fontWeightBold" label="加粗文本字重"> <a-col :span="12">
<a-select v-model="formModel.fontWeightBold" <a-form-item field="fontWeightBold" label="加粗文本字重">
class="form-item-font-bold-weight" <a-select v-model="formModel.fontWeightBold"
placeholder="请选择字重" placeholder="请选择字重"
:options="toOptions(fontWeightKey)" /> :options="toOptions(fontWeightKey)" />
</a-form-item> </a-form-item>
</a-space> </a-col>
<a-space>
<!-- 光标样式 --> <!-- 光标样式 -->
<a-form-item field="cursorStyle" label="光标样式"> <a-col :span="12">
<a-radio-group type="button" <a-form-item field="cursorStyle" label="光标样式">
v-model="formModel.cursorStyle" <a-radio-group type="button"
class="form-item-cursor-style usn" v-model="formModel.cursorStyle"
:options="toRadioOptions(cursorStyleKey)" /> class="form-item-cursor-style usn"
</a-form-item> :options="toRadioOptions(cursorStyleKey)" />
</a-form-item>
</a-col>
<!-- 光标闪烁 --> <!-- 光标闪烁 -->
<a-form-item field="cursorBlink" label="光标是否闪烁"> <a-col :span="12">
<a-switch v-model="formModel.cursorBlink" <a-form-item field="cursorBlink" label="光标是否闪烁">
type="round" <a-switch v-model="formModel.cursorBlink" type="round" />
class="form-item-cursor-blink" /> </a-form-item>
</a-form-item> </a-col>
</a-space> </a-row>
</a-form> </a-form>
<!-- 预览区域 --> <!-- 预览区域 -->
<div class="terminal-example"> <div class="terminal-example">
@@ -101,7 +115,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { TerminalDisplaySetting } from '@/store/modules/terminal/types'; import type { TerminalDisplaySetting } from '@/store/modules/terminal/types';
import { ref, watch } from 'vue'; import { ref, watch, onMounted } from 'vue';
import { useDictStore, useTerminalStore } from '@/store'; import { useDictStore, useTerminalStore } from '@/store';
import { fontFamilyKey, fontSizeKey, fontWeightKey, fontFamilySuffix, cursorStyleKey } from '../../../types/terminal.const'; import { fontFamilyKey, fontSizeKey, fontWeightKey, fontFamilySuffix, cursorStyleKey } from '../../../types/terminal.const';
import { labelFilter } from '@/types/form'; import { labelFilter } from '@/types/form';
@@ -112,7 +126,7 @@
const { preference, updateTerminalPreference } = useTerminalStore(); const { preference, updateTerminalPreference } = useTerminalStore();
const previewTerminal = ref(); const previewTerminal = ref();
const formModel = ref<TerminalDisplaySetting>({ ...preference.displaySetting }); const formModel = ref<TerminalDisplaySetting>({});
// 监听内容变化 // 监听内容变化
watch(formModel, (v) => { watch(formModel, (v) => {
@@ -137,17 +151,24 @@
previewTerminal.value.term.focus(); previewTerminal.value.term.focus();
}, { deep: true }); }, { deep: true });
// 初始化配置
onMounted(() => {
formModel.value = { ...preference.displaySetting };
});
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
@terminal-width: 458px; @terminal-width: 458px;
.setting-body { .setting-body {
height: 248px; height: 326px;
justify-content: space-between; justify-content: space-between;
} }
:deep(.arco-form) { :deep(.arco-form) {
width: 412px;
.arco-form-item-label { .arco-form-item-label {
user-select: none; user-select: none;
} }
@@ -156,31 +177,10 @@
margin-bottom: 14px; margin-bottom: 14px;
} }
.form-item-font-family {
width: 158px;
}
.form-item-font-size {
width: 148px;
}
.form-item-line-height {
width: 114px;
}
.form-item-font-weight, .form-item-font-bold-weight {
width: 178px;
}
.form-item-font-weight {
margin-right: 70px;
}
.form-item-cursor-style { .form-item-cursor-style {
margin-right: 90px;
.arco-radio-button-content { .arco-radio-button-content {
padding: 0 20px; padding: 0 24px;
} }
} }
} }

View File

@@ -21,6 +21,11 @@
</block-setting-item> </block-setting-item>
</a-row> </a-row>
<a-row class="mb16" align="stretch" :gutter="16"> <a-row class="mb16" align="stretch" :gutter="16">
<!-- unicode11 插件 -->
<block-setting-item label="unicode11 插件" desc="支持 Unicode 11 字符集">
<a-switch type="round"
v-model="formModel.enableUnicodePlugin" />
</block-setting-item>
<!-- 图片渲染插件 --> <!-- 图片渲染插件 -->
<block-setting-item label="图片渲染插件" desc="支持使用 sixel 打开图片 (一般不需要开启)"> <block-setting-item label="图片渲染插件" desc="支持使用 sixel 打开图片 (一般不需要开启)">
<a-switch type="round" <a-switch type="round"

View File

@@ -10,7 +10,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { TerminalThemeSchema } from '@/api/asset/host-terminal'; import type { TerminalThemeSchema } from '@/api/asset/host-terminal';
import { Terminal } from 'xterm'; import { Terminal } from '@xterm/xterm';
import { onMounted, onUnmounted, ref } from 'vue'; import { onMounted, onUnmounted, ref } from 'vue';
const props = defineProps<{ const props = defineProps<{

View File

@@ -40,6 +40,7 @@ export default class SftpTransferDownloader implements ISftpTransferDownloader {
downloadFinish() { downloadFinish() {
if (this.abort) { if (this.abort) {
// 中断则不触发下载 // 中断则不触发下载
this.blobArr = [];
return; return;
} }
try { try {

View File

@@ -1,16 +1,18 @@
import type { UnwrapRef } from 'vue'; import type { UnwrapRef } from 'vue';
import type { ISearchOptions } from '@xterm/addon-search';
import type { TerminalPreference } from '@/store/modules/terminal/types'; import type { TerminalPreference } from '@/store/modules/terminal/types';
import type { ISshSession, ISshSessionHandler, ITerminalChannel, XtermAddons, XtermDomRef } from '../types/terminal.type'; import type { ISshSession, ISshSessionHandler, ITerminalChannel, XtermAddons, XtermDomRef } from '../types/terminal.type';
import { useTerminalStore } from '@/store'; import { useTerminalStore } from '@/store';
import { InputProtocol } from '../types/terminal.protocol'; import { InputProtocol } from '../types/terminal.protocol';
import { fontFamilySuffix, TerminalShortcutType, TerminalStatus } from '../types/terminal.const'; import { fontFamilySuffix, TerminalShortcutType, TerminalStatus } from '../types/terminal.const';
import { Terminal } from 'xterm'; import { Terminal } from '@xterm/xterm';
import { FitAddon } from 'xterm-addon-fit'; import { FitAddon } from '@xterm/addon-fit';
import { WebLinksAddon } from 'xterm-addon-web-links'; import { SearchAddon } from '@xterm/addon-search';
import { ISearchOptions, SearchAddon } from 'xterm-addon-search'; import { WebLinksAddon } from '@xterm/addon-web-links';
import { ImageAddon } from 'xterm-addon-image'; import { ImageAddon } from '@xterm/addon-image';
import { CanvasAddon } from 'xterm-addon-canvas'; import { Unicode11Addon } from '@xterm/addon-unicode11';
import { WebglAddon } from 'xterm-addon-webgl'; import { CanvasAddon } from '@xterm/addon-canvas';
import { WebglAddon } from '@xterm/addon-webgl';
import { playBell } from '@/utils/bell'; import { playBell } from '@/utils/bell';
import { addEventListen } from '@/utils/event'; import { addEventListen } from '@/utils/event';
import SshSessionHandler from './ssh-session-handler'; import SshSessionHandler from './ssh-session-handler';
@@ -63,9 +65,10 @@ export default class SshSession implements ISshSession {
fastScrollModifier: !!preference.interactSetting.fastScrollModifier ? 'alt' : 'none', fastScrollModifier: !!preference.interactSetting.fastScrollModifier ? 'alt' : 'none',
altClickMovesCursor: !!preference.interactSetting.altClickMovesCursor, altClickMovesCursor: !!preference.interactSetting.altClickMovesCursor,
rightClickSelectsWord: !!preference.interactSetting.rightClickSelectsWord, rightClickSelectsWord: !!preference.interactSetting.rightClickSelectsWord,
fontFamily: preference.displaySetting.fontFamily + fontFamilySuffix,
wordSeparator: preference.interactSetting.wordSeparator, wordSeparator: preference.interactSetting.wordSeparator,
fontFamily: preference.displaySetting.fontFamily + fontFamilySuffix,
scrollback: preference.sessionSetting.scrollBackLine, scrollback: preference.sessionSetting.scrollBackLine,
allowProposedApi: true,
}); });
// 处理器 // 处理器
this.handler = new SshSessionHandler(this, domRef); this.handler = new SshSessionHandler(this, domRef);
@@ -192,12 +195,20 @@ export default class SshSession implements ISshSession {
if (preference.pluginsSetting.enableImagePlugin) { if (preference.pluginsSetting.enableImagePlugin) {
this.addons.image = new ImageAddon(); this.addons.image = new ImageAddon();
} }
// unicode11 插件
if (preference.pluginsSetting.enableUnicodePlugin) {
this.addons.unicode = new Unicode11Addon();
}
// 加载插件 // 加载插件
for (const addon of Object.values(this.addons)) { for (const addon of Object.values(this.addons)) {
if (addon) { if (addon) {
this.inst.loadAddon(addon); this.inst.loadAddon(addon);
} }
} }
// 设置 unicode11 版本
if (this.addons.unicode) {
this.inst.unicode.activeVersion = '11';
}
} }
// 设置已连接 // 设置已连接

View File

@@ -60,7 +60,7 @@
import CommandSnippetDrawer from '@/views/host/command-snippet/components/command-snippet-drawer.vue'; import CommandSnippetDrawer from '@/views/host/command-snippet/components/command-snippet-drawer.vue';
import PathBookmarkDrawer from '@/views/host/path-bookmark/components/path-bookmark-drawer.vue'; import PathBookmarkDrawer from '@/views/host/path-bookmark/components/path-bookmark-drawer.vue';
import '@/assets/style/host-terminal-layout.less'; import '@/assets/style/host-terminal-layout.less';
import 'xterm/css/xterm.css'; import '@xterm/xterm/css/xterm.css';
const terminalStore = useTerminalStore(); const terminalStore = useTerminalStore();
const dictStore = useDictStore(); const dictStore = useDictStore();

View File

@@ -1,10 +1,11 @@
import type { Terminal } from 'xterm'; import type { Terminal } from '@xterm/xterm';
import type { FitAddon } from 'xterm-addon-fit'; import type { FitAddon } from '@xterm/addon-fit';
import type { CanvasAddon } from 'xterm-addon-canvas'; import type { CanvasAddon } from '@xterm/addon-canvas';
import type { WebglAddon } from 'xterm-addon-webgl'; import type { WebglAddon } from '@xterm/addon-webgl';
import type { WebLinksAddon } from 'xterm-addon-web-links'; import type { WebLinksAddon } from '@xterm/addon-web-links';
import type { ISearchOptions, SearchAddon } from 'xterm-addon-search'; import type { ISearchOptions, SearchAddon } from '@xterm/addon-search';
import type { ImageAddon } from 'xterm-addon-image'; import type { ImageAddon } from '@xterm/addon-image';
import type { Unicode11Addon } from '@xterm/addon-unicode11';
import type { CSSProperties } from 'vue'; import type { CSSProperties } from 'vue';
import type { HostQueryResponse } from '@/api/asset/host'; import type { HostQueryResponse } from '@/api/asset/host';
@@ -225,6 +226,7 @@ export interface XtermAddons {
weblink: WebLinksAddon; weblink: WebLinksAddon;
search: SearchAddon; search: SearchAddon;
image: ImageAddon; image: ImageAddon;
unicode: Unicode11Addon;
} }
// 终端会话定义 // 终端会话定义