I am trying to get Nvim to execute the ls command by typing :!ls, this is the output:
(interestingly after typing :!ls and pressing enter, the ls gets put in quotes)
my init.vim file looks like this:

The interesting thing is, if I change the shell-setting to cmd, the output of :!ls now looks like this (which is exactly what a new cmd shell looks like):

So it looks like, using the external command, nvim starts a shell but does not execute the ls command. I should also mention that before I created the init.vim file, the external command was working - however - it was using cmd instead of powershell, which I do not want and which is why I created the init.nvim file.
PS: at first I've also tried setting shell=powershell, which didn't work either
PPS: in vim :!ls works as expected
CodePudding user response:
(To get cmd.exe to work, you'd need to set shellcmdflag to /c, otherwise any command passed is ignored, as you've experienced.)
The culprit turned out to be \" as the shellquote setting, as a result of which what you typed was accidentally getting enclosed in \"...\" when passed to the PowerShell's CLI's -Command parameter, causing PowerShell - after its command-line parsing - to execute "ls", including the quotes; the next section explains how PowerShell interprets such a command.
The correct setting is:
set shellquote="
Your first screenshot implies what PowerShell ended up executing was "ls", including the double quotes, which predictably results in verbatim ls getting printed:
To PowerShell, "ls" is a double-quoted string literal, whose value is simply echoed when submitted as a command, due to PowerShell's implicit output behavior (see the bottom section of this answer for background information).
That is, "ls" is equivalent to echo "ls", to put it in terms of a traditional shell (echo in PowerShell is an alias of the Write-Output cmdlet).
To submit ls (an alias of Get-ChildItem) as a command:
Do not use quoting, given that it isn't needed here (the command name,
ls, contains neither spaces nor other PowerShell metacharacters)::!lsAlternatively, use
&, the call operator::!& "ls"
See this answer for why use of & is needed with quoted commands.
