Vim: Как вы используете внешний grep на окнах для поиска кавычек?

1081
Steve Vermeulen

По какой-то причине я не могу понять, как передавать одинарные кавычки внешним инструментам при использовании vim. Например, я мог бы захотеть вызвать внешний grep Vim для поиска текста «foo (то есть, одна кавычка, затем слово foo)

Так что я мог бы попробовать команду:

:grep \"foo *.txt 

Но это приводит к следующему сообщению об ошибке:

!findstr /n \"foo *.txt >C:\Users\[username]\AppData\Local\Temp\VIeC244.tmp 2>&1 shell returned 1 E40: Can't open errorfile C:\Users\[username]\AppData\Local\Temp\VIeC244.tmp 

Обратите внимание, что grep изменен, чтобы использовать 'findstr / n', так как я нахожусь на окнах (и это можно проверить, запустив echo &grepprg). Что я нахожу, так это то, что я могу легко выполнить поиск, который хочу, если я делаю это сам из командной строки, набрав следующее:

findstr /n \"foo *.txt 

Который работает именно так, как я ожидал

5
Просмотр сообщения об ошибке может быть полезным. Кроме того, вы пытались экранировать кавычку * дважды *, т. Е. `\\\" `? Я могу только предположить, что vim отменяет параметры, заданные для`: grep`, и вызывает `findstr / n" foo * .txt `- что, конечно, будет недопустимой командой и приведет к ошибке. n.st 10 лет назад 1
Хорошо, извините, я обновил вопрос сообщением об ошибке. Я перепробовал целую кучу вариантов, в том числе дважды, но не смог заставить его работать Steve Vermeulen 10 лет назад 0
Я также добавлю, что я использовал Vanilla Vim для моего тестирования Steve Vermeulen 10 лет назад 0
Вы пробовали `:! Findstr / n \" foo * .txt`? Если это не удастся, ваш рабочий каталог (попробуйте `: pwd`), возможно, не будет настроен так, как вы ожидаете, поэтому` * .txt` не будет найти что-нибудь. (По умолчанию Vim автоматически не меняет рабочий каталог на каталог текущего файла). n.st 10 лет назад 1
Чтобы автоматически изменить рабочий каталог на каталог текущего файла / буфера, добавьте следующую строку в ваш vimrc: `set autochdir` n.st 10 лет назад 1
"grep foo * .txt" работает нормально, поэтому я не думаю, что это текущий рабочий каталог. Я попробовал `! Findstr / n \" foo * .txt` и получил интересный вывод в командной оболочке, которая выскочила: `C: \ Windows \ system32 \ cmd.exe / c (findstr / n \ ^" foo *. txt) \ n вернула оболочку 1 \ n Нажмите любую клавишу, чтобы закрыть это окно ... `По-видимому, по какой-то причине он добавляет символ каретки Steve Vermeulen 10 лет назад 0
Пожалуйста, измените заголовок вашего вопроса: вы используете `findstr`, а не` grep`, а `: grep \" foo * .txt` работает с `grep` в любом случае. Я уже взял на себя смелость добавить тег` findstr`, но более точное название, безусловно, поможет вам. romainl 10 лет назад 0
Я писал об этом в vim_dev ... по-видимому, это место, где по умолчанию (и даже расширенное "(значение для shellxquote терпит неудачу. Https://groups.google.com/d/topic/vim_dev/sG2d6d3cPwg/discussion) Я опубликовал Обходной путь, который, кажется, работает для этой команды как ответ. Ben 10 лет назад 1
Спасибо Бен, это действительно интересно. @romainl: я обновил заголовок, упомянув, что это windows, но технически он все еще использует то, что vim называет внешним grep Steve Vermeulen 10 лет назад 0

1 ответ на вопрос

1
Ben

Вы можете попытаться временно (или навсегда) установить 'shellxquote' в одиночную кавычку, например :set shellxquote=\"

Обратите внимание, что это повредит некоторые внешние команды, используя специальные символы, такие как &, |, <,> и т. Д. (Все по умолчанию в shellxescape), поэтому вам может не потребоваться оставлять это значение. Но, похоже, это единственное место, где значение shellxquote по умолчанию из Vim 7.3.450 не работает.