Есть ли способ использовать несколько методов сворачивания vim одновременно?

14

Я foldmethod=indentустановил в моем ~/.vimrc, и в целом это работает для меня, и я хотел бы сохранить его.

Тем не менее, у меня есть несколько файлов, которые я регулярно редактирую (и которые находятся под моим эксклюзивным контролем), и которые я хотел бы добавить в систему на основе маркеров, в частности, чтобы при открытии файла большой раздел редко просматривается (который уже «разделен» отступом) предварительно сложен. Похоже , что foldmethod=markerпозволит мне сделать это (я не против нечетного комментария в файл , чтобы указать эти «до-складки» , если это необходимо), но я все равно хочу foldmethod=indentустановить так , что я могу использовать zc, zoи так далее , чтобы затем сложить или развернуть разделы с помощью отступа. Насколько я могу судить, я не могу установить метод сгибания для нескольких значений.

Есть ли другой способ добиться этого (в идеале, используя что-то встроенное в сам файл)?

Эндрю Ферье
источник
Я также пытаюсь заставить оба метода сгиба маркера и отступа работать одновременно. Я также считаю, что использовать выражение сгиба является лучшим вариантом. Вы нашли выражение, соответствующее как отступу, так и маркеру?
Jp_
1
@Jp_ Нет, не надо.
Эндрю Ферье

Ответы:

10

Каждое окно может иметь свое локальное значение 'foldmethod'; то, что вы устанавливаете, ~/.vimrcэто просто глобальное значение по умолчанию. Есть несколько способов установить другое локальное значение для конкретного буфера :

  1. Вручную с :setlocal foldmethod=marker
  2. Для определенного типа файла (например, файлы Java): :autocmd FileType java setlocal foldmethod=marker(или в ~/.vim/after/ftplugin/java.vim)
  3. Для конкретного файла (ов): :autocmd BufRead /path/to/file setlocal foldmethod=marker
  4. Внутри самого файла через моделину (так как вы все равно должны добавить маркеры, я бы предпочел это):

/* vim: set fdm=manual : */

Там все еще может быть только один раз методом внутри одного окна. Если вы хотите использовать разные стратегии, вы должны выбрать более гибкий метод (например expr) и повторно внедрить там «другой» метод (например, сделав свой 'foldexpr'анализ отступа). Или вы используете два разделения окна для одного и того же буфера и устанавливаете разные методы сгиба для каждого разделения.

Поскольку это, вероятно, не то, что вы хотите услышать, вы можете взломать что-нибудь вместе с параметром, :autocmd CursorMovedкоторый переключает метод сгиба на основе текущей строки:

" Use markers when in the first 100 lines, else use indent.
:autocmd CursorMoved,CursorMovedI <buffer> let &l:foldmethod = (line('.') <= 100 ? 'manual' : 'indent')
Инго Каркат
источник
1
Благодарю. Так что это говорит мне, что я могу установить метод метки в маркере внутри этого буфера. Но то , что я ищу что - то , что до сих пор позволяет мне использовать отступ foldmethod, в то время как есть некоторые разделы (которые являются разделёнными отступом) , предварительно согнутым. Если я (4) выше, zc, zoи так далее больше не работает , как предполагалось в этом буфере. Я уточнил свой вопрос.
Эндрю Ферье
Ваш вопрос не был ясен в этом аспекте, спасибо за разъяснение. Я исправил свой ответ.
Инго Каркат
Да, прошу прощения, если я не ясно. Foldexpr звучит как лучший подход, но и сложный. Я попробую, хотя. +1 за указатель.
Эндрю Ферье
Еще раз спасибо. Я пытался написать foldexpr и открыл соответствующий вопрос здесь, который может представлять интерес: superuser.com/questions/560167/…
Эндрю Ферье
@IngoKarkat: В первом абзаце под строкой, которую вы написали, может быть только один метод сгиба на буфер . Я считаю, что должно быть за окном .
garyjohn