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 with
→ choose another app
→ Look for another app on this pc
). Выберите запись командного файла и поместите туда все logi c. Было бы проще создать сценарий bash или плагин vim при загрузке файла, но тогда есть две части головоломки, которые должны быть синхронизированы друг с другом.
Выполните следующие шаги:
- Создайте командный файл и вставьте следующий код (мы будем называть этот скрипт «скриптом запуска», я назвал его
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
и прокрутить вниз, что по-прежнему намного проще, чем искать в файловой системе пакетный сценарий для каждого нового типа файла.
Выполните следующие шаги:
- Скопируйте следующий пакетный сценарий и вставьте его в файл в том же каталоге, что и указанный выше сценарий.
- Измените значение
myscript
, чтобы оно указывало на выбранное вами имя «сценария запуска». - Сохраните и закройте пакетный сценарий.
- Щелкните правой кнопкой мыши пакетный сценарий и выберите
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 - Создайте ярлык на панели задач
- Скопируйте путь к «сценарию запуска».
- В проводнике щелкните правой кнопкой мыши
New
→ Shortcut
. - Введите подходящее имя, например
WSL NVIM
- Теперь, если щелкнуть правой кнопкой мыши по вновь созданному ярлыку, появится опция no для закрепления на панели задач или запуска.
- Щелкните правой кнопкой мыши значок ярлык, выберите
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 с пустым файлом в указанном месте с имя временного файла (в зависимости от того, как ваше приложение обрабатывает пути). Теперь вы можете щелкнуть ярлык правой кнопкой мыши и закрепить его на панели задач или в меню «Пуск».