Перекрестное открытие терминала - PullRequest
0 голосов
/ 31 октября 2019

В электронном виде я регистрирую ярлык для открытия терминала:

globalShortcut.register('CommandOrControl+Alt+Shift+P', () => {
    spawn(os.platform() === 'linux' ? 'xterm' : 'cmd');
});

Я заметил, что xterm не имеет того же "стиля" терминала, открытого из меню ОС, и я нашелчто последний настраивается в среде рабочего стола (у меня есть Ubuntu Mate, где его терминал mate-terminal и RedHat 7.5 с konsole).

Я читаю здесь , что nodejs donУ него нет API для определения распределения, поэтому кажется невозможным узнать, какой терминал запустить в зависимости от распределения.

Есть ли способ открыть правильный терминал или присвоить xterm стиль операционной системы? ?

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

TL; DR: Для этого нет стандартизированного API, и вы не можете быть уверены, что в дистрибутиве указано приложение терминала.

Прежде всего, XTerm, Mate's Terminal, Konsole и т. Д. все разные приложения. А поскольку Ubuntu Mate под капотом сообщает как Ubuntu, AFAIK, вы даже не можете быть уверены, что это приложение зарегистрировано как «терминальное» приложение. Кроме того, почти в каждой среде рабочего стола имеется свое собственное терминальное приложение, и, поскольку вы можете устанавливать несколько терминальных приложений рядом, самое умное предположение - автоматически выбирать «подходящее» терминальное приложение.

Однако, естьСуществует несколько подходов, которые можно рассмотреть для решения этой (эстетической) проблемы:

  1. Пусть пользователь сам решит, какое терминальное приложение ему нужно. Если у вашего приложения есть файл конфигурации, вы можетеиспользуйте это, чтобы записать значение, указанное пользователем, и принять это как приложение терминала. Теоретически, они могли бы указать путь к приложению, которое не является терминальным приложением, но в этом их вина.
  2. Составить список известных терминальных приложений и проверить, установлены ли они. Например, вы можете составить (упорядоченный) список приложений, которые должно искать ваше приложение, и, если ни одно из них не будет найдено, вернитесь к XTerm (потому что он установлен на большинстве, если не на всех настольных системах, работающих под управлением Linux). Чтобы увидеть, установлено ли приложение и работает ли оно в Linux, вы можете использовать команду which. Пример:
const { spawnSync } = require ("child_process");
const terms = [ "konsole", "mate-terminal", "gnome-terminal" /* ... */ ];
var terminal = null;

// In your startup method (e.g. before opening a BrowserWindow)
if (os.platform () === "linux") {
    for (term in terms) {
        which = spawnSync ("which", [term]);
        if (which.status !== null && which.status === 0) { // Command found
            terminal = term;
            break;
        }
    }
    if (terminal === null) terminal = "xterm";
} else {
    terminal = "cmd";
}

Конечно, вы также можете использовать spawn в пользу spawnSync, но это будет более сложным. Кроме того, это дает вам только первое приложение, которое будет установлено, но не выбирает «подходящее» для среды рабочего стола. Но я полагаю, что это хороший шаг в правильном направлении, если вы хотите, чтобы ваше приложение (как-то) казалось бы интегрировано в DE.

В качестве примечания: ваш код не учитывает MacOS, но этоТакже можно открыть терминал на MacOS, он там просто называется «Терминал».

0 голосов
/ 31 октября 2019

Node.js не предоставляет метод для непосредственного определения имени дистрибутива, поскольку не существует стандартного способа получения этой информации из различных Linux дистрибутивов.

Но вы можете сделать это с помощью библиотеки sush, как getos :

const getos = require('getos');

getos((err, os) => {
  if (err) return console.log(err);
  console.log(os.dist, os.codename)
})
...