Merge fixes

This commit is contained in:
crschnick
2026-03-21 09:02:49 +00:00
parent e6f92ead33
commit 8049765d84
29 changed files with 117 additions and 72 deletions
@@ -17,10 +17,14 @@ public interface QuickConnectProvider extends ActionProvider {
}
static Optional<QuickConnectProvider> find(String input) {
return ActionProvider.ALL.stream().filter(actionProvider -> actionProvider instanceof QuickConnectProvider qcp &&
(input.length() <= qcp.getName().length() && input.toLowerCase().startsWith(qcp.getName().toLowerCase()) ||
qcp.getName().toLowerCase().startsWith(input.toLowerCase())))
.findFirst().map(qcp -> (QuickConnectProvider) qcp);
return ActionProvider.ALL.stream()
.filter(actionProvider -> actionProvider instanceof QuickConnectProvider qcp
&& (input.length() <= qcp.getName().length()
&& input.toLowerCase()
.startsWith(qcp.getName().toLowerCase())
|| qcp.getName().toLowerCase().startsWith(input.toLowerCase())))
.findFirst()
.map(qcp -> (QuickConnectProvider) qcp);
}
String getName();
@@ -24,7 +24,6 @@ import javafx.beans.binding.Bindings;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.geometry.Insets;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
@@ -14,7 +14,6 @@ import io.xpipe.app.util.ThreadHelper;
import javafx.application.Platform;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.collections.ListChangeListener;
import javafx.event.EventType;
import javafx.geometry.Side;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
@@ -293,7 +292,8 @@ public class BrowserQuickAccessContextMenu extends ContextMenu {
}
});
contextMenu.addEventFilter(MouseEvent.ANY, event -> {
var mouseEvent = event.getEventType() == MouseEvent.MOUSE_PRESSED || event.getEventType() == MouseEvent.MOUSE_MOVED;
var mouseEvent = event.getEventType() == MouseEvent.MOUSE_PRESSED
|| event.getEventType() == MouseEvent.MOUSE_MOVED;
keyBasedNavigation = keyBasedNavigation && !mouseEvent;
if (keyBasedNavigation) {
event.consume();
@@ -5,8 +5,8 @@ import io.xpipe.app.comp.RegionStructure;
import io.xpipe.app.comp.RegionStructureBuilder;
import io.xpipe.app.core.AppLayoutModel;
import io.xpipe.app.platform.PlatformThread;
import io.xpipe.app.terminal.TerminalDockHubManager;
import javafx.beans.binding.Bindings;
import javafx.beans.value.ObservableValue;
import javafx.scene.Node;
@@ -4,7 +4,6 @@ import io.xpipe.app.issue.ErrorAction;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.process.*;
import io.xpipe.app.util.DataStoreFormatter;
import io.xpipe.core.FilePath;
import io.xpipe.core.OsType;
@@ -113,13 +112,11 @@ public class SshIdentityStateManager {
var r = c.readStdoutAndStderr();
if (c.getExitCode() != 0) {
var posixMessage = sc.getOsType() != OsType.WINDOWS
? authSock != null
? " at the socket location " + authSock
: ""
? authSock != null ? " at the socket location " + authSock : ""
: "";
var joined = (!r[0].isEmpty() ? r[0] + "\n" : "") + r[1];
var ex = new IllegalStateException("Unable to list agent identities via command ssh-add -l:\n" + joined + "\n\n"
+ "Please check whether the agent is running correctly%s.".formatted(posixMessage));
var ex = new IllegalStateException("Unable to list agent identities via command ssh-add -l:\n" + joined
+ "\n\n" + "Please check whether the agent is running correctly%s.".formatted(posixMessage));
var eventBuilder = ErrorEventFactory.fromThrowable(ex).expected();
ErrorEventFactory.preconfigure(eventBuilder);
throw ex;
@@ -18,7 +18,6 @@ import javafx.beans.binding.Bindings;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.ListChangeListener;
import javafx.geometry.Insets;
import javafx.scene.Node;
@@ -145,7 +144,9 @@ public class StoreChoicePopover<T extends DataStore> {
explicitCategory == null,
ignored -> true)
.style(Styles.LEFT_PILL);
var filter = FilterComp.ofStoreFilter(storeFilter).style(Styles.CENTER_PILL).hgrow();
var filter = FilterComp.ofStoreFilter(storeFilter)
.style(Styles.CENTER_PILL)
.hgrow();
var addButton = RegionBuilder.of(() -> {
var m = MenuHelper.createMenuButton();
@@ -14,7 +14,10 @@ public class StoreFilter {
}
var split = s.split(",");
var l = Arrays.stream(split).map(sub -> sub.strip()).filter(sub -> !sub.isEmpty()).toList();
var l = Arrays.stream(split)
.map(sub -> sub.strip())
.filter(sub -> !sub.isEmpty())
.toList();
return new StoreFilter(l);
}
@@ -17,11 +17,11 @@ import javafx.scene.Cursor;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Region;
import lombok.val;
import atlantafx.base.controls.CustomTextField;
import atlantafx.base.controls.Popover;
import atlantafx.base.theme.Styles;
import lombok.val;
import java.util.List;
import java.util.Objects;
@@ -65,17 +65,19 @@ public class StoreFilterFieldComp extends SimpleRegionBuilder {
clearButton.setCursor(Cursor.DEFAULT);
AppFontSizes.sm(clearButton);
var searchButton = new IconButtonComp("mdi2m-magnify", () -> {
if (state.onApply()) {
field.clear();
}
}).build();
if (state.onApply()) {
field.clear();
}
})
.build();
searchButton.setCursor(Cursor.DEFAULT);
AppFontSizes.sm(searchButton);
var launchButton = new IconButtonComp("mdi2p-play", () -> {
if (state.onApply()) {
field.clear();
}
}).build();
var launchButton = new IconButtonComp("mdi2p-play", () -> {
if (state.onApply()) {
field.clear();
}
})
.build();
launchButton.setCursor(Cursor.DEFAULT);
AppFontSizes.sm(launchButton);
@@ -12,11 +12,10 @@ import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableBooleanValue;
import javafx.beans.value.ObservableStringValue;
import javafx.beans.value.ObservableValue;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.type.TypeFactory;
import javafx.beans.value.ObservableValue;
import lombok.Getter;
import java.net.URI;
@@ -61,15 +60,25 @@ public class StoreFilterState {
private final BooleanProperty forceFilter = new SimpleBooleanProperty();
@Getter
private final ObservableBooleanValue isSearchString = Bindings.createBooleanBinding(() -> {
return rawText.getValue() != null && rawText.getValue().length() > 2 &&
(forceFilter.getValue() || (!isUrlString.getValue() && !isQuickConnectString.getValue()));
}, rawText, isQuickConnectString, isUrlString, forceFilter);
private final ObservableBooleanValue isSearchString = Bindings.createBooleanBinding(
() -> {
return rawText.getValue() != null
&& rawText.getValue().length() > 2
&& (forceFilter.getValue() || (!isUrlString.getValue() && !isQuickConnectString.getValue()));
},
rawText,
isQuickConnectString,
isUrlString,
forceFilter);
@Getter
private final ObservableValue<StoreFilter> effectiveFilter = Bindings.createObjectBinding(() -> {
return isSearchString.get() ? StoreFilter.of(rawText.getValue()) : null;
}, rawText, isSearchString, forceFilter);
private final ObservableValue<StoreFilter> effectiveFilter = Bindings.createObjectBinding(
() -> {
return isSearchString.get() ? StoreFilter.of(rawText.getValue()) : null;
},
rawText,
isSearchString,
forceFilter);
private static StoreFilterState INSTANCE;
@@ -87,7 +96,7 @@ public class StoreFilterState {
INSTANCE.recentQuickConnections.setContent(recentQuickConnections);
INSTANCE.rawText.subscribe(ignored -> {
INSTANCE.forceFilter.set(false);
INSTANCE.forceFilter.set(false);
});
}
@@ -171,7 +180,7 @@ public class StoreFilterState {
forceFilter.set(true);
return false;
}
var provider = QuickConnectProvider.find(rawText.getValue());
if (provider.isEmpty()) {
return false;
@@ -44,10 +44,14 @@ public class StoreFilterStateComp extends SimpleRegionBuilder {
var searchesEmpty = Bindings.isEmpty(searches);
var searchesList = new ListBoxViewComp<>(searches, searches, s -> createButton(s, s), false);
var searchesPlaceholders = FXCollections.observableList(List.of(AppI18n.get("recentSearchesDescriptionNames"),
AppI18n.get("recentSearchesDescriptionTags"), AppI18n.get("recentSearchesDescriptionTypes"),
AppI18n.get("recentSearchesDescriptionState"), AppI18n.get("recentSearchesDescriptionJoin")));
var searchesEmptyList = new ListBoxViewComp<>(searchesPlaceholders, searchesPlaceholders, s -> createButton(s, null), false);
var searchesPlaceholders = FXCollections.observableList(List.of(
AppI18n.get("recentSearchesDescriptionNames"),
AppI18n.get("recentSearchesDescriptionTags"),
AppI18n.get("recentSearchesDescriptionTypes"),
AppI18n.get("recentSearchesDescriptionState"),
AppI18n.get("recentSearchesDescriptionJoin")));
var searchesEmptyList =
new ListBoxViewComp<>(searchesPlaceholders, searchesPlaceholders, s -> createButton(s, null), false);
var quickConnections = state.getRecentQuickConnections().getList();
var quickConnectionsEmpty = Bindings.isEmpty(quickConnections);
@@ -203,16 +203,14 @@ public class StoreSection {
var isBatchSelected = selected.contains(section.getWrapper());
var matchesFilter = filterString == null
|| section.matchesFilter(filterString.getValue())
|| l.stream().anyMatch(p -> p.matchesFilter(filterString.getValue()));
var matchesFilter = filter == null
|| section.matchesFilter(filter.getValue())
|| l.stream().anyMatch(p -> p.matchesFilter(filter.getValue()));
if (!isBatchSelected && !matchesFilter) {
return false;
}
var hasFilter = filterString != null
&& filterString.getValue() != null
&& filterString.getValue().length() > 0;
var hasFilter = filter != null && filter.getValue() != null;
if (!isBatchSelected && !hasFilter) {
var showProvider = true;
try {
@@ -229,28 +227,21 @@ public class StoreSection {
return false;
}
var matchesFilter = filter == null
|| section.matchesFilter(filter.getValue())
|| l.stream().anyMatch(p -> p.matchesFilter(filter.getValue()));
if (!isBatchSelected && !matchesFilter) {
return false;
}
// Prevent updates for children on category switching by checking depth
var showCategory = showInCategory(category.getValue(), section.getWrapper()) || depth > 0;
if (!showCategory) {
return false;
}
var hasFilter = filter != null
&& filter.getValue() != null;
if (!isBatchSelected && !hasFilter) {
var showProvider = true;
try {
showProvider = section.getWrapper()
.getEntry()
.getProvider()
.shouldShow(section.getWrapper());
} catch (Exception ignored) {
}
if (!showProvider) {
return false;
}
}
// If this entry is already shown as root due to a different category than parent, don't
// show it
// again here
var notRoot = !DataStorage.get()
.isRootEntry(
section.getWrapper().getEntry(), category.getValue().getCategory());
if (!notRoot) {
return false;
}
return true;
};
@@ -19,10 +19,10 @@ import javafx.beans.binding.Bindings;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.collections.ListChangeListener;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import lombok.Getter;
import org.kordamp.ikonli.javafx.FontIcon;
import org.kordamp.ikonli.materialdesign2.MaterialDesignC;
@@ -119,7 +119,8 @@ public class TerminalDockHubManager {
: new Rect(rect.getX(), rect.getY() - topAdjust, rect.getW(), rect.getH() + topAdjust);
});
private final AppLayoutModel.QueueEntry queueEntry = new AppLayoutModel.QueueEntry(
AppI18n.observable("toggleTerminalDock", new KeyCodeCombination(KeyCode.T, KeyCombination.SHORTCUT_DOWN).toString()),
AppI18n.observable(
"toggleTerminalDock", new KeyCodeCombination(KeyCode.T, KeyCombination.SHORTCUT_DOWN).toString()),
new LabelGraphic.NodeGraphic(() -> {
var inner = new FontIcon();
inner.iconCodeProperty()
@@ -322,7 +323,7 @@ public class TerminalDockHubManager {
if (showing.get()) {
hideDock();
} else {
} else {
showDock();
}
}
+2
View File
@@ -2009,6 +2009,8 @@ recentSearchesDescription=Filter for forbindelsesattributter
recentSearchesDescriptionNames=<navn>, f.eks. "Lokal maskine"
recentSearchesDescriptionTags=<tag>, f.eks. "my-custom-tag"
recentSearchesDescriptionTypes=<type>, f.eks. "Docker-container"
recentSearchesDescriptionState=<tilstand>, f.eks. "Kører"
recentSearchesDescriptionJoin=<s1>, <s2> kombineres med kommaer
recentQuickConnections=Seneste hurtige forbindelser
recentQuickConnectionsDescription=Hurtig forbindelse via streng
recentUrls=Seneste URL'er
+2
View File
@@ -2004,6 +2004,8 @@ recentSearchesDescription=Filter für Verbindungsattribute
recentSearchesDescriptionNames=<Name>, z.B. "Lokaler Rechner"
recentSearchesDescriptionTags=<Tag>, z.B. "mein-benutzerdefinierter-Tag"
recentSearchesDescriptionTypes=<Typ>, z.B. "Docker Container"
recentSearchesDescriptionState=<Zustand>, z.B. "Läuft"
recentSearchesDescriptionJoin=<s1>, <s2> mit Kommas kombinieren
recentQuickConnections=Neueste Schnellverbindungen
recentQuickConnectionsDescription=Schnellverbindung über String
recentUrls=Neueste URLs
+2
View File
@@ -1968,6 +1968,8 @@ recentSearchesDescription=Filtro de atributos de conexión
recentSearchesDescriptionNames=<nombre>, por ejemplo "Máquina local"
recentSearchesDescriptionTags=<etiqueta>, por ejemplo "mi-etiqueta-personalizada"
recentSearchesDescriptionTypes=<tipo>, por ejemplo "contenedor Docker".
recentSearchesDescriptionState=<estado>, por ejemplo "En ejecución"
recentSearchesDescriptionJoin=<s1>, <s2> se combinan con comas
recentQuickConnections=Conexiones rápidas recientes
recentQuickConnectionsDescription=Conexión rápida mediante cadena
recentUrls=URL recientes
+2
View File
@@ -2008,6 +2008,8 @@ recentSearchesDescription=Filtre pour les attributs de connexion
recentSearchesDescriptionNames=<nom>, par exemple "Machine locale"
recentSearchesDescriptionTags=<tag>, par exemple "my-custom-tag" (mon étiquette personnalisée)
recentSearchesDescriptionTypes=<type>, par exemple "conteneur Docker"
recentSearchesDescriptionState=<état>, par exemple "en cours d'exécution"
recentSearchesDescriptionJoin=<s1>, <s2> se combinent avec des virgules
recentQuickConnections=Connexions rapides récentes
recentQuickConnectionsDescription=Connexion rapide via une chaîne de caractères
recentUrls=URL récents
+2
View File
@@ -1968,6 +1968,8 @@ recentSearchesDescription=Menyaring atribut koneksi
recentSearchesDescriptionNames=<nama>, misalnya "Mesin Lokal"
recentSearchesDescriptionTags=<tag>, misalnya "tag-khusus saya"
recentSearchesDescriptionTypes=<tipe>, misalnya "Kontainer Docker"
recentSearchesDescriptionState=<state>, misalnya "Berjalan"
recentSearchesDescriptionJoin=<s1>, <s2> digabungkan dengan koma
recentQuickConnections=Sambungan cepat terbaru
recentQuickConnectionsDescription=Sambungan cepat melalui string
recentUrls=URL terbaru
+2
View File
@@ -1968,6 +1968,8 @@ recentSearchesDescription=Filtro per gli attributi della connessione
recentSearchesDescriptionNames=<nome>, ad esempio "Macchina locale".
recentSearchesDescriptionTags=<tag>, ad esempio "my-custom-tag".
recentSearchesDescriptionTypes=<tipo>, ad esempio "contenitore Docker".
recentSearchesDescriptionState=<stato>, ad esempio "In esecuzione".
recentSearchesDescriptionJoin=<s1>, <s2> combinati con le virgole
recentQuickConnections=Connessioni rapide recenti
recentQuickConnectionsDescription=Connessione rapida tramite stringa
recentUrls=URL recenti
+2
View File
@@ -1968,6 +1968,8 @@ recentSearchesDescription=接続属性のフィルター
recentSearchesDescriptionNames=<名前>、例:"ローカルマシン"
recentSearchesDescriptionTags=<タグ>、例:"my-custom-tag"
recentSearchesDescriptionTypes=<例:"Dockerコンテナ"
recentSearchesDescriptionState=<状態>(例:"実行中"
recentSearchesDescriptionJoin=<s1>, <s2> はカンマで結合する。
recentQuickConnections=最近のクイック接続
recentQuickConnectionsDescription=文字列によるクイック接続
recentUrls=最近のURL
+2
View File
@@ -2021,6 +2021,8 @@ recentSearchesDescription=연결 속성에 대한 필터
recentSearchesDescriptionNames=<이름>(예: "로컬 컴퓨터")
recentSearchesDescriptionTags=<태그>(예: "내 사용자 지정 태그")
recentSearchesDescriptionTypes=<유형>(예: "도커 컨테이너")
recentSearchesDescriptionState=<상태>, 예: "실행 중"
recentSearchesDescriptionJoin=<에스1>, <에스2>는 쉼표와 결합합니다
recentQuickConnections=최근 빠른 연결
recentQuickConnectionsDescription=문자열을 통한 빠른 연결
recentUrls=최근 URL
+2
View File
@@ -1968,6 +1968,8 @@ recentSearchesDescription=Filter voor verbindingsattributen
recentSearchesDescriptionNames=<naam>, bijvoorbeeld "Lokale machine".
recentSearchesDescriptionTags=<tag>, bijvoorbeeld "my-custom-tag".
recentSearchesDescriptionTypes=<type>, bijvoorbeeld "Docker container".
recentSearchesDescriptionState=<state>, bijvoorbeeld "Running".
recentSearchesDescriptionJoin=<s1>, <s2> combineren met komma's
recentQuickConnections=Recente snelle verbindingen
recentQuickConnectionsDescription=Snel verbinding maken via een string
recentUrls=Recente URL's
+2
View File
@@ -1969,6 +1969,8 @@ recentSearchesDescription=Filtr atrybutów połączenia
recentSearchesDescriptionNames=<nazwa>, np. "Maszyna lokalna"
recentSearchesDescriptionTags=<tag>, np. "my-custom-tag".
recentSearchesDescriptionTypes=<typ>, np. "kontener Docker".
recentSearchesDescriptionState=<stan>, np. "Uruchomiony"
recentSearchesDescriptionJoin=<s1>, <s2> połącz przecinkami
recentQuickConnections=Ostatnie szybkie połączenia
recentQuickConnectionsDescription=Szybkie połączenie przez ciąg znaków
recentUrls=Najnowsze adresy URL
+2
View File
@@ -1968,6 +1968,8 @@ recentSearchesDescription=Filtro para atributos de ligação
recentSearchesDescriptionNames=<nome>, por exemplo, "Máquina local"
recentSearchesDescriptionTags=<tag>, por exemplo, "my-custom-tag"
recentSearchesDescriptionTypes=<tipo>, por exemplo, "contentor Docker"
recentSearchesDescriptionState=<estado>, por exemplo, "A funcionar"
recentSearchesDescriptionJoin=<s1>, <s2> combina com vírgulas
recentQuickConnections=Ligações rápidas recentes
recentQuickConnectionsDescription=Ligação rápida através de uma cadeia de caracteres
recentUrls=URLs recentes
+2
View File
@@ -2080,6 +2080,8 @@ recentSearchesDescription=Фильтр для атрибутов соедине
recentSearchesDescriptionNames=<Имя>, например, "Локальная машина".
recentSearchesDescriptionTags=<Тэг>, например "my-custom-tag".
recentSearchesDescriptionTypes=<Тип>, например "контейнер Docker".
recentSearchesDescriptionState=<Состояние>, например, "Работает".
recentSearchesDescriptionJoin=<s1>, <s2> объединяются запятыми
recentQuickConnections=Последние быстрые подключения
recentQuickConnectionsDescription=Быстрое подключение через строку
recentUrls=Последние URL-адреса
+2
View File
@@ -1968,6 +1968,8 @@ recentSearchesDescription=Filter för anslutningsattribut
recentSearchesDescriptionNames=<namn>, t.ex. "Lokal maskin"
recentSearchesDescriptionTags=<tagg>, t.ex. "min-anpassade-tagg"
recentSearchesDescriptionTypes=<typ>, t.ex. "Docker-container"
recentSearchesDescriptionState=<tillstånd>, t.ex. "Körs"
recentSearchesDescriptionJoin=<s1>, <s2> kombineras med kommatecken
recentQuickConnections=Nya snabba anslutningar
recentQuickConnectionsDescription=Snabbanslutning via sträng
recentUrls=Senaste webbadresserna
+2
View File
@@ -1968,6 +1968,8 @@ recentSearchesDescription=Bağlantı öznitelikleri için filtre
recentSearchesDescriptionNames=<ad>, örneğin "Yerel Makine"
recentSearchesDescriptionTags=<tag>, örneğin "my-custom-tag"
recentSearchesDescriptionTypes=<tür>, örneğin "Docker konteyner"
recentSearchesDescriptionState=<durum>, örneğin "Çalışıyor"
recentSearchesDescriptionJoin=<s1>, <s2> virgül ile birleştirilir
recentQuickConnections=Son hızlı bağlantılar
recentQuickConnectionsDescription=İp üzerinden hızlı bağlantı
recentUrls=Son URL'ler
+2
View File
@@ -1968,6 +1968,8 @@ recentSearchesDescription=Bộ lọc các thuộc tính kết nối
recentSearchesDescriptionNames=&lt;tên&gt;, ví dụ: &quot;Máy cục bộ&quot;
recentSearchesDescriptionTags=&lt;tag&gt;, ví dụ: &quot;my-custom-tag&quot;
recentSearchesDescriptionTypes=&lt;loại&gt;, ví dụ: &quot;Docker container&quot;
recentSearchesDescriptionState=&lt;trạng thái&gt;, ví dụ: &quot;Đang chạy&quot;
recentSearchesDescriptionJoin=&lt;s1&gt;, &lt;s2&gt; kết hợp bằng dấu phẩy
recentQuickConnections=Các kết nối nhanh gần đây
recentQuickConnectionsDescription=Kết nối nhanh qua chuỗi
recentUrls=Các URL gần đây
+2
View File
@@ -2592,6 +2592,8 @@ recentSearchesDescription=连接属性过滤器
recentSearchesDescriptionNames=<名称>,例如 "本地机器"。
recentSearchesDescriptionTags=<标签>,例如 "我的自定义标签
recentSearchesDescriptionTypes=<类型>,如 "Docker 容器"。
recentSearchesDescriptionState=<状态>,例如 "运行中"。
recentSearchesDescriptionJoin=<s1>、<s2> 用逗号组合
recentQuickConnections=最近的快速连接
recentQuickConnectionsDescription=通过字符串快速连接
recentUrls=最近的 URL
+2
View File
@@ -1968,6 +1968,8 @@ recentSearchesDescription=連線屬性篩選器
recentSearchesDescriptionNames=<名稱>,例如 「本機」。
recentSearchesDescriptionTags=<tag>, 例如 "my-custom-tag"
recentSearchesDescriptionTypes=<類型>,例如 「Docker 容器」。
recentSearchesDescriptionState=<狀態>,例如 「執行中」
recentSearchesDescriptionJoin=<s1>、<s2> 與逗號結合
recentQuickConnections=最近的快速連線
recentQuickConnectionsDescription=透過字串快速連線
recentUrls=最近的網址