From be5187950d7f68198d27535d8fd8b90f067d1955 Mon Sep 17 00:00:00 2001
From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com>
Date: Sun, 12 Apr 2026 14:03:25 +0530
Subject: [PATCH 1/3] feat(tabs): add close left/right/other tab commands
---
src/lib/commands.js | 142 ++++++++++++++++++++++++++++------------
src/lib/editorFile.js | 5 +-
src/lib/keyBindings.js | 21 ++++++
src/main.js | 12 ++++
src/views/file-menu.hbs | 12 ++++
5 files changed, 147 insertions(+), 45 deletions(-)
diff --git a/src/lib/commands.js b/src/lib/commands.js
index 054f40f8f..bbd1f14f8 100644
--- a/src/lib/commands.js
+++ b/src/lib/commands.js
@@ -35,54 +35,110 @@ import saveState from "./saveState";
import appSettings from "./settings";
import showFileInfo from "./showFileInfo";
+function getTabCloseSelectionOptions() {
+ return {
+ unsavedWarning:
+ strings["unsaved selected tabs warning"] ||
+ "Some selected tabs are not saved. Choose what to do.",
+ saveLabel: strings["save selected tabs"] || "Save selected tabs",
+ closeLabel: strings["close selected tabs"] || "Close selected tabs",
+ saveWarning:
+ strings["save selected tabs warning"] ||
+ "Are you sure you want to save and close the selected tabs?",
+ closeWarning:
+ strings["close selected tabs warning"] ||
+ "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ };
+}
+
+function getTabsRelativeToActive(side) {
+ const { files, activeFile } = editorManager;
+ const activeIndex = files.indexOf(activeFile);
+
+ if (activeIndex === -1) return [];
+
+ switch (side) {
+ case "left":
+ return files.slice(0, activeIndex);
+ case "right":
+ return files.slice(activeIndex + 1);
+ case "others":
+ return files.filter((_, index) => index !== activeIndex);
+ default:
+ return [];
+ }
+}
+
+async function closeTabs(files, options = {}) {
+ const closableFiles = files.filter((file) => file && !file.pinned);
+ if (!closableFiles.length) return false;
+
+ const {
+ unsavedWarning = strings["unsaved files warning"],
+ saveLabel = strings["save all"],
+ closeLabel = strings["close all"],
+ saveWarning = strings["save all warning"],
+ closeWarning = strings["close all warning"],
+ } = options;
+
+ let save = false;
+ const unsavedFiles = closableFiles.filter((file) => file.isUnsaved).length;
+ if (unsavedFiles) {
+ const confirmation = await confirm(strings["warning"], unsavedWarning);
+ if (!confirmation) return false;
+
+ const option = await select(strings["select"], [
+ ["save", saveLabel],
+ ["close", closeLabel],
+ ["cancel", strings["cancel"]],
+ ]);
+ if (option === "cancel") return false;
+
+ if (option === "save") {
+ const doSave = await confirm(strings["warning"], saveWarning);
+ if (!doSave) return false;
+ save = true;
+ } else {
+ const doClose = await confirm(strings["warning"], closeWarning);
+ if (!doClose) return false;
+ }
+ }
+
+ for (const file of [...closableFiles]) {
+ if (save) {
+ await file.save();
+ }
+
+ await file.remove(true, { silentPinned: true });
+ }
+
+ return true;
+}
+
export default {
async "run-tests"() {
await runAllTests();
},
async "close-all-tabs"() {
- const closableFiles = editorManager.files.filter((file) => !file.pinned);
- if (!closableFiles.length) return;
-
- let save = false;
- const unsavedFiles = closableFiles.filter((file) => file.isUnsaved).length;
- if (unsavedFiles) {
- const confirmation = await confirm(
- strings["warning"],
- strings["unsaved files warning"],
- );
- if (!confirmation) return;
- const option = await select(strings["select"], [
- ["save", strings["save all"]],
- ["close", strings["close all"]],
- ["cancel", strings["cancel"]],
- ]);
- if (option === "cancel") return;
-
- if (option === "save") {
- const doSave = await confirm(
- strings["warning"],
- strings["save all warning"],
- );
- if (!doSave) return;
- save = true;
- } else {
- const doClose = await confirm(
- strings["warning"],
- strings["close all warning"],
- );
- if (!doClose) return;
- }
- }
-
- for (const file of [...closableFiles]) {
- if (save) {
- await file.save();
- await file.remove(true, { silentPinned: true });
- continue;
- }
-
- await file.remove(true, { silentPinned: true });
- }
+ await closeTabs(editorManager.files);
+ },
+ async "close-tabs-to-left"() {
+ await closeTabs(
+ getTabsRelativeToActive("left"),
+ getTabCloseSelectionOptions(),
+ );
+ },
+ async "close-tabs-to-right"() {
+ await closeTabs(
+ getTabsRelativeToActive("right"),
+ getTabCloseSelectionOptions(),
+ );
+ },
+ async "close-other-tabs"() {
+ await closeTabs(
+ getTabsRelativeToActive("others"),
+ getTabCloseSelectionOptions(),
+ );
},
async "save-all-changes"() {
const doSave = await confirm(
diff --git a/src/lib/editorFile.js b/src/lib/editorFile.js
index 8257fd3c5..eddb71cb3 100644
--- a/src/lib/editorFile.js
+++ b/src/lib/editorFile.js
@@ -1011,14 +1011,15 @@ export default class EditorFile {
(file) => file.id !== this.id,
);
const { files, activeFile } = editorManager;
- if (activeFile.id === this.id) {
+ const wasActive = activeFile?.id === this.id;
+ if (wasActive) {
editorManager.activeFile = null;
}
if (!files.length) {
Sidebar.hide();
editorManager.activeFile = null;
new EditorFile();
- } else {
+ } else if (wasActive) {
files[files.length - 1].makeActive();
}
editorManager.onupdate("remove-file");
diff --git a/src/lib/keyBindings.js b/src/lib/keyBindings.js
index a5f481346..103fb4aa6 100644
--- a/src/lib/keyBindings.js
+++ b/src/lib/keyBindings.js
@@ -43,6 +43,27 @@ const APP_BINDING_CONFIG = [
action: "close-all-tabs",
readOnly: false,
},
+ {
+ name: "closeTabsToRight",
+ description: "Close tabs to the right.",
+ key: null,
+ action: "close-tabs-to-right",
+ readOnly: false,
+ },
+ {
+ name: "closeTabsToLeft",
+ description: "Close tabs to the left.",
+ key: null,
+ action: "close-tabs-to-left",
+ readOnly: false,
+ },
+ {
+ name: "closeOtherTabs",
+ description: "Close other tabs.",
+ key: null,
+ action: "close-other-tabs",
+ readOnly: false,
+ },
{
name: "newFile",
description: "Create new file",
diff --git a/src/main.js b/src/main.js
index fd173d15a..843c900f5 100644
--- a/src/main.js
+++ b/src/main.js
@@ -766,6 +766,18 @@ function createFileMenu({ top, bottom, toggler }) {
? strings["unpin tab"] || "Unpin tab"
: strings["pin tab"] || "Pin tab",
toggle_pin_tab_icon: file.pinned ? "icon pin-off" : "icon pin",
+ close_tabs_to_right_text:
+ strings["close tabs to right"] ||
+ strings["close right"] ||
+ "Close Right",
+ close_tabs_to_left_text:
+ strings["close tabs to left"] ||
+ strings["close left"] ||
+ "Close Left",
+ close_other_tabs_text:
+ strings["close other tabs"] ||
+ strings["close others"] ||
+ "Close Others",
// Use CodeMirror mode stored on EditorFile (set in setMode)
file_mode: isEditorFile ? file.currentMode || "" : "",
file_encoding: isEditorFile ? encoding : "",
diff --git a/src/views/file-menu.hbs b/src/views/file-menu.hbs
index 056faf62c..c6de99ff0 100644
--- a/src/views/file-menu.hbs
+++ b/src/views/file-menu.hbs
@@ -73,6 +73,18 @@
{{toggle_pin_tab_text}}
+
+ {{close_tabs_to_right_text}}
+
+
+
+ {{close_tabs_to_left_text}}
+
+
+
+ {{close_other_tabs_text}}
+
+
{{#is_editor}}
From 7de1ec5d1a4658a97ea183b26227299d2a391d4b Mon Sep 17 00:00:00 2001
From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com>
Date: Sun, 12 Apr 2026 14:16:26 +0530
Subject: [PATCH 2/3] chore: add new strings
---
src/lang/ar-ye.json | 10 +++++++++-
src/lang/be-by.json | 10 +++++++++-
src/lang/bn-bd.json | 10 +++++++++-
src/lang/cs-cz.json | 10 +++++++++-
src/lang/de-de.json | 10 +++++++++-
src/lang/en-us.json | 10 +++++++++-
src/lang/es-sv.json | 10 +++++++++-
src/lang/fr-fr.json | 10 +++++++++-
src/lang/he-il.json | 10 +++++++++-
src/lang/hi-in.json | 10 +++++++++-
src/lang/hu-hu.json | 10 +++++++++-
src/lang/id-id.json | 10 +++++++++-
src/lang/ir-fa.json | 10 +++++++++-
src/lang/it-it.json | 10 +++++++++-
src/lang/ja-jp.json | 10 +++++++++-
src/lang/ko-kr.json | 10 +++++++++-
src/lang/ml-in.json | 10 +++++++++-
src/lang/mm-unicode.json | 10 +++++++++-
src/lang/mm-zawgyi.json | 10 +++++++++-
src/lang/pl-pl.json | 10 +++++++++-
src/lang/pt-br.json | 10 +++++++++-
src/lang/pu-in.json | 10 +++++++++-
src/lang/ru-ru.json | 10 +++++++++-
src/lang/tl-ph.json | 10 +++++++++-
src/lang/tr-tr.json | 10 +++++++++-
src/lang/uk-ua.json | 10 +++++++++-
src/lang/uz-uz.json | 10 +++++++++-
src/lang/vi-vn.json | 10 +++++++++-
src/lang/zh-cn.json | 10 +++++++++-
src/lang/zh-hant.json | 10 +++++++++-
src/lang/zh-tw.json | 10 +++++++++-
31 files changed, 279 insertions(+), 31 deletions(-)
diff --git a/src/lang/ar-ye.json b/src/lang/ar-ye.json
index 8d825136c..11263e963 100644
--- a/src/lang/ar-ye.json
+++ b/src/lang/ar-ye.json
@@ -713,5 +713,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/be-by.json b/src/lang/be-by.json
index 95b71225b..b1cd086fc 100644
--- a/src/lang/be-by.json
+++ b/src/lang/be-by.json
@@ -715,5 +715,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/bn-bd.json b/src/lang/bn-bd.json
index 09d84ee4d..5e5c246c1 100644
--- a/src/lang/bn-bd.json
+++ b/src/lang/bn-bd.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/cs-cz.json b/src/lang/cs-cz.json
index 8b3d7142d..85cb9886e 100644
--- a/src/lang/cs-cz.json
+++ b/src/lang/cs-cz.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/de-de.json b/src/lang/de-de.json
index d9780f1c0..ec1172fd3 100644
--- a/src/lang/de-de.json
+++ b/src/lang/de-de.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/en-us.json b/src/lang/en-us.json
index e98baffb1..be26799fa 100644
--- a/src/lang/en-us.json
+++ b/src/lang/en-us.json
@@ -714,5 +714,13 @@
"pinned tab": "Pinned tab",
"unpin tab before closing": "Unpin the tab before closing it.",
"app font": "App font",
- "settings-info-app-font-family": "Choose the font used across the app interface."
+ "settings-info-app-font-family": "Choose the font used across the app interface.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/es-sv.json b/src/lang/es-sv.json
index 9113b2797..970fdc751 100644
--- a/src/lang/es-sv.json
+++ b/src/lang/es-sv.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/fr-fr.json b/src/lang/fr-fr.json
index 627823c1b..ac8c2f2bb 100644
--- a/src/lang/fr-fr.json
+++ b/src/lang/fr-fr.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/he-il.json b/src/lang/he-il.json
index f29ae9ae7..6094f6e0c 100644
--- a/src/lang/he-il.json
+++ b/src/lang/he-il.json
@@ -715,5 +715,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/hi-in.json b/src/lang/hi-in.json
index 69c6756a2..c761da8f3 100644
--- a/src/lang/hi-in.json
+++ b/src/lang/hi-in.json
@@ -715,5 +715,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/hu-hu.json b/src/lang/hu-hu.json
index a1e3fc231..168e9e015 100644
--- a/src/lang/hu-hu.json
+++ b/src/lang/hu-hu.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Egyéni kiszolgáló eltávolítása",
"lsp-remove-custom-server-confirm": "Eltávolítja a(z) {server} egyéni nyelvi kiszolgálót?",
"lsp-custom-server-removed": "Egyéni kiszolgáló eltávolítva",
- "settings-info-lsp-remove-custom-server": "Eltávolítja ezt az egyéni nyelvi kiszolgálót az Acode alkalmazásból."
+ "settings-info-lsp-remove-custom-server": "Eltávolítja ezt az egyéni nyelvi kiszolgálót az Acode alkalmazásból.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/id-id.json b/src/lang/id-id.json
index 86c4e82d0..053166bb4 100644
--- a/src/lang/id-id.json
+++ b/src/lang/id-id.json
@@ -715,5 +715,13 @@
"lsp-remove-custom-server": "Hapus server kostum",
"lsp-remove-custom-server-confirm": "Hapus server bahasa kostum {server}?",
"lsp-custom-server-removed": "Server kostum dihapus",
- "settings-info-lsp-remove-custom-server": "Hapus server bahasa kostum ini dari Acode."
+ "settings-info-lsp-remove-custom-server": "Hapus server bahasa kostum ini dari Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/ir-fa.json b/src/lang/ir-fa.json
index 2365f7ef9..e8d7401a0 100644
--- a/src/lang/ir-fa.json
+++ b/src/lang/ir-fa.json
@@ -715,5 +715,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/it-it.json b/src/lang/it-it.json
index 5601d153b..1ed8a27ca 100644
--- a/src/lang/it-it.json
+++ b/src/lang/it-it.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/ja-jp.json b/src/lang/ja-jp.json
index e345453a1..48b544aef 100644
--- a/src/lang/ja-jp.json
+++ b/src/lang/ja-jp.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/ko-kr.json b/src/lang/ko-kr.json
index 769b93638..c74558450 100644
--- a/src/lang/ko-kr.json
+++ b/src/lang/ko-kr.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/ml-in.json b/src/lang/ml-in.json
index d15e85a79..7705c326a 100644
--- a/src/lang/ml-in.json
+++ b/src/lang/ml-in.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/mm-unicode.json b/src/lang/mm-unicode.json
index 573c0a13d..baf19f397 100644
--- a/src/lang/mm-unicode.json
+++ b/src/lang/mm-unicode.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/mm-zawgyi.json b/src/lang/mm-zawgyi.json
index 4bfc66e54..b929f9725 100644
--- a/src/lang/mm-zawgyi.json
+++ b/src/lang/mm-zawgyi.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/pl-pl.json b/src/lang/pl-pl.json
index 38e78e6e1..b36c87247 100644
--- a/src/lang/pl-pl.json
+++ b/src/lang/pl-pl.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/pt-br.json b/src/lang/pt-br.json
index 0ab519763..c69067213 100644
--- a/src/lang/pt-br.json
+++ b/src/lang/pt-br.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/pu-in.json b/src/lang/pu-in.json
index 91b4b7182..221168db6 100644
--- a/src/lang/pu-in.json
+++ b/src/lang/pu-in.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/ru-ru.json b/src/lang/ru-ru.json
index 92504c01a..f72f6dda9 100644
--- a/src/lang/ru-ru.json
+++ b/src/lang/ru-ru.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/tl-ph.json b/src/lang/tl-ph.json
index 18c89c58b..6375e9672 100644
--- a/src/lang/tl-ph.json
+++ b/src/lang/tl-ph.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/tr-tr.json b/src/lang/tr-tr.json
index 361390eb8..75a7b7508 100644
--- a/src/lang/tr-tr.json
+++ b/src/lang/tr-tr.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/uk-ua.json b/src/lang/uk-ua.json
index d4c75039d..a63ce30fa 100644
--- a/src/lang/uk-ua.json
+++ b/src/lang/uk-ua.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/uz-uz.json b/src/lang/uz-uz.json
index 3c71c4949..098b7a84b 100644
--- a/src/lang/uz-uz.json
+++ b/src/lang/uz-uz.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/vi-vn.json b/src/lang/vi-vn.json
index 1500c49ab..7a85c06d6 100644
--- a/src/lang/vi-vn.json
+++ b/src/lang/vi-vn.json
@@ -715,5 +715,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json
index dbd4979ba..44536e4ee 100644
--- a/src/lang/zh-cn.json
+++ b/src/lang/zh-cn.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/zh-hant.json b/src/lang/zh-hant.json
index d50a110a3..4acf285ba 100644
--- a/src/lang/zh-hant.json
+++ b/src/lang/zh-hant.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json
index d3731101b..17d1bf2d4 100644
--- a/src/lang/zh-tw.json
+++ b/src/lang/zh-tw.json
@@ -714,5 +714,13 @@
"lsp-remove-custom-server": "Remove custom server",
"lsp-remove-custom-server-confirm": "Remove custom language server {server}?",
"lsp-custom-server-removed": "Custom server removed",
- "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode."
+ "settings-info-lsp-remove-custom-server": "Remove this custom language server from Acode.",
+ "unsaved selected tabs warning": "Some selected tabs are not saved. Choose what to do.",
+ "save selected tabs": "Save selected tabs",
+ "close selected tabs": "Close selected tabs",
+ "save selected tabs warning": "Are you sure you want to save and close the selected tabs?",
+ "close selected tabs warning": "Are you sure you want to close the selected tabs? You will lose the unsaved changes and this action cannot be reversed.",
+ "close tabs to right": "Close Right",
+ "close tabs to left": "Close Left",
+ "close other tabs": "Close Others"
}
From fb0b9ee226b50bd7b5fb0fd6ab60ce65d646654e Mon Sep 17 00:00:00 2001
From: Raunak Raj <71929976+bajrangCoder@users.noreply.github.com>
Date: Sun, 12 Apr 2026 14:38:03 +0530
Subject: [PATCH 3/3] fix
---
src/lib/commands.js | 37 ++++++++++++++++++++++++++-----------
src/main.js | 15 ++++-----------
src/views/file-menu.hbs | 8 ++++----
3 files changed, 34 insertions(+), 26 deletions(-)
diff --git a/src/lib/commands.js b/src/lib/commands.js
index bbd1f14f8..46714a492 100644
--- a/src/lib/commands.js
+++ b/src/lib/commands.js
@@ -51,9 +51,24 @@ function getTabCloseSelectionOptions() {
};
}
-function getTabsRelativeToActive(side) {
- const { files, activeFile } = editorManager;
- const activeIndex = files.indexOf(activeFile);
+function resolveReferenceFile(referenceFile) {
+ const { activeFile, getFile } = editorManager;
+
+ if (!referenceFile) return activeFile;
+ if (typeof referenceFile === "string") {
+ return getFile(referenceFile, "id") || activeFile;
+ }
+ if (referenceFile?.id) {
+ return getFile(referenceFile.id, "id") || referenceFile;
+ }
+
+ return referenceFile;
+}
+
+function getTabsRelativeToFile(side, referenceFile) {
+ const { files } = editorManager;
+ const file = resolveReferenceFile(referenceFile);
+ const activeIndex = files.indexOf(file);
if (activeIndex === -1) return [];
@@ -122,21 +137,21 @@ export default {
async "close-all-tabs"() {
await closeTabs(editorManager.files);
},
- async "close-tabs-to-left"() {
+ async "close-tabs-to-left"(referenceFile) {
await closeTabs(
- getTabsRelativeToActive("left"),
+ getTabsRelativeToFile("left", referenceFile),
getTabCloseSelectionOptions(),
);
},
- async "close-tabs-to-right"() {
+ async "close-tabs-to-right"(referenceFile) {
await closeTabs(
- getTabsRelativeToActive("right"),
+ getTabsRelativeToFile("right", referenceFile),
getTabCloseSelectionOptions(),
);
},
- async "close-other-tabs"() {
+ async "close-other-tabs"(referenceFile) {
await closeTabs(
- getTabsRelativeToActive("others"),
+ getTabsRelativeToFile("others", referenceFile),
getTabCloseSelectionOptions(),
);
},
@@ -154,8 +169,8 @@ export default {
"close-current-tab"() {
editorManager.activeFile.remove();
},
- "toggle-pin-tab"() {
- editorManager.activeFile?.togglePinned?.();
+ "toggle-pin-tab"(referenceFile) {
+ resolveReferenceFile(referenceFile)?.togglePinned?.();
},
console() {
run(true, "inapp");
diff --git a/src/main.js b/src/main.js
index 843c900f5..65067364a 100644
--- a/src/main.js
+++ b/src/main.js
@@ -762,22 +762,15 @@ function createFileMenu({ top, bottom, toggler }) {
const hasSelection = !!cmEditor && !cmEditor.state.selection.main.empty;
return mustache.render($_fileMenu, {
...strings,
+ file_id: file.id,
toggle_pin_tab_text: file.pinned
? strings["unpin tab"] || "Unpin tab"
: strings["pin tab"] || "Pin tab",
toggle_pin_tab_icon: file.pinned ? "icon pin-off" : "icon pin",
close_tabs_to_right_text:
- strings["close tabs to right"] ||
- strings["close right"] ||
- "Close Right",
- close_tabs_to_left_text:
- strings["close tabs to left"] ||
- strings["close left"] ||
- "Close Left",
- close_other_tabs_text:
- strings["close other tabs"] ||
- strings["close others"] ||
- "Close Others",
+ strings["close tabs to right"] || "Close Right",
+ close_tabs_to_left_text: strings["close tabs to left"] || "Close Left",
+ close_other_tabs_text: strings["close other tabs"] || "Close Others",
// Use CodeMirror mode stored on EditorFile (set in setMode)
file_mode: isEditorFile ? file.currentMode || "" : "",
file_encoding: isEditorFile ? encoding : "",
diff --git a/src/views/file-menu.hbs b/src/views/file-menu.hbs
index c6de99ff0..24c4ae047 100644
--- a/src/views/file-menu.hbs
+++ b/src/views/file-menu.hbs
@@ -69,19 +69,19 @@
{{/file_on_disk}}
-
+
{{toggle_pin_tab_text}}
-
+
{{close_tabs_to_right_text}}
-
+
{{close_tabs_to_left_text}}
-
+
{{close_other_tabs_text}}