Редактирование xml файлов с длинными строками очень медленное в vim. Что я могу сделать, чтобы исправить это? - программирование
Подтвердить что ты не робот

Редактирование xml файлов с длинными строками очень медленное в vim. Что я могу сделать, чтобы исправить это?

Я редактирую много xml файлов с помощью vim. Проблема в том, что из-за длинных строк, навигация/редактирование в vim происходит крайне медленно. Есть ли что-то, что я могу сделать (помимо отключения подсветки синтаксиса/плагинов filetype и отступов типа файла), чтобы иметь возможность редактировать эти файлы без этой задержки?

Неудивительно, что тривиальная вещь, такая как подсветка синтаксиса, так плохо обрабатывается vim. Я не помню, чтобы это было проблемой с любым другим редактором. Мне очень нравится использовать vim, и я надеюсь, что есть способ исправить это.

4b9b3361

Ответ 1

Проблема в том, что подсветка синтаксиса VIM медленна для длинных строк. Легкое исправление, которое лишь немного ухудшает функциональность, - ограничить выделение синтаксиса для первых столбцов x. Что-то вроде этого в вашем .vimrc:

set synmaxcol=120

Ответ 2

Это 2014 год, я использую Vim версии 7.4. подсветка синтаксиса и комбинация длинной строки все еще заставляют vim вести себя неприемлемо медленно. Поскольку это первый ответ, полученный от Google, я хотел отказаться от своих "текущих" решений.

  • Я обнаружил, что простое включение и выключение синтаксиса после загрузки файла-нарушителя позволяет vim вести себя в приемлемом темпе. Для удобства вы можете связать его

    :syntax off :syntax on

    или привяжите его: nnoremap <leader>ts :syntax off<cr>:syntax on<cr>

  • Я также обнаружил, что поиск моего .vimrc даст тот же результат

    :source $MYVIMRC

    и обязательная карта: nnoremap <leader>sv :source $MYVIMRC<cr>

EDIt ---- 07/31/14

Дальнейшее исследование привело меня к ограничению синтаксиса максимальным столбцом. Это сработало очень хорошо, и у меня не было никаких проблем, так как я добавляю ниже к моему vimrc.

set synmaxcol=250

этот синтаксис строго ограничивает первые 250 столбцов.

Ответ 3

:set nocursorline

должен помочь.

Ответ 4

Как насчет красивой печати вашего XML файла (если длина строки является реальной проблемой)? Вы можете сделать это, например. используя xmllint, который является частью пакета Gnome libxml2 (а также доступна версия для Windows).

Вы можете красиво печатать на месте, выполнив

xmllint --format -o xmlFile.xml xmlFile.xml

Ответ 5

У вас отключена перенос строк? По моему опыту, обертка строк может немного замедлить работу vim при работе с очень длинными строками.

set nowrap

Ответ 6

Самое простое и эффективное решение, которое я нашел, - просто отключить подсветку синтаксиса:
syntax off

Это, похоже, является преступником при работе с длинными строками. Кроме того, из моего опыта работы с vim и xml размер файла, похоже, не имеет значения - это длинные строки, которые вызывают эти спады.

Еще одна полезная задача - обернуть области с длинными строками в folds:

  <!--{{{ long lines -->
  <text>A reeealy long line</text>
  <!--}}}-->

Закрытие сгибов избавит вас от разбора синтаксиса этих строк. Конечно, такой подход не всегда практичен, но он отлично работал, когда у меня было всего несколько длинных строк, или они были в определенной области файла.

Часто Vim все еще заметно медленнее, но в большинстве случаев производительность становится приемлемой.

Ответ 7

Неа. Это подчеркивание синтаксиса, думаю, AFAIK. Подход Regex, который использует Vim, не является оптимальным решением, действительно, для редактирования xml файлов.

(конечно, вы всегда можете попробовать написать собственный файл синтаксиса для xml, в надежде, что вы сделаете лучшую работу)

Ответ 8

Для работы есть плагин, LargeFile. Он отключает некоторые события, подсветку синтаксиса и даже отмену. Вы не указали размер XML файлов, но плагин настраивается. Вы можете установить размер "большого файла" в мегабайтах, чтобы нормально обрабатывать "файлы, которые не являются большими".

Ответ 9

Я часто заменяю > <s> \r ↔ :s/>\s*</>\r</g, а затем перепечатать весь файл с помощью gg=G.

Ответ 10

Прокомментируйте строку

syn sync match xmlSyncDT grouphere  xmlDocType +\_.\(<!DOCTYPE\)\@=+

в файле xml.vim(с помощью ").

Эта проблема может быть отлажена в сеансе vim, набрав :syntime on, делая что-то, что демонстрирует медленность, и затем :syntime report. В моем случае он сообщил xmlSyncDT, взяв более 10 секунд в моем 6-мегабайтном файле xml с 4000-символьными строками, чтобы отобразить последнюю страницу файла. Комментирование строки выше не повлияло на подсветку синтаксиса, насколько я заметил, за исключением того, что теперь для отображения экрана не требуется больше секунды.

Ответ 11

Добавить в файл vimrc

nmap <leader>x <Esc>:set filetype=xml<CR>:%s/></>\r</g<CR><ESC>gg=G<Esc>:noh<CR>

нажатие x автоматически распечатает xml файл.

Ответ 12

Вы можете использовать эту функцию для вашего .vimrc, чтобы переформатировать ваш XML файл и, надеюсь, уменьшить длину строки.

function! DoPrettyXML()
  " save the filetype so we can restore it later
  let l:origft = &ft
  set ft=
  " delete the xml header if it exists. This will
  " permit us to surround the document with fake tags
  " without creating invalid xml.
  1s/<?xml .*?>//e
  " insert fake tags around the entire document.
  " This will permit us to pretty-format excerpts of
  " XML that may contain multiple top-level elements.
  0put ='<PrettyXML>'
  $put ='</PrettyXML>'
  silent %!xmllint --format -
  " xmllint will insert an <?xml?> header. it easy enough to delete
  " if you don't want it.
  " delete the fake tags
  2d
  $d
  " restore the 'normal' indentation, which is one extra level
  " too deep due to the extra tags we wrapped around the document.
  silent %<
  " back to home
  1
  " restore the filetype
  exe "set ft=" . l:origft
endfunction

command! PrettyXML call DoPrettyXML()

Ответ 13

Это вызвано синтаксическим анализом длинной строки в vim. Я, наконец, обнаружил, что если я удалю следующий из моего .vimrc, проблема решена:

filetype indent plugin on

Обратите внимание, что это не работает, если вы введете :filetype indent plugin off при редактировании файла с длинной строкой.