实现 快捷键 Ctrl + Shift + T 显示 vscode QickPick 弹窗
This commit is contained in:
parent
9120e47147
commit
461ab98385
@ -9,6 +9,7 @@ All notable changes to this extension will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
@ -20,8 +21,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
## 1.0.4
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add shortcut key `Ctrl + Shift + T` to show vscode QickPick window (添加快捷键 Ctrl + Shift + T 来显示 vscode QickPick 弹窗)
|
||||||
|
- Write `README.md` (完善 README 文档)
|
||||||
|
|
||||||
## 1.0.3
|
## 1.0.3
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
// 插件 id 及名称
|
// 插件 id 及名称
|
||||||
"name": "variable-conversion",
|
"name": "variable-conversion",
|
||||||
"displayName": "Variable Conversion [Under development(正在开发中)]",
|
"displayName": "Variable Conversion [Under development(正在开发中)]",
|
||||||
"description": "A variable naming conversion extension. You can use it through the editer menu, shortcut keys and bottom bar. Support camel, pascal, snake, kebab(spinal), lower, upper case, and more. \n变量名转换插件,支持右键菜单、快捷键、底栏等多种方式使用,支持小驼峰、大驼峰(帕斯卡)、下划线(蛇形)、连字符(脊柱式)、全小写、全大写等常用命名方式(及组合)转换。",
|
"description": "一个强大的变量名转换插件,支持右键菜单、快捷键、底栏等多种方式使用,支持小驼峰、大驼峰(帕斯卡)、下划线(蛇形)、连字符(脊柱式)、全小写、全大写等常用命名方式(及组合)转换。 \nA powerful variable naming conversion extension. You can use it through the editer menu, shortcut keys and bottom bar. Support camel, pascal, snake, kebab(spinal), lower, upper case, and more.",
|
||||||
// 版本号
|
// 版本号
|
||||||
"version": "0.0.3",
|
"version": "0.0.4",
|
||||||
// logo
|
// logo
|
||||||
"icon": "image/logo.png",
|
"icon": "image/logo.png",
|
||||||
"publisher": "coder-xiaomo",
|
"publisher": "coder-xiaomo",
|
||||||
@ -31,8 +31,10 @@
|
|||||||
],
|
],
|
||||||
"main": "./out/extension.js",
|
"main": "./out/extension.js",
|
||||||
"activationEvents": [
|
"activationEvents": [
|
||||||
"onStartupFinished", // 当编辑器完成启动时激活
|
// 当编辑器完成启动时激活
|
||||||
"onTextSelected" // 当用户选中文本时激活
|
"onStartupFinished",
|
||||||
|
// 当用户选中文本时激活
|
||||||
|
"onTextSelected"
|
||||||
],
|
],
|
||||||
"contributes": {
|
"contributes": {
|
||||||
"commands": [
|
"commands": [
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "variable-conversion",
|
"name": "variable-conversion",
|
||||||
"displayName": "Variable Conversion [Under development(正在开发中)]",
|
"displayName": "Variable Conversion [Under development(正在开发中)]",
|
||||||
"description": "A variable naming conversion extension. You can use it through the editer menu, shortcut keys and bottom bar. Support camel, pascal, snake, kebab(spinal), lower, upper case, and more. \n变量名转换插件,支持右键菜单、快捷键、底栏等多种方式使用,支持小驼峰、大驼峰(帕斯卡)、下划线(蛇形)、连字符(脊柱式)、全小写、全大写等常用命名方式(及组合)转换。",
|
"description": "一个强大的变量名转换插件,支持右键菜单、快捷键、底栏等多种方式使用,支持小驼峰、大驼峰(帕斯卡)、下划线(蛇形)、连字符(脊柱式)、全小写、全大写等常用命名方式(及组合)转换。 \nA powerful variable naming conversion extension. You can use it through the editer menu, shortcut keys and bottom bar. Support camel, pascal, snake, kebab(spinal), lower, upper case, and more.",
|
||||||
"version": "0.0.3",
|
"version": "0.0.4",
|
||||||
"icon": "image/logo.png",
|
"icon": "image/logo.png",
|
||||||
"publisher": "coder-xiaomo",
|
"publisher": "coder-xiaomo",
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -1,20 +1,71 @@
|
|||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
import QuickPickItemEx from "../type-definition/QuickPickItemExType";
|
import QuickPickItemEx from "../type-definition/QuickPickItemExType";
|
||||||
|
import { qickPickSupportCases } from '../type-definition/SupportCaseType';
|
||||||
|
import { TransformTextResult } from '../type-definition/TransformTextResultType';
|
||||||
|
import { transformMutliLineText } from '../main-code/transform';
|
||||||
|
import { EOL } from '../type-definition/EOLType';
|
||||||
|
import { caseConversion } from '../main-code/conversion';
|
||||||
|
|
||||||
|
const QuickPickLabelMaxLength = 60;
|
||||||
|
|
||||||
|
interface RecommendItem {
|
||||||
|
conversionText: string
|
||||||
|
transforTo: string[]
|
||||||
|
keyword: string[]
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 弹出的提示
|
* 弹出的提示
|
||||||
*/
|
*/
|
||||||
function generateOptionsBasedOnText(text: string): Array<QuickPickItemEx> {
|
function generateOptionsBasedOnText(text: string, eol: EOL): Array<QuickPickItemEx> {
|
||||||
|
// Cut text 切割文本
|
||||||
|
const results: Array<TransformTextResult> = transformMutliLineText(text);
|
||||||
|
|
||||||
|
const mergeResultList: Array<RecommendItem> = [];
|
||||||
|
for (const qickPick of qickPickSupportCases) {
|
||||||
|
const conversionResult: string = caseConversion(qickPick.type, text, eol, results);
|
||||||
|
const recommendItem: RecommendItem | undefined = mergeResultList.find(item => item.conversionText === conversionResult);
|
||||||
|
|
||||||
|
if (recommendItem === undefined) {
|
||||||
|
let item: RecommendItem = {
|
||||||
|
conversionText: conversionResult,
|
||||||
|
transforTo: [qickPick.shortName], // qickPick.name
|
||||||
|
keyword: qickPick.keyword,
|
||||||
|
};
|
||||||
|
mergeResultList.push(item);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
recommendItem.transforTo.push(qickPick.shortName); // qickPick.name
|
||||||
|
recommendItem.keyword = Array.from(new Set(recommendItem.keyword.concat(qickPick.keyword))); // 关键词去重
|
||||||
|
}
|
||||||
|
|
||||||
// 根据文本生成选项的逻辑
|
// 根据文本生成选项的逻辑
|
||||||
return [
|
const quickPickList = [
|
||||||
{ label: '输入对应项下方任一关键词可快速选择', kind: vscode.QuickPickItemKind.Separator },
|
// { label: '输入对应项下方任一关键词可快速选择', kind: vscode.QuickPickItemKind.Separator },
|
||||||
{ label: text.toUpperCase(), description: '转换为大写', detail: '关键词:DaXie 大写 UpperCase', value: text.toUpperCase() },
|
// { label: text.toUpperCase(), description: '转换为大写', detail: '关键词:DaXie 大写 UpperCase', value: text.toUpperCase() },
|
||||||
{ label: 'Group 2', kind: vscode.QuickPickItemKind.Separator },
|
// { label: 'Group 2', kind: vscode.QuickPickItemKind.Separator },
|
||||||
{ label: text.toLowerCase(), description: '转换为小写', value: text.toLowerCase() },
|
// { label: text.toLowerCase(), description: '转换为小写', value: text.toLowerCase() },
|
||||||
{ label: text.toLowerCase(), description: '转换为小写', value: text.toLowerCase() },
|
// { label: text.toLowerCase(), description: '转换为小写', value: text.toLowerCase() },
|
||||||
{ label: text.toLowerCase(), description: '转换为下划线', detail: '关键词:_', value: text.toLowerCase() },
|
// { label: text.toLowerCase(), description: '转换为下划线', detail: '关键词:_', value: text.toLowerCase() },
|
||||||
{ label: text.toLowerCase(), description: '转换为连字符', detail: '关键词:-', value: text.toLowerCase() },
|
// { label: text.toLowerCase(), description: '转换为连字符', detail: '关键词:-', value: text.toLowerCase() },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
for (const recommendItem of mergeResultList) {
|
||||||
|
if (text === recommendItem.conversionText) {
|
||||||
|
continue; // 如果转换后与转换前相同,那么跳过这一项
|
||||||
|
}
|
||||||
|
let quickPickItem: QuickPickItemEx = {
|
||||||
|
label: recommendItem.conversionText.length >= QuickPickLabelMaxLength
|
||||||
|
? (recommendItem.conversionText.substring(0, QuickPickLabelMaxLength - 3) + '...')
|
||||||
|
: recommendItem.conversionText,
|
||||||
|
description: `转换为 ${recommendItem.transforTo.join(' / ')}`,
|
||||||
|
detail: `关键词 ${recommendItem.keyword.join(' ')}`,
|
||||||
|
value: recommendItem.conversionText,
|
||||||
|
};
|
||||||
|
quickPickList.push(quickPickItem);
|
||||||
|
}
|
||||||
|
return quickPickList;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function handleQuickPick() {
|
export function handleQuickPick() {
|
||||||
@ -26,6 +77,7 @@ export function handleQuickPick() {
|
|||||||
|
|
||||||
let document = editor.document;
|
let document = editor.document;
|
||||||
let selection = editor.selection;
|
let selection = editor.selection;
|
||||||
|
let eol: EOL = document.eol === vscode.EndOfLine.CRLF ? '\r\n' : '\n';
|
||||||
|
|
||||||
// 获取选中的文本
|
// 获取选中的文本
|
||||||
let text = document.getText(selection);
|
let text = document.getText(selection);
|
||||||
@ -36,16 +88,32 @@ export function handleQuickPick() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 基于选中的文本生成选项
|
// 基于选中的文本生成选项
|
||||||
const options = generateOptionsBasedOnText(text);
|
const options = generateOptionsBasedOnText(text, eol);
|
||||||
// 显示推荐项列表
|
// 显示推荐项列表
|
||||||
vscode.window.showQuickPick(options, {
|
vscode.window.showQuickPick(options, {
|
||||||
matchOnDetail: true,
|
matchOnDetail: true,
|
||||||
title: '标题',
|
title: '请选择需要转换的命名类型...',
|
||||||
placeHolder: '输入对应项下方任一关键词可快速选择!'
|
placeHolder: '点击转换,输入关键词可快速选择'
|
||||||
}).then(selection => {
|
}).then(pickItem => {
|
||||||
if (selection) {
|
if (pickItem === undefined) {
|
||||||
// 处理用户的选择
|
return;
|
||||||
vscode.window.showInformationMessage(`你选择了: ${selection}`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 处理用户的选择
|
||||||
|
// vscode.window.showInformationMessage(`你选择了: ${JSON.stringify(selection)}`);
|
||||||
|
|
||||||
|
const converted = pickItem.value;
|
||||||
|
|
||||||
|
// 当转换后文本与转换前相同时,跳过转换,避免形成 Ctrl + Z 撤销历史记录
|
||||||
|
if (converted === text) {
|
||||||
|
console.log('selection text is same to converted text, skip replace contents.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 替换文本
|
||||||
|
console.log('replace selection text', text, 'to', converted);
|
||||||
|
editor.edit(editBuilder => {
|
||||||
|
editBuilder.replace(selection, converted);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
@ -12,7 +12,7 @@ import { transformMutliLineText, transformText } from './transform';
|
|||||||
* @returns 转换后的文本
|
* @returns 转换后的文本
|
||||||
* @since 2024-04-04
|
* @since 2024-04-04
|
||||||
*/
|
*/
|
||||||
export function caseConversion(targetCase: SupportCase, str: string, eol: EOL): string {
|
export function caseConversion(targetCase: SupportCase, str: string, eol: EOL, cutText: Array<TransformTextResult> | undefined = undefined): string {
|
||||||
let spaceCharacter: '-' | '_' | ' ' | undefined = undefined;
|
let spaceCharacter: '-' | '_' | ' ' | undefined = undefined;
|
||||||
switch (targetCase) {
|
switch (targetCase) {
|
||||||
default:
|
default:
|
||||||
@ -39,7 +39,7 @@ export function caseConversion(targetCase: SupportCase, str: string, eol: EOL):
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Cut text 切割文本
|
// Cut text 切割文本
|
||||||
const results: Array<TransformTextResult> = transformMutliLineText(str);
|
const results: Array<TransformTextResult> = cutText === undefined ? transformMutliLineText(str) : cutText;
|
||||||
// console.log('results', results);
|
// console.log('results', results);
|
||||||
|
|
||||||
const transformedLines: Array<string> = [];
|
const transformedLines: Array<string> = [];
|
||||||
|
@ -4,6 +4,7 @@ interface ExtendedQuickPickItem extends vscode.QuickPickItem {
|
|||||||
value: string;
|
value: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
type QuickPickItemEx = ExtendedQuickPickItem | vscode.QuickPickItem;
|
// type QuickPickItemEx = ExtendedQuickPickItem | vscode.QuickPickItem;
|
||||||
|
type QuickPickItemEx = ExtendedQuickPickItem;
|
||||||
|
|
||||||
export default QuickPickItemEx;
|
export default QuickPickItemEx;
|
||||||
|
@ -140,17 +140,120 @@ export enum SupportCase {
|
|||||||
UPPER_CASE,
|
UPPER_CASE,
|
||||||
}
|
}
|
||||||
|
|
||||||
export const AllSupportCase = [
|
const keyword = {
|
||||||
SupportCase.CAMEL_CASE,
|
camel: [
|
||||||
SupportCase.PASCAL_CASE,
|
'小驼峰', '驼峰',
|
||||||
SupportCase.SNAKE_CASE,
|
'Camel Case',
|
||||||
SupportCase.SNAKE_CAMEL_CASE,
|
'XiaoTuoFeng', 'TuoFeng',
|
||||||
SupportCase.SNAKE_PASCAL_CASE,
|
'XTF', 'TF',
|
||||||
SupportCase.SNAKE_UPPER_CASE,
|
],
|
||||||
SupportCase.KEBAB_CASE,
|
pascal: [
|
||||||
SupportCase.KEBAB_CAMEL_CASE,
|
'大驼峰', '帕斯卡',
|
||||||
SupportCase.KEBAB_PASCAL_CASE,
|
'Pascal Case',
|
||||||
SupportCase.KEBAB_UPPER_CASE,
|
'DaTuoFeng', 'PaSiKa',
|
||||||
SupportCase.LOWER_CASE,
|
'DTF', 'PSK',
|
||||||
SupportCase.UPPER_CASE,
|
],
|
||||||
|
snake: [
|
||||||
|
'下划线', '蛇形', '_',
|
||||||
|
'Snake Case', 'Underline Case',
|
||||||
|
'XiaHuaXian', 'SheXing',
|
||||||
|
'XHX', 'SX',
|
||||||
|
],
|
||||||
|
kebab: [
|
||||||
|
'连字符', '脊柱式', '-',
|
||||||
|
'Kebab Case', 'Spinal Case',
|
||||||
|
'LianZiFu', 'JiZhuShi',
|
||||||
|
'LZF', 'JZS',
|
||||||
|
],
|
||||||
|
upper: [
|
||||||
|
'全大写', '大写',
|
||||||
|
'Upper Case',
|
||||||
|
'QuanDaXie',
|
||||||
|
'QDX',
|
||||||
|
],
|
||||||
|
lower: [
|
||||||
|
'全小写', '小写',
|
||||||
|
'Lower Case',
|
||||||
|
'QuanXiaoXie',
|
||||||
|
'QXX',
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有支持的命名方式
|
||||||
|
* @since 2024-04-06
|
||||||
|
*/
|
||||||
|
export const qickPickSupportCases = [
|
||||||
|
{
|
||||||
|
type: SupportCase.CAMEL_CASE,
|
||||||
|
name: '小驼峰(驼峰)命名',
|
||||||
|
shortName:'小驼峰',
|
||||||
|
keyword: keyword.camel,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: SupportCase.PASCAL_CASE,
|
||||||
|
name: '大驼峰(帕斯卡)命名',
|
||||||
|
shortName:'帕斯卡',
|
||||||
|
keyword: keyword.pascal,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: SupportCase.SNAKE_CASE,
|
||||||
|
name: '下划线(蛇形)命名',
|
||||||
|
shortName:'蛇形',
|
||||||
|
keyword: [...keyword.snake, ...keyword.lower],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: SupportCase.SNAKE_CAMEL_CASE,
|
||||||
|
name: '下划线(蛇形) + 小驼峰(驼峰)命名',
|
||||||
|
shortName:'蛇形驼峰',
|
||||||
|
keyword: [...keyword.snake, ...keyword.camel],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: SupportCase.SNAKE_PASCAL_CASE,
|
||||||
|
name: '下划线(蛇形) + 大驼峰(帕斯卡)命名',
|
||||||
|
shortName:'蛇形帕斯卡',
|
||||||
|
keyword: [...keyword.snake, ...keyword.pascal],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: SupportCase.SNAKE_UPPER_CASE,
|
||||||
|
name: '下划线(蛇形) + 全大写命名',
|
||||||
|
shortName:'蛇形大写',
|
||||||
|
keyword: [...keyword.snake, ...keyword.upper],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: SupportCase.KEBAB_CASE,
|
||||||
|
name: '连字符(脊柱式)命名',
|
||||||
|
shortName:'脊柱',
|
||||||
|
keyword: [...keyword.kebab, ...keyword.lower],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: SupportCase.KEBAB_CAMEL_CASE,
|
||||||
|
name: '连字符(脊柱式) + 小驼峰(驼峰)命名',
|
||||||
|
shortName:'脊柱驼峰',
|
||||||
|
keyword: [...keyword.kebab, ...keyword.camel],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: SupportCase.KEBAB_PASCAL_CASE,
|
||||||
|
name: '连字符(脊柱式) + 大驼峰(帕斯卡)命名',
|
||||||
|
shortName:'脊柱帕斯卡',
|
||||||
|
keyword: [...keyword.snake, ...keyword.pascal],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: SupportCase.KEBAB_UPPER_CASE,
|
||||||
|
name: '连字符(脊柱式) + 全大写命名',
|
||||||
|
shortName:'脊柱大写',
|
||||||
|
keyword: [...keyword.snake, ...keyword.upper],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: SupportCase.LOWER_CASE,
|
||||||
|
name: '全小写',
|
||||||
|
shortName:'小写',
|
||||||
|
keyword: keyword.lower,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: SupportCase.UPPER_CASE,
|
||||||
|
name: '全大写',
|
||||||
|
shortName:'大写',
|
||||||
|
keyword: keyword.upper,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
Loading…
Reference in New Issue
Block a user