vim-dispatch
vim-dispatch copied to clipboard
difference in pipe escaping between :make and :Make
I'm trying to do this:
autocmd BufNewFile,BufRead *_spec.rb compiler rspec | set makeprg=`([\ -e\ .zeus.sock\ ]&&echo\ zeus)\ \\\|\\\|\ ([\ -e\ Gemfile\ ]&&echo\ bundle\ exec)`\ rspec
This works fine w/ :make but :Make I end up with
/bin/bash: command substitution: line 0: syntax error near unexpected token `\|\|'
/bin/bash: command substitution: line 0: `([ -e .zeus.sock ]&&echo zeus) \|\| ([ -e Gemfile ]&&echo bundle exec)'
Oh wow, so unescaped pipes in 'makeprg' "leak out" in to Vimscript? Gross.
This particular example can be rewritten to use if, so I don't consider this high priority. It's legitimate to want to pipe things in 'makeprg' though, so I do want to get this fixed.
Good call. So used to &&/|| for one liners, got tunnel vision. Thanks.
Keep an eye out for other oddities. For example, normally anywhere you can use a |, you can comment with ", but that's not true with 'makeprg'.
set makeprg=latexmk\ -gg\ -interaction=nonstopmode\ -file-line-error\ \\\|\ grep\ -P\ ':\\d{1,5}:\ '
I am getting:
|| Latexmk: -P bad option
||
|| Latexmk: Bad options specified
|| Use
|| latexmk -help
|| to get usage information
Any quick fixes?
Your use of grep suggests what you really want is a proper 'errorformat' that matches the lines in question.
Similar problem escaping "!" in make arguments. Discovered via ack.vim but reproducible with vim-dispatch alone.
Using ack in command line:
$ ack 'foo (?!==)='
content.txt:1:1:foo = bar
In vim:
:let &makeprg = 'ack -s -H --nopager --nocolor --nogroup --column'
:set errorformat=%f:%l:%c:%m
:make 'foo (?!==)=
With make, quickfix shows the same results as ack in the shell. With Make, the "!" is interpreted as a substitution and the command does not work. It does work with the exclamation mark escaped, though.