Чи існує спосіб використання декількох методів складання vim одночасно?


14

Я foldmethod=indentвстановив своє ~/.vimrc, і взагалі це працює для мене, і я хотів би його зберегти.

Однак у мене є кілька файлів, які я регулярно редагую (і які знаходяться під моїм ексклюзивним контролем), і які я хочу додати в систему на основі маркера, зокрема, щоб відкрити файл великий розділ I рідко погляд (який уже "відмежений" відступом) попередньо складений. Схоже , що foldmethod=markerдозволить мені зробити це (я не проти непарного коментаря в файл , щоб вказати ці «до-складки» , якщо це необхідно), але я все одно хочу foldmethod=indentвстановити так , що я можу використовувати zc, zoі так далі , щоб потім скласти або розгорнути секції за відступами. Наскільки я можу сказати, я не можу встановити foldmethod на кілька значень.

Чи є інший спосіб я досягти цього (в ідеалі використовуючи щось, вбудоване у сам файл)?


Я також намагаюсь одночасно працювати як методами маркера, так і відступами. Я також вважаю, що використовувати вираз складки - найкращий варіант. Ви знайшли вираз, який відповідає як відступі, так і маркеру?
Jp_

1
@Jp_ nope, 'fraid ні.
Ендрю Фер’є

Відповіді:


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що перемикає метод fold на основі поточного рядка:

" Use markers when in the first 100 lines, else use indent.
:autocmd CursorMoved,CursorMovedI <buffer> let &l:foldmethod = (line('.') <= 100 ? 'manual' : 'indent')

1
Спасибі. Отже, це говорить мені, що я можу встановити foldmethod для маркування всередині цього буфера. Але то , що я шукаю що - то , що до сих пір дозволяє мені використовувати відступ foldmethod, в той час як є деякі розділи (які є розділеними відступом) , попередньо зігнутим. Якщо я (4) вище, zc, zoі так далі більше не працює , як передбачалося в цьому буфері. Я уточнив своє запитання.
Ендрю Фер’є

Ваше питання не було чітким в цьому аспекті, дякую за пояснення. Я змінив свою відповідь.
Інго Каркат

Так, вибачте, якщо я не був зрозумілий. Foldexpr звучить як найкращий підхід, але також складний. Я все ж спробую. +1 для вказівника.
Ендрю Фер’є

Знову дякую. Я намагався написати foldexpr і відкрив тут пов'язаний Q, який може зацікавити: superuser.com/questions/560167/…
Ендрю Фер'єр

@IngoKarkat: У першому абзаці під рядком ви написали, що на буфер може бути лише один складний метод . Я вважаю, що це має бути за вікном .
garyjohn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.