Merge pull request #1118 from fredizzimo/improve_wsl_launch

Run WSL Neovim inside a login shell
macos-click-through
fredizzimo 3 years ago committed by GitHub
commit 224f1f2083
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -26,71 +26,72 @@ fn set_windows_creation_flags(cmd: &mut Command) {
cmd.creation_flags(0x0800_0000); // CREATE_NO_WINDOW cmd.creation_flags(0x0800_0000); // CREATE_NO_WINDOW
} }
#[cfg(windows)] fn build_nvim_cmd_with_args(bin: &str) -> Command {
fn platform_build_nvim_cmd(bin: &str) -> Option<Command> { let mut args = Vec::<String>::new();
args.push("--embed".to_string());
args.extend(SETTINGS.get::<CmdLineSettings>().neovim_args);
#[cfg(windows)]
if SETTINGS.get::<CmdLineSettings>().wsl { if SETTINGS.get::<CmdLineSettings>().wsl {
let mut cmd = Command::new("wsl"); let mut cmd = Command::new("wsl");
cmd.args(&[ let argstring = format!("{} {}", bin.trim(), args.join(" "));
bin.trim(), cmd.args(&["$SHELL", "-lc", &argstring]);
"-c", return cmd;
"let \\$PATH=system(\"\\$SHELL -lic 'echo \\$PATH' 2>/dev/null\")",
]);
Some(cmd)
} else if Path::new(&bin).exists() {
Some(Command::new(bin))
} else {
None
} }
let mut cmd = Command::new(bin);
cmd.args(args);
cmd
} }
#[cfg(unix)] fn platform_exists(bin: &str) -> bool {
fn platform_build_nvim_cmd(bin: &str) -> Option<Command> { #[cfg(windows)]
if Path::new(&bin).exists() { if SETTINGS.get::<CmdLineSettings>().wsl {
Some(Command::new(bin)) if let Ok(output) = std::process::Command::new("wsl")
.args(&["$SHELL", "-lic"])
.arg(format!("exists -x {}", bin))
.output()
{
return output.status.success();
} else { } else {
None error!("wsl exists failed");
std::process::exit(1);
}
} }
Path::new(&bin).exists()
} }
fn build_nvim_cmd() -> Command { fn platform_which(bin: &str) -> Option<String> {
if let Some(path) = SETTINGS.get::<CmdLineSettings>().neovim_bin {
if let Some(cmd) = platform_build_nvim_cmd(&path) {
return cmd;
} else {
warn!("NEOVIM_BIN is invalid falling back to first bin in PATH");
}
}
#[cfg(windows)] #[cfg(windows)]
if SETTINGS.get::<CmdLineSettings>().wsl { if SETTINGS.get::<CmdLineSettings>().wsl {
if let Ok(output) = std::process::Command::new("wsl") if let Ok(output) = std::process::Command::new("wsl")
.args(&["$SHELL", "-lic", "which nvim"]) .args(&["$SHELL", "-lic"])
.arg(format!("which {}", bin))
.output() .output()
{ {
if output.status.success() { if output.status.success() {
let path = String::from_utf8(output.stdout).unwrap(); return Some(String::from_utf8(output.stdout).unwrap());
let mut cmd = Command::new("wsl");
cmd.args(&[
path.trim(),
"-c",
"let \\$PATH=system(\"\\$SHELL -lic 'echo \\$PATH' 2>/dev/null\")",
]);
return cmd;
} else { } else {
error!("nvim not found in WSL path"); return None;
std::process::exit(1);
} }
} else {
error!("wsl which nvim failed");
std::process::exit(1);
} }
} }
if let Ok(path) = which::which("nvim") { if let Ok(path) = which::which(bin) {
if let Some(cmd) = platform_build_nvim_cmd(path.to_str().unwrap()) { path.into_os_string().into_string().ok()
cmd
} else { } else {
error!("nvim does not have proper permissions!"); None
std::process::exit(1);
} }
}
fn build_nvim_cmd() -> Command {
if let Some(path) = SETTINGS.get::<CmdLineSettings>().neovim_bin {
if platform_exists(&path) {
return build_nvim_cmd_with_args(&path);
} else {
warn!("NEOVIM_BIN is invalid falling back to first bin in PATH");
}
}
if let Some(path) = platform_which("nvim") {
build_nvim_cmd_with_args(&path)
} else { } else {
error!("nvim not found!"); error!("nvim not found!");
std::process::exit(1); std::process::exit(1);
@ -120,9 +121,6 @@ pub fn build_neovide_command(channel: u64, num_args: u64, command: &str, event:
pub fn create_nvim_command() -> Command { pub fn create_nvim_command() -> Command {
let mut cmd = build_nvim_cmd(); let mut cmd = build_nvim_cmd();
cmd.arg("--embed")
.args(SETTINGS.get::<CmdLineSettings>().neovim_args.iter());
info!("Starting neovim with: {:?}", cmd); info!("Starting neovim with: {:?}", cmd);
#[cfg(not(debug_assertions))] #[cfg(not(debug_assertions))]

Loading…
Cancel
Save