Я хочу перемещаться между строками файла на основе отступа. Файл структурирован с отступом: строка, которая имеет больший отступ, чем предыдущая строка, является дочерней по отношению к предыдущей строке, а строка с таким же отступом, что и у предыдущей строки, является ее родственным элементом. Я в основном ищу три команды:
- Перейдите к следующему брату, то есть к следующей строке с таким же отступом, пропуская строки с более отступами, но не пропуская строку с менее отступом.
- Переходите к предыдущему брату, то есть к тому же в другом направлении.
- Перейти к родителю, т.е. к предыдущей строке с меньшим отступом.
Положение столбца точки не должно меняться.
Это аналоги данных, структурированных по отступам forward-sexp
, backward-sexp
и backward-up-list
данных, структурированных по полу. Отступы соответствуют структуре программы в таких языках, как Haskell и Python; эти функции могут быть особенно полезны в этом контексте, но я не ищу ничего, зависящего от режима (мой основной вариант использования - структурированные данные внутри другого формата файла).
Уровни цветового отступа могут помочь перемещаться вручную с помощью Up/, Downно я хочу что-то автоматическое.
Этот вопрос суперпользователя похож, но с более слабыми требованиями и в настоящее время не имеет ответов, отвечающих моим требованиям.
источник
set-selective-display
получить Вас близко к тому , что вам нужно?indent-tools
в melpa ( indent-tools ), который, вероятно, работает для этой цели. Первый коммит был 2016-мая-16, примерно через 3 месяца после того, как был задан этот вопрос.Ответы:
Изучая четыре доступных ответа ( два на Супер пользователя и два на этот вопрос), я вижу следующие проблемы:
outline.el
, он все равно в основном идет построчно (используяoutline-next-visible-heading
) в нашем случае, так как (почти) все строки будут соответствовать регулярному выражению структуры и считаться «заголовком».Итак, объединяя некоторые идеи каждого из них, у меня есть следующее: продвигаться вперед строка за строкой, пропуская пустые и более пропущенные строки. Если у вас одинаковый отступ, то это следующий брат. Основная идея выглядит так:
Соответственно обобщенный (вперед / назад / вверх / вниз), что я использую, выглядит следующим образом:
По-прежнему желательна еще некоторая функциональность, и
outline.el
может помочь рассмотрение и переопределение некоторых из них, но сейчас я доволен этим для моих целей.источник
(current-line)
то из того,misc-fns.el
что у меня есть в моей установке Aquamacs как часть какой-тоoneonone.el
библиотеки.Эта функция существует в Emacs. Режим Outline описывает документ как содержащий строки заголовка с уровнем и имеет средства для перемещения между уровнями. Мы можем определить каждую строку как строку заголовка с уровнем, который отражает ее отступ: установить
outline-regexp
отступ. Точнее, отступы плюс первый непробельный характер (и начало файла верхнего уровня):\`\|\s-+\S-
.В Emacs 22.1–24.3 вы можете упростить это до:
Затем вы можете использовать команды движения контура :
C-C @ C-f
(outline-forward-same-level
) перейти к следующему брату;C-C @ C-b
(outline-backward-same-level
) перейти к предыдущему брату;C-C @ C-u
(outline-up-heading
) перейти к родителю.Одна вкладка и один пробел имеют одинаковое количество отступов. Если у вас есть сочетание вкладок и пробелов, установите
tab-width
соответствующим образом и позвонитеuntabify
.Если текущий основной режим имеет настройки контура, они могут конфликтовать. В этом случае вы можете использовать одно из множества решений для нескольких основных режимов , самое простое из которых - создать косвенный буфер и установить для него режим Outline Major Mode. В основном режиме Outline основные сочетания клавиш по умолчанию проще набирать:
C-c C-f
и т. Д.источник
M-x make-local-variable RET outline-regexp RET
не принимает эту переменную и говорит только `[Нет совпадений]`. Я еще, чтобы изучить это более тщательно.outline-regexp
оно больше не является пользовательским и не может быть легко установлено в интерактивном режиме.Следующие три команды, прошедшие минимальную проверку, должны обеспечивать базовую навигацию по отступам. Извиняюсь за повторение кода.
источник
(current-column)
но это заставляет курсор не двигаться), но не совсем соответствует моим требованиям: перемещение на уровне отступа проходит меньше с отступом строк.ind-forward-sibling
просто ищет следующую строку с таким же отступом, поэтому он пропускает строки с меньшим отступом (он идет вперед, даже когда нет прямого брата).