Эффективный способ запуска графического приложения с несколькими мониторами с помощью WSL2 и VcXsrv в Windows

Эффективный способ запуска графического приложения с несколькими мониторами с помощью WSL2 и VcXsrv в Windows

Я использую WSL2 на Windows, в данный момент в основном для запуска моего настроенного emacs. Мой рабочий процесс для запуска emacs немного громоздкий. После каждой загрузки мне приходится запускать приложение Xsrv с настройкой нескольких мониторов. Затем откройте новый терминал Windows, откройте Ubuntu 18.04, запустите графическую среду Xfce4. Затем в этой графической среде запустите терминал и, наконец, используйте emacsкоманду для запуска emacs.

Как вы заметили, это довольно много шагов, чтобы запустить графическую версию emacs, которую можно использовать на нескольких мониторах. Мой вопрос в том, как можно ускорить процесс. Прямо сейчас у меня есть идеи создать скрипт autohotkey и проверить, можно ли запустить графический сеанс с WSL2 по умолчанию. Я был бы очень благодарен, если бы вы могли дать мне несколько советов. Являются ли эти идеи лучшим, что я могу сделать, или есть какие-то другие трюки, как я мог бы запустить графическую версию emacs с помощью нескольких действий?

решение1

Вы можете автоматизировать запуск VcXsrv с вашими настройками. Я так и сделал.

Часть 1: Автоматический запуск VcXsrv

При запуске vcxsrv каждый раз будет появляться экран конфигурации.
Когда вы дойдете до последнего экрана конфигурации, есть возможность сохранить его. Затем вы создадите ярлык, указывающий на эту сохраненную конфигурацию, и поместите его в автозагрузку. Вот пост Суперпользователяпоговорим о различных способах автоматического запуска vcxsrv.

Часть 2: Экспортируйте свой дисплей

x11 поддерживает "пересылку" команд управления окнами на разные IP-адреса (и рабочие столы), чтобы разрешить что-то вроде удаленного рабочего стола Windows.. лучше во многих/большинстве способов.. но не во всех. Эта функция была в x11 с самого начала.

Чтобы экспортировать дисплей, вам нужно установить переменную окружения DISPLAY перед запуском приложения x11. Обычно, лучший способ сделать это — поместить команду экспорта в файл ~/.bashrc (предполагая, что вы используете bash), чтобы не приходилось делать это каждый раз. Строка будет выглядеть так: export DISPLAY=<ip_address>:0.0 0.0 относится к рабочему столу, на который вы ориентируетесь, но для избежания путаницы просто используйте 0.0.

Быстрый способ сделать это — выполнить следующие команды в терминале bash.

  1. echo "export DISPLAY=localhost:0.0" >> ~/.bashrc
  2. source ~/.bashrc(или вы можете перезапустить свой терминал здесь)

Теперь вы готовы запустить любое приложение x11 и отобразить его в Windows.

Я укажу, что если у вас возникли сбои с каким-либо конкретным приложением, попробуйте отключить поддержку Open Gl в VcXsrv. Я не мог запустить VisualStudio Code, пока не отключил эту настройку.

Часть 3: Ярлык Windows для запуска Linux x11!

  1. Создайте ярлык Windows для bash.exe (или wsl.exe).
  2. После «.exe» в поле Цель: добавьте «-c [x11_thing_to_run]» (для wsl.exe это --exec, а не -c)
  3. Если он не запускается в графическом режиме, заново добавьте среду DISPLAY в строку... вот такbash.exe -c "DISPLAY=127.0.0.1:0.0 xemacs"
  4. Переименуйте свой ярлык в x11 и назначьте ему супер-крутой значок. введите описание изображения здесь

Готовый продукт введите описание изображения здесь

решение2

Theответ от сеньора CMasMasпо всем параметрам верно. Но если вы на WSL 2, то localhostне будет работать. По крайней мере, не работало на момент написания этого. (Ходят слухи, что команда WSL работает над чем-то, чтобы решить эту проблему.)

Причина в том, что WSL 2 помещает вашу Ubuntu (или что-то подобное) на отдельную (виртуальную) машину, а не как часть машины Windows (как это делал WSL 1).

Чтобы это исправить, вам нужно рассчитать DISPLAYследующим образом:

export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0

Хороший способ сделать это и забыть об этом — поместить его в ~/.bashrcфайл. Но тогда вход в WSL должен быть оболочкой входа, иначе он не будет запущен.

Если вы используете ссылку на bash.exe, что является более простым путем, я думаю, ваша команда должна выглядеть примерно так

 bash.exe -i -c emacs

Это -iозначает, что оболочка должна быть интерактивной, то есть она должна выполнять полный сценарий входа в систему.

Но это оставляет окно bash открытым, пока команда (emacs) запущена. Поскольку у меня установлен Cygwin, я использую его runкоманду, которая выкидывает команду и затем уходит. Так что это моя команда

C:\cygwin64\bin\run.exe bash -i -c emacs

Связанный контент