Сценарий для включения двойного щелчка по файлу в проводнике и запуска / запуска его с помощью приложения WSL (Neovim, Vim, и т. Д. c) в Windows Терминале - PullRequest
3 голосов
/ 13 июля 2020

Я использую WSL (Windows Подсистема для Linux). У меня установлен Neovim / Vim / et c в WSL и wi sh, чтобы иметь возможность открывать файл в проводнике и открывать его, скажем, Neovim, установленный в WSL, в терминале windows. Какой скрипт написать для его запуска, я борюсь с экранированием двойных кавычек из cmd через wt.exe, затем в WSL bash.

Может быть больно держать две версии Neovim / Vim настроен для windows и linux. Скорее просто используйте только версию WSL как в windows, так и в WSL.

1 Ответ

3 голосов
/ 13 июля 2020

TL; DR

Свяжите тип файла с запуском этого пакетного скрипта (установите myapp соответственно):

@echo off
set my_app=nvim
set my_wt_profile="Ubuntu-20.04"
set pp=%1
set pp=%pp:'='\''%
set pp=%pp:;=\;%
set launch="p=$(wslpath '%pp:"=%') && cd \\"^""$(dirname \\"^""$p\\"^"")\\"^"" && %my_app% \\"^""$p\\"^""
start wt.exe new-tab -p %my_wt_profile% bash -i -c %launch%

И репозиторий скриптов на github

Intro

К сожалению, нельзя связать сценарий PowerShell с типом файла (через open withchoose another appLook for another app on this pc). Выберите запись командного файла и поместите туда все logi c. Было бы проще создать сценарий bash или плагин vim при загрузке файла, но тогда есть две части головоломки, которые должны быть синхронизированы друг с другом.

Выполните следующие шаги:

  1. Создайте командный файл и вставьте следующий код (мы будем называть этот скрипт «скриптом запуска», я назвал его wsl_nvim.bat):

Примечание. Следующий код такой же, как версия TL; DR, но с комментариями:

:: This batch script is ment to be associated with file types, such that when
:: the associated file type is opened, it calls this script.
:: This script then open it with Neovim within WSL in a windows terminal (wt).


:: If require a " in the bash command, escape it with \\"^""
:: Example1: To print in bash via cmd the following string: hel'lo
:: bash -i -c "echo "^""hel'lo"^"" "
:: Example2: To print in bash via cmd via wt.exe: hel'lo
:: wt.exe new-tab -p "Command Prompt" cmd /k bash -i -c "echo \\"^""hel'lo\\"^"" "
::
:: To cd to the parent dir: cd "$(dirname "$p")"
:: Escaping it becomes:     cd \"^""$(dirname \"^""$p\"^"")\"^""

@echo off

:: === REQUIRED CUSTOM VALUES ==================================================

:: The name of the WSL app to run
set my_app=nvim

:: The name of your windows terminal linux profile, open the windows terminal
:: settings file and file the linx profile name, e.g.: "name": "Ubuntu-20.04",
set my_wt_profile="Ubuntu-20.04"

:: =============================================================================

:: Windows passes in the filepath in double quotes, e.g.: "C:\Users\Michael\foo.txt"
set pp=%1

:: We passing the path into bash, which has $ and \, so we pass within single quotes
:: so all chars will be taken literally, except the single quote, which we can
:: escape with '\''
set pp=%pp:'='\''%

:: When wt.exe interprets the string, need to escape the semicolon with \;
set pp=%pp:;=\;%

:: Launch basically does: pass in $p, get wslpath of $p, then cd to the dir
:: of the wslpath, then open wslpath with nvim.
:: wslpath requires the input to be within single quotes, or else it will fail.
:: full wt.exe path: %LOCALAPPDATA%\Microsoft\WindowsApps\wt.exe
:: GIANT GOTCHA! Can only strip outter double quotes from %pp% if placing within
:: double quotes, else special chars will be interpretted literally, e.g. ^ will escape.
set launch="p=$(wslpath '%pp:"=%') && cd \\"^""$(dirname \\"^""$p\\"^"")\\"^"" && %my_app% \\"^""$p\\"^""

:: Use `start` to launch cmd and cleanup/close the parent process immediately.
:: bash -i starts bash interactively.
:: bash -c "long command" start bash and allow one to pass in a command to run.
start wt.exe new-tab -p %my_wt_profile% bash -i -c %launch%

Бонус 1 - Свяжите «сценарий запуска» с типами текстовых файлов

Давайте создадим пакетный сценарий доступно как опция в параметрах Open with, вызываемых правой кнопкой мыши explorer.exe. В разделе Open with может потребоваться выбрать choose another app и прокрутить вниз, что по-прежнему намного проще, чем искать в файловой системе пакетный сценарий для каждого нового типа файла.

Выполните следующие шаги:

  1. Скопируйте следующий пакетный сценарий и вставьте его в файл в том же каталоге, что и указанный выше сценарий.
  2. Измените значение myscript, чтобы оно указывало на выбранное вами имя «сценария запуска».
  3. Сохраните и закройте пакетный сценарий.
  4. Щелкните правой кнопкой мыши пакетный сценарий и выберите Run as administrator
:: This batch script associates the files in %list% with the `txtfile` type, and
:: changes the `txtfile` type to open with with %myscrip%.
:: It does not make it the default app.
:: One can't programmatically change the default file association of an already
:: associated filetype in Windows 10 after the first login without the gui,
:: this is by design for security.

@echo off
echo !!! THIS SCRIPT MUST BE RUN AS ADMIN !!!

:: === CUSTOM VALUES START =====================================================

:: A space separated list of extensions to be associated with the `txtfile` type
set list=css gitignore html ini js json lua log markdown md php py render sass scss template text txt xml

:: Set myscript to the double quote filepath of the script to run
:: %~dp0 is the dir of this script file
set myscript="%~dp0wsl_nvim.bat"

:: === CUSTOM VALUES END =======================================================

:: e.g. require the same as if one typed into cmd: ftype txtfile="C:\current dir\wsl_nvim.bat" "%1"
echo:
echo Create a `ftype` called `txtfile` and assign it to run with WSL NVIM:"
ftype txtfile=%myscript% "%%1"

echo:
echo `ftype` set for `txtfile`, let's check its set:
ftype | findstr "txtfile"

echo:
echo Create a `assoc` between extensions in %list% with `txtfile`
(for %%a in (%list%) do (
   assoc .%%a=txtfile
))

echo:
echo `assoc` set for each extension, lets check `assoc`:
assoc | findstr ".txt"

echo:
echo Now if you right click on one of these file extensions, and select `Open with`,
echo and select `choose another app`, it should list %myscript% there.
echo SCRIPT COMPLETE.
pause

Бонус 2 - Создайте ярлык на панели задач

  1. Скопируйте путь к «сценарию запуска».
  2. В проводнике щелкните правой кнопкой мыши NewShortcut.
  3. Введите подходящее имя, например WSL NVIM
  4. Теперь, если щелкнуть правой кнопкой мыши по вновь созданному ярлыку, появится опция no для закрепления на панели задач или запуска.
  5. Щелкните правой кнопкой мыши значок ярлык, выберите Properties и измените поле target на (не забудьте настроить оба pa ths!):
    cmd.exe /s /c ""C:\path\to\launch\script\wsl_nvim.bat" "\\wsl$\Ubuntu-20.04\desirable\default\location\temp_filename""
    
    Для меня это выглядит так:
    cmd.exe /s /c ""C:\code\software_setup\utils\wsl_nvim.bat" "\\wsl$\Ubuntu-20.04\home\michael\temp""
    

Теперь, если вы дважды щелкните ярлык, оно должно открыть приложение wsl с пустым файлом в указанном месте с имя временного файла (в зависимости от того, как ваше приложение обрабатывает пути). Теперь вы можете щелкнуть ярлык правой кнопкой мыши и закрепить его на панели задач или в меню «Пуск».

...