Редактирование xml файлов с длинными строками очень медленное в vim. Что я могу сделать, чтобы исправить это?
Я редактирую много xml файлов с помощью vim. Проблема в том, что из-за длинных строк, навигация/редактирование в vim происходит крайне медленно. Есть ли что-то, что я могу сделать (помимо отключения подсветки синтаксиса/плагинов filetype и отступов типа файла), чтобы иметь возможность редактировать эти файлы без этой задержки?
Неудивительно, что тривиальная вещь, такая как подсветка синтаксиса, так плохо обрабатывается vim. Я не помню, чтобы это было проблемой с любым другим редактором. Мне очень нравится использовать vim, и я надеюсь, что есть способ исправить это.
Ответы
Ответ 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
при редактировании файла с длинной строкой.