На моем .vimrc
я использую это:
:map ,p :!clear; grep -E "def \|class " %
чтобы сопоставить ,p
с grep, который предоставляет определение Python и иерархию классов, это работает очень хорошо.
Я безуспешно пытаюсь сделать то же самое, чтобы получить структуру vuejs.
Я получаю то, что мне нужно на Bash, с помощью этого grep
:
$ grep -E '^\s+\S+: {|\() {$|<script>|import' /tmp/somevuejs.vue
Но когда я пытаюсь надеть его .vimrc
:
:map ,j :!clear; grep -E '^\s+\S+: {|\() {$|<script>|import' %
Я получаю эту ошибку:
$ vim file.txt
Error detected while processing /home/me/.vimrc:
line 20:
E10: \ should be followed by /, ? or &
Я пробовал несколько комбинаторных побегов без успеха, ничего из этого не сработало:
:map ,j :!clear; grep -E '^//\s+//\S+: {|\() {$|<script>|import' %
:map ,j :!clear; grep -E "^//\s+//\S+: {|\() {$|<script>|import" %
:help map-bar
говорит, что вы не можете использовать |
в сопоставлении, если вы каким-то образом не избежите его.
Ваше существующее сопоставление «работает», потому что его |
правильно экранирован:
:map ,p :!clear; grep -E "def \|class " %
^^
Ваше новое сопоставление не работает, потому что его многие |
не экранированы:
:map ,j :!clear; grep -E '^\s+\S+: {|\() {$|<script>|import' %
^ ^ ^
Точная ошибка, о которой сообщает Vim, вызвана этой конструкцией:
{|\(
|
рассматривается Vim как разделитель между двумя командами Vim, поэтому вы получаете одну команду Vim:
:!clear; grep -E '^\s+\S+: {
(которая в любом случае выполняет внешнюю команду borked), за которой следует вторая:
:\() {$|<script>|import' %
что на самом деле не имеет смысла. Это \
вызывает ошибку. Если вы избежите этого первого |
, вы получите другую ошибку, вызванную вторым |
, а затем еще одну, вызванную третьим |
.
Избегайте этих |
, чтобы ваше отображение «работало»:
:map ,j :!clear; grep -E '^\s+\S+: {\|\() {$\|<script>\|import' %
^^ ^^ ^^
Я поставил «работу» в кавычки, потому что эти сопоставления очень неуклюжи.
Им нужен <CR>
в конце, чтобы вам не пришлось нажимать Enter для выполнения команды:
:map ,p :!clear; grep -E "def \|class " %<CR>
:map ,j :!clear; grep -E '^\s+\S+: {\|\() {$\|<script>\|import' %<CR>
Они должны быть ограничены нормальным режимом, если только вы действительно не хотите, чтобы они были определены для визуальных режимов, режимов выбора и режима ожидания оператора:
:nmap ,p :!clear; grep -E "def \|class " %<CR>
:nmap ,j :!clear; grep -E '^\s+\S+: {\|\() {$\|<script>\|import' %<CR>
Поскольку вы, похоже, не используете другое сопоставление в своих сопоставлениях, лучше всего сделать их нерекурсивными:
:nnoremap ,p :!clear; grep -E "def \|class " %<CR>
:nnoremap ,j :!clear; grep -E '^\s+\S+: {\|\() {$\|<script>\|import' %<CR>
И, поскольку вы находитесь в сценарии, вы можете безопасно удалить двоеточие:
nnoremap ,p :!clear; grep -E "def \|class " %<CR>
nnoremap ,j :!clear; grep -E '^\s+\S+: {\|\() {$\|<script>\|import' %<CR>
Это намного чище!
Теперь, я думаю, мы сохраним следующую загадку, а именно, почему вы используете для этого внешний инструмент вместо :help :global
, для комментариев… или для другого вопроса.
Позвольте мне уточнить точную ошибку.
Спасибо очень ясно; Что меня смутило в сообщении об ошибке, так это «E10: за \ должны следовать /, ? или &» относятся к «\», а не к «|»