mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Add terminal copy on select (#3904)
This commit is contained in:
parent
b41f923931
commit
8bbaf8c59e
@ -200,6 +200,19 @@ const openAtLogin: PreferenceDescription<boolean> = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const terminalCopyOnSelect: PreferenceDescription<boolean> = {
|
||||||
|
fromStore(val) {
|
||||||
|
return val ?? false;
|
||||||
|
},
|
||||||
|
toStore(val) {
|
||||||
|
if (!val) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return val;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
const hiddenTableColumns: PreferenceDescription<[string, string[]][], Map<string, ObservableToggleSet<string>>> = {
|
const hiddenTableColumns: PreferenceDescription<[string, string[]][], Map<string, ObservableToggleSet<string>>> = {
|
||||||
fromStore(val) {
|
fromStore(val) {
|
||||||
return new Map(
|
return new Map(
|
||||||
@ -274,4 +287,5 @@ export const DESCRIPTORS = {
|
|||||||
hiddenTableColumns,
|
hiddenTableColumns,
|
||||||
syncKubeconfigEntries,
|
syncKubeconfigEntries,
|
||||||
editorConfiguration,
|
editorConfiguration,
|
||||||
|
terminalCopyOnSelect,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -70,6 +70,7 @@ export class UserStore extends BaseStore<UserStoreModel> /* implements UserStore
|
|||||||
@observable shell?: string;
|
@observable shell?: string;
|
||||||
@observable downloadBinariesPath?: string;
|
@observable downloadBinariesPath?: string;
|
||||||
@observable kubectlBinariesPath?: string;
|
@observable kubectlBinariesPath?: string;
|
||||||
|
@observable terminalCopyOnSelect: boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Download kubectl binaries matching cluster version
|
* Download kubectl binaries matching cluster version
|
||||||
@ -212,6 +213,7 @@ export class UserStore extends BaseStore<UserStoreModel> /* implements UserStore
|
|||||||
this.hiddenTableColumns.replace(DESCRIPTORS.hiddenTableColumns.fromStore(preferences?.hiddenTableColumns));
|
this.hiddenTableColumns.replace(DESCRIPTORS.hiddenTableColumns.fromStore(preferences?.hiddenTableColumns));
|
||||||
this.syncKubeconfigEntries.replace(DESCRIPTORS.syncKubeconfigEntries.fromStore(preferences?.syncKubeconfigEntries));
|
this.syncKubeconfigEntries.replace(DESCRIPTORS.syncKubeconfigEntries.fromStore(preferences?.syncKubeconfigEntries));
|
||||||
this.editorConfiguration = DESCRIPTORS.editorConfiguration.fromStore(preferences?.editorConfiguration);
|
this.editorConfiguration = DESCRIPTORS.editorConfiguration.fromStore(preferences?.editorConfiguration);
|
||||||
|
this.terminalCopyOnSelect = DESCRIPTORS.terminalCopyOnSelect.fromStore(preferences?.terminalCopyOnSelect);
|
||||||
}
|
}
|
||||||
|
|
||||||
toJSON(): UserStoreModel {
|
toJSON(): UserStoreModel {
|
||||||
@ -233,6 +235,7 @@ export class UserStore extends BaseStore<UserStoreModel> /* implements UserStore
|
|||||||
hiddenTableColumns: DESCRIPTORS.hiddenTableColumns.toStore(this.hiddenTableColumns),
|
hiddenTableColumns: DESCRIPTORS.hiddenTableColumns.toStore(this.hiddenTableColumns),
|
||||||
syncKubeconfigEntries: DESCRIPTORS.syncKubeconfigEntries.toStore(this.syncKubeconfigEntries),
|
syncKubeconfigEntries: DESCRIPTORS.syncKubeconfigEntries.toStore(this.syncKubeconfigEntries),
|
||||||
editorConfiguration: DESCRIPTORS.editorConfiguration.toStore(this.editorConfiguration),
|
editorConfiguration: DESCRIPTORS.editorConfiguration.toStore(this.editorConfiguration),
|
||||||
|
terminalCopyOnSelect: DESCRIPTORS.terminalCopyOnSelect.toStore(this.terminalCopyOnSelect),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -72,6 +72,20 @@ export const Application = observer(() => {
|
|||||||
/>
|
/>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section id="terminalSelection">
|
||||||
|
<SubTitle title="Terminal copy & paste" />
|
||||||
|
<FormSwitch
|
||||||
|
label="Copy on select and paste on right-click"
|
||||||
|
control={
|
||||||
|
<Switcher
|
||||||
|
checked={UserStore.getInstance().terminalCopyOnSelect}
|
||||||
|
onChange={v => UserStore.getInstance().terminalCopyOnSelect = v.target.checked}
|
||||||
|
name="terminalCopyOnSelect"
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
<section id="other">
|
<section id="other">
|
||||||
|
|||||||
@ -29,6 +29,8 @@ import { ThemeStore } from "../../theme.store";
|
|||||||
import { boundMethod } from "../../utils";
|
import { boundMethod } from "../../utils";
|
||||||
import { isMac } from "../../../common/vars";
|
import { isMac } from "../../../common/vars";
|
||||||
import { camelCase } from "lodash";
|
import { camelCase } from "lodash";
|
||||||
|
import { UserStore } from "../../../common/user-store";
|
||||||
|
import { clipboard } from "electron";
|
||||||
|
|
||||||
export class Terminal {
|
export class Terminal {
|
||||||
static spawningPool: HTMLElement;
|
static spawningPool: HTMLElement;
|
||||||
@ -115,11 +117,13 @@ export class Terminal {
|
|||||||
this.xterm.open(Terminal.spawningPool);
|
this.xterm.open(Terminal.spawningPool);
|
||||||
this.xterm.registerLinkMatcher(/https?:\/\/[^\s]+/i, this.onClickLink);
|
this.xterm.registerLinkMatcher(/https?:\/\/[^\s]+/i, this.onClickLink);
|
||||||
this.xterm.attachCustomKeyEventHandler(this.keyHandler);
|
this.xterm.attachCustomKeyEventHandler(this.keyHandler);
|
||||||
|
this.xterm.onSelectionChange(this.onSelectionChange);
|
||||||
|
|
||||||
// bind events
|
// bind events
|
||||||
const onDataHandler = this.xterm.onData(this.onData);
|
const onDataHandler = this.xterm.onData(this.onData);
|
||||||
|
|
||||||
this.viewport.addEventListener("scroll", this.onScroll);
|
this.viewport.addEventListener("scroll", this.onScroll);
|
||||||
|
this.elem.addEventListener("contextmenu", this.onContextMenu);
|
||||||
this.api.onReady.addListener(this.onClear, { once: true }); // clear status logs (connecting..)
|
this.api.onReady.addListener(this.onClear, { once: true }); // clear status logs (connecting..)
|
||||||
this.api.onData.addListener(this.onApiData);
|
this.api.onData.addListener(this.onApiData);
|
||||||
window.addEventListener("resize", this.onResize);
|
window.addEventListener("resize", this.onResize);
|
||||||
@ -133,6 +137,7 @@ export class Terminal {
|
|||||||
() => this.fitAddon.dispose(),
|
() => this.fitAddon.dispose(),
|
||||||
() => this.api.removeAllListeners(),
|
() => this.api.removeAllListeners(),
|
||||||
() => window.removeEventListener("resize", this.onResize),
|
() => window.removeEventListener("resize", this.onResize),
|
||||||
|
() => this.elem.removeEventListener("contextmenu", this.onContextMenu),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,6 +203,24 @@ export class Terminal {
|
|||||||
window.open(link, "_blank");
|
window.open(link, "_blank");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
onContextMenu = () => {
|
||||||
|
const { terminalCopyOnSelect } = UserStore.getInstance();
|
||||||
|
const textFromClipboard = clipboard.readText();
|
||||||
|
|
||||||
|
if (terminalCopyOnSelect) {
|
||||||
|
this.xterm.paste(textFromClipboard);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
onSelectionChange = () => {
|
||||||
|
const { terminalCopyOnSelect } = UserStore.getInstance();
|
||||||
|
const selection = this.xterm.getSelection().trim();
|
||||||
|
|
||||||
|
if (terminalCopyOnSelect && selection !== "") {
|
||||||
|
clipboard.writeText(selection);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
keyHandler = (evt: KeyboardEvent): boolean => {
|
keyHandler = (evt: KeyboardEvent): boolean => {
|
||||||
const { code, ctrlKey, type, metaKey } = evt;
|
const { code, ctrlKey, type, metaKey } = evt;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user