feat: 设置快捷键.
This commit is contained in:
@@ -47,6 +47,9 @@ public class TerminalPreferenceModel implements PreferenceModel {
|
|||||||
@Schema(description = "会话设置")
|
@Schema(description = "会话设置")
|
||||||
private JSONObject sessionSetting;
|
private JSONObject sessionSetting;
|
||||||
|
|
||||||
|
@Schema(description = "快捷键设置")
|
||||||
|
private JSONObject shortcutSetting;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@Builder
|
@Builder
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@@ -145,4 +148,44 @@ public class TerminalPreferenceModel implements PreferenceModel {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class ShortcutSettingModel implements IJsonObject {
|
||||||
|
|
||||||
|
@Schema(description = "是否启用")
|
||||||
|
private Boolean enabled;
|
||||||
|
|
||||||
|
@Schema(description = "快捷键定义")
|
||||||
|
private List<ShortcutKeysModel> keys;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class ShortcutKeysModel implements IJsonObject {
|
||||||
|
|
||||||
|
@Schema(description = "快捷键操作")
|
||||||
|
private String item;
|
||||||
|
|
||||||
|
@Schema(description = "ctrl 按键")
|
||||||
|
private Boolean ctrlKey;
|
||||||
|
|
||||||
|
@Schema(description = "shift 按键")
|
||||||
|
private Boolean shiftKey;
|
||||||
|
|
||||||
|
@Schema(description = "alt 按键")
|
||||||
|
private Boolean altKey;
|
||||||
|
|
||||||
|
@Schema(description = "实际按键")
|
||||||
|
private String code;
|
||||||
|
|
||||||
|
@Schema(description = "是否启用")
|
||||||
|
private Boolean enabled;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,6 +58,27 @@ public class TerminalPreferenceStrategy implements IPreferenceStrategy<TerminalP
|
|||||||
.scrollBackLine(1000)
|
.scrollBackLine(1000)
|
||||||
.build()
|
.build()
|
||||||
.toJsonString();
|
.toJsonString();
|
||||||
|
// 默认快捷键设置
|
||||||
|
String shortcutSetting = TerminalPreferenceModel.ShortcutSettingModel.builder()
|
||||||
|
.enabled(true)
|
||||||
|
.keys(Lists.of(
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("copy", true, true, false, "KeyC", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("paste", true, true, false, "KeyV", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("toTop", true, true, false, "ArrowUp", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("toBottom", true, true, false, "ArrowDown", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("selectAll", true, true, false, "KeyA", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("search", true, true, false, "KeyF", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("commandEditor", true, false, true, "KeyE", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("fontSizePlus", true, false, true, "Equal", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("fontSizeSubtract", true, false, true, "Minus", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("closeTab", true, false, true, "KeyW", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("changeToPrevTab", true, false, true, "ArrowLeft", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("changeToNextTab", true, false, true, "ArrowRight", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("openCopyTerminalTab", true, false, true, "KeyO", true),
|
||||||
|
new TerminalPreferenceModel.ShortcutKeysModel("openNewConnectTab", true, false, true, "KeyN", true)
|
||||||
|
))
|
||||||
|
.build()
|
||||||
|
.toJsonString();
|
||||||
// 默认配置
|
// 默认配置
|
||||||
return TerminalPreferenceModel.builder()
|
return TerminalPreferenceModel.builder()
|
||||||
.newConnectionType("group")
|
.newConnectionType("group")
|
||||||
@@ -68,6 +89,7 @@ public class TerminalPreferenceStrategy implements IPreferenceStrategy<TerminalP
|
|||||||
.interactSetting(JSONObject.parseObject(defaultInteractSetting))
|
.interactSetting(JSONObject.parseObject(defaultInteractSetting))
|
||||||
.pluginsSetting(JSONObject.parseObject(defaultPluginsSetting))
|
.pluginsSetting(JSONObject.parseObject(defaultPluginsSetting))
|
||||||
.sessionSetting(JSONObject.parseObject(defaultSessionSetting))
|
.sessionSetting(JSONObject.parseObject(defaultSessionSetting))
|
||||||
|
.shortcutSetting(JSONObject.parseObject(shortcutSetting))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,8 +27,6 @@ export const TerminalPreferenceItem = {
|
|||||||
NEW_CONNECTION_TYPE: 'newConnectionType',
|
NEW_CONNECTION_TYPE: 'newConnectionType',
|
||||||
// 终端主题
|
// 终端主题
|
||||||
THEME: 'theme',
|
THEME: 'theme',
|
||||||
// 快捷键设置
|
|
||||||
SHORTCUT_SETTING: 'shortcutSetting',
|
|
||||||
// 显示设置
|
// 显示设置
|
||||||
DISPLAY_SETTING: 'displaySetting',
|
DISPLAY_SETTING: 'displaySetting',
|
||||||
// 操作栏设置
|
// 操作栏设置
|
||||||
@@ -41,6 +39,8 @@ export const TerminalPreferenceItem = {
|
|||||||
PLUGINS_SETTING: 'pluginsSetting',
|
PLUGINS_SETTING: 'pluginsSetting',
|
||||||
// 会话设置
|
// 会话设置
|
||||||
SESSION_SETTING: 'sessionSetting',
|
SESSION_SETTING: 'sessionSetting',
|
||||||
|
// 快捷键设置
|
||||||
|
SHORTCUT_SETTING: 'shortcutSetting',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default defineStore('terminal', {
|
export default defineStore('terminal', {
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
<terminal-theme-setting v-else-if="tab.key === InnerTabs.THEME_SETTING.key" />
|
<terminal-theme-setting v-else-if="tab.key === InnerTabs.THEME_SETTING.key" />
|
||||||
<!-- 终端设置 -->
|
<!-- 终端设置 -->
|
||||||
<terminal-general-setting v-else-if="tab.key === InnerTabs.TERMINAL_SETTING.key" />
|
<terminal-general-setting v-else-if="tab.key === InnerTabs.TERMINAL_SETTING.key" />
|
||||||
|
<!-- 快捷键设置 -->
|
||||||
|
<terminal-shortcut-setting v-else-if="tab.key === InnerTabs.SHORTCUT_SETTING.key" />
|
||||||
</template>
|
</template>
|
||||||
<!-- 终端 -->
|
<!-- 终端 -->
|
||||||
<template v-else-if="tab.type === TerminalTabType.TERMINAL">
|
<template v-else-if="tab.type === TerminalTabType.TERMINAL">
|
||||||
@@ -41,9 +43,10 @@
|
|||||||
import { addEventListen, removeEventListen } from '@/utils/event';
|
import { addEventListen, removeEventListen } from '@/utils/event';
|
||||||
import EmptyRecommend from './empty-recommend.vue';
|
import EmptyRecommend from './empty-recommend.vue';
|
||||||
import NewConnectionView from '../new-connection/new-connection-view.vue';
|
import NewConnectionView from '../new-connection/new-connection-view.vue';
|
||||||
import TerminalDisplaySetting from '../view-setting/terminal-display-setting.vue';
|
import TerminalDisplaySetting from '../setting/terminal-display-setting.vue';
|
||||||
import TerminalThemeSetting from '../view-setting/terminal-theme-setting.vue';
|
import TerminalThemeSetting from '../setting/terminal-theme-setting.vue';
|
||||||
import TerminalGeneralSetting from '../view-setting/terminal-general-setting.vue';
|
import TerminalGeneralSetting from '../setting/terminal-general-setting.vue';
|
||||||
|
import TerminalShortcutSetting from '../setting/terminal-shortcut-setting.vue';
|
||||||
import TerminalView from '../xterm/terminal-view.vue';
|
import TerminalView from '../xterm/terminal-view.vue';
|
||||||
|
|
||||||
const { preference, tabManager, sessionManager } = useTerminalStore();
|
const { preference, tabManager, sessionManager } = useTerminalStore();
|
||||||
|
|||||||
@@ -103,7 +103,7 @@
|
|||||||
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';
|
||||||
import { TerminalPreferenceItem } from '@/store/modules/terminal';
|
import { TerminalPreferenceItem } from '@/store/modules/terminal';
|
||||||
import TerminalExample from '../view-setting/terminal-example.vue';
|
import TerminalExample from '../setting/terminal-example.vue';
|
||||||
|
|
||||||
const { toOptions, toRadioOptions } = useDictStore();
|
const { toOptions, toRadioOptions } = useDictStore();
|
||||||
const { preference, updateTerminalPreference } = useTerminalStore();
|
const { preference, updateTerminalPreference } = useTerminalStore();
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
<template>
|
||||||
|
<div class="terminal-setting-block">
|
||||||
|
<!-- 顶部 -->
|
||||||
|
<div class="terminal-setting-subtitle-wrapper">
|
||||||
|
<h3 class="terminal-setting-subtitle">
|
||||||
|
终端快捷键
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<!-- 加载中 -->
|
||||||
|
<a-skeleton v-if="loading"
|
||||||
|
class="skeleton-wrapper"
|
||||||
|
:animation="true">
|
||||||
|
<a-skeleton-line :rows="8" />
|
||||||
|
</a-skeleton>
|
||||||
|
<!-- 内容区域 -->
|
||||||
|
<div v-else class="terminal-setting-body terminal-shortcut-container">
|
||||||
|
<!-- 提示 -->
|
||||||
|
<a-alert class="mb16">选择后会立刻保存, 刷新页面后生效 (设置时需要避免浏览器内置快捷键)</a-alert>
|
||||||
|
<div class="shortcut-row">
|
||||||
|
<a-space>
|
||||||
|
<a-tag checkable :default-checked="true">ctrl</a-tag>
|
||||||
|
<a-tag checkable :default-checked="true">shift</a-tag>
|
||||||
|
<a-tag checkable :default-checked="true">alt</a-tag>
|
||||||
|
<icon-plus />
|
||||||
|
<a-tag :default-checked="true">alt</a-tag>
|
||||||
|
</a-space>
|
||||||
|
</div>
|
||||||
|
<div class="shortcut-row">2</div>
|
||||||
|
<div class="shortcut-row">3</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export default {
|
||||||
|
name: 'TerminalShortcutBlock'
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { useTerminalStore } from '@/store';
|
||||||
|
import { TerminalPreferenceItem } from '@/store/modules/terminal';
|
||||||
|
import { onMounted, ref } from 'vue';
|
||||||
|
import { getPreference } from '@/api/user/preference';
|
||||||
|
import useLoading from '@/hooks/loading';
|
||||||
|
|
||||||
|
const { updateTerminalPreference } = useTerminalStore();
|
||||||
|
const { loading, setLoading } = useLoading();
|
||||||
|
|
||||||
|
|
||||||
|
// 加载用户快捷键
|
||||||
|
onMounted(async () => {
|
||||||
|
try {
|
||||||
|
const { data } = await getPreference<Record<string, any>>('TERMINAL', [TerminalPreferenceItem.SHORTCUT_SETTING]);
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
@terminal-width: 458px;
|
||||||
|
@terminal-height: 138px;
|
||||||
|
|
||||||
|
.terminal-shortcut-container {
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
.shortcut-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
background: var(--color-fill-2);
|
||||||
|
height: 48px;
|
||||||
|
padding: 8px;
|
||||||
|
border-radius: 4px;
|
||||||
|
transition: .3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: var(--color-fill-3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.arco-tag) {
|
||||||
|
background: #FFFFFF;
|
||||||
|
width: 44px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
height: 26px;
|
||||||
|
font-size: 14px;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.arco-tag-checked) {
|
||||||
|
color: #FFFFFF;
|
||||||
|
background: rgb(var(--arcoblue-5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<template>
|
||||||
|
<div class="terminal-setting-container">
|
||||||
|
<div class="terminal-setting-wrapper">
|
||||||
|
<!-- 主标题 -->
|
||||||
|
<h2 class="terminal-setting-title">快捷键设置</h2>
|
||||||
|
<!-- 快捷键设置 -->
|
||||||
|
<terminal-shortcut-block />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export default {
|
||||||
|
name: 'terminalShortcutSetting'
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import TerminalShortcutBlock from './terminal-shortcut-block.vue';
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -93,9 +93,9 @@
|
|||||||
const session = ref<ITerminalSession>();
|
const session = ref<ITerminalSession>();
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
// 设置快捷键
|
|
||||||
// 截屏
|
// 截屏
|
||||||
// sftp
|
// sftp
|
||||||
|
// 代码片段
|
||||||
|
|
||||||
// 发送命令
|
// 发送命令
|
||||||
const writeCommandInput = async (e: KeyboardEvent) => {
|
const writeCommandInput = async (e: KeyboardEvent) => {
|
||||||
|
|||||||
@@ -10,10 +10,10 @@ export default class TerminalTabManager implements ITerminalTabManager {
|
|||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
// fixme
|
// fixme
|
||||||
// this.active = InnerTabs.SHORTCUT_SETTING.key;
|
this.active = InnerTabs.SHORTCUT_SETTING.key;
|
||||||
// this.items = [InnerTabs.SHORTCUT_SETTING];
|
this.items = [InnerTabs.SHORTCUT_SETTING];
|
||||||
this.active = InnerTabs.NEW_CONNECTION.key;
|
// this.active = InnerTabs.NEW_CONNECTION.key;
|
||||||
this.items = [InnerTabs.NEW_CONNECTION];
|
// this.items = [InnerTabs.NEW_CONNECTION];
|
||||||
}
|
}
|
||||||
|
|
||||||
// 点击 tab
|
// 点击 tab
|
||||||
|
|||||||
Reference in New Issue
Block a user