@@ -936,6 +936,11 @@ class TextAreaInput extends React.Component<{}, {}> {
inputModel.openHistory();
return;
}
+ if (e.code == "ArrowUp" && e.getModifierState("Shift")) {
+ e.preventDefault();
+ inputModel.openHistory();
+ return;
+ }
if (e.code == "ArrowUp" || e.code == "ArrowDown") {
if (!inputModel.isHistoryLoaded()) {
if (e.code == "ArrowUp") {
@@ -2839,6 +2844,20 @@ class Bookmark extends React.Component<{bookmark : BookmarkType}, {}> {
model.tempCmd.set(e.target.value);
})();
}
+
+ @boundMethod
+ handleClick() : void {
+ let {bookmark} = this.props;
+ let model = GlobalModel.bookmarksModel;
+ model.selectBookmark(bookmark.bookmarkid);
+ }
+
+ @boundMethod
+ handleUse() : void {
+ let {bookmark} = this.props;
+ let model = GlobalModel.bookmarksModel;
+ model.useBookmark(bookmark.bookmarkid);
+ }
render() {
let bm = this.props.bookmark;
@@ -2859,7 +2878,7 @@ class Bookmark extends React.Component<{bookmark : BookmarkType}, {}> {
let isEditing = (model.editingBookmark.get() == bm.bookmarkid);
if (isEditing) {
return (
-
+
@@ -2887,7 +2906,7 @@ class Bookmark extends React.Component<{bookmark : BookmarkType}, {}> {
);
}
return (
-
+
{bm.bookmarkid.substr(0, 8)}
@@ -2897,6 +2916,7 @@ class Bookmark extends React.Component<{bookmark : BookmarkType}, {}> {
@@ -2936,9 +2956,9 @@ class BookmarksView extends React.Component<{}, {}> {
0}>
- [Enter] to Select
- [Arrow Up] / [Arrow Down] to Move in List
+ [Enter] to Use Bookmark
[Backspace/Delete]x2 or to Delete
+ [Arrow Up]/[Arrow Down]/[PageUp]/[PageDown] to Move in List
[e] or to Edit
diff --git a/src/model.ts b/src/model.ts
index 06430365..0b3dc164 100644
--- a/src/model.ts
+++ b/src/model.ts
@@ -1592,6 +1592,29 @@ class BookmarksModel {
tempDesc : OV = mobx.observable.box("", {name: "bookmarkEdit-tempDesc"});
tempCmd : OV = mobx.observable.box("", {name: "bookmarkEdit-tempCmd"});
+ showBookmarksView(bmArr : BookmarkType[]) : void {
+ bmArr = bmArr ?? [];
+ mobx.action(() => {
+ this.reset();
+ GlobalModel.activeMainView.set("bookmarks");
+ this.bookmarks.replace(bmArr);
+ if (bmArr.length > 0) {
+ this.activeBookmark.set(bmArr[0].bookmarkid);
+ }
+
+ })();
+ }
+
+ reset() : void {
+ mobx.action(() => {
+ this.activeBookmark.set(null);
+ this.editingBookmark.set(null);
+ this.pendingDelete.set(null);
+ this.tempDesc.set("");
+ this.tempCmd.set("");
+ })();
+ }
+
closeView() : void {
mobx.action(() => {
GlobalModel.activeMainView.set("session");
@@ -1603,6 +1626,33 @@ class BookmarksModel {
mobx.action(() => this.pendingDelete.set(null))();
}
+ useBookmark(bookmarkId : string) : void {
+ let bm = this.getBookmark(bookmarkId);
+ if (bm == null) {
+ return;
+ }
+ mobx.action(() => {
+ this.reset();
+ GlobalModel.activeMainView.set("session");
+ GlobalModel.inputModel.setCurLine(bm.cmdstr);
+ setTimeout(() => GlobalModel.inputModel.giveFocus(), 50);
+ })();
+ }
+
+ selectBookmark(bookmarkId : string) : void {
+ let bm = this.getBookmark(bookmarkId);
+ if (bm == null) {
+ return;
+ }
+ if (this.activeBookmark.get() == bookmarkId) {
+ return;
+ }
+ mobx.action(() => {
+ this.cancelEdit();
+ this.activeBookmark.set(bookmarkId);
+ })();
+ }
+
cancelEdit() : void {
mobx.action(() => {
this.pendingDelete.set(null);
@@ -1650,6 +1700,19 @@ class BookmarksModel {
return null;
}
+ getBookmarkPos(bookmarkId : string) : number {
+ if (bookmarkId == null) {
+ return -1;
+ }
+ for (let i=0; i= this.bookmarks.length) {
+ newPos = this.bookmarks.length-1;
+ }
+ }
+ let bm = this.bookmarks[newPos];
+ mobx.action(() => {
+ this.activeBookmark.set(bm.bookmarkid);
+ })();
+ return;
}
if (e.code == "Enter") {
if (this.activeBookmark.get() == null) {
return;
}
+ this.useBookmark(this.activeBookmark.get());
return;
}
if (e.code == "KeyE") {
@@ -1804,6 +1888,10 @@ class Model {
}
return;
}
+ if (e.code == "KeyB" && e.getModifierState("Meta")) {
+ e.preventDefault();
+ GlobalCommandRunner.bookmarksView();
+ }
}
restartLocalServer() : void {
@@ -2054,7 +2142,7 @@ class Model {
this.updateRemotes(update.remotes);
}
if ("bookmarksview" in update) {
- this.showBookmarksView(update.bookmarks);
+ this.bookmarksModel.showBookmarksView(update.bookmarks);
}
else if ("bookmarks" in update) {
this.bookmarksModel.mergeBookmarks(update.bookmarks);
@@ -2078,18 +2166,6 @@ class Model {
// console.log("run-update>", Date.now(), interactive, update);
}
- showBookmarksView(bmArr : BookmarkType[]) : void {
- bmArr = bmArr ?? [];
- mobx.action(() => {
- this.activeMainView.set("bookmarks");
- this.bookmarksModel.bookmarks.replace(bmArr);
- this.bookmarksModel.activeBookmark.set(null);
- if (bmArr.length > 0) {
- this.bookmarksModel.activeBookmark.set(bmArr[0].bookmarkid);
- }
- })();
- }
-
updateRemotes(remotes : RemoteType[]) : void {
genMergeSimpleData(this.remotes, remotes, (r) => r.remoteid, null);
}
@@ -2599,7 +2675,7 @@ class CommandRunner {
editBookmark(bookmarkId : string, desc : string, cmdstr : string) {
let kwargs = {
"nohist": "1",
- "description": desc,
+ "desc": desc,
"cmdstr": cmdstr,
};
GlobalModel.submitCommand("bookmark", "set", [bookmarkId], kwargs, true);
diff --git a/src/sh2.less b/src/sh2.less
index 08504b57..864bdbbf 100644
--- a/src/sh2.less
+++ b/src/sh2.less
@@ -148,6 +148,7 @@ html, body, #main {
flex-direction: row;
align-items: center;
font-size: 12px;
+ margin-bottom: 10px;
.help-entry {
margin-left: 20px;
@@ -237,11 +238,38 @@ html, body, #main {
}
.bookmark-code {
+ display: flex;
+ flex-direction: row;
+
+ .use-button {
+ flex-grow: 0;
+ padding: 3px;
+ border-radius: 3px 0 0 3px;
+ font-size: 12px;
+ height: 28px;
+ width: 28px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ align-self: flex-start;
+ cursor: pointer;
+ background-color: black;
+
+ &:hover {
+ background-color: #777;
+ }
+ }
+
code {
+ border-left: 1px solid #777;
+ flex-shrink: 0;
color: white;
.mono-font();
background-color: black;
+ white-space: pre;
+ padding: 2px 8px 2px 8px;
}
+
padding: 4px 10px 4px 0;
margin-top: 10px;