Зачем использовать косвенные буферы?


Ответы:


16

Чтобы увидеть и редактировать несколько мест в одном буфере. Таким образом, вам не нужно прокручивать длинный буфер, а просто переключать окно в видимую область. Каждый клонированный буфер также имеет различные метки кольца, сужения и другие свойства буфера. Если вы не используете косвенный буфер, а создаете другое окно с тем же буфером, то все совместно используется, и вы не можете выполнять другие дополнительные функции, кроме просмотра и редактирования разных мест. Например, с помощью косвенного буфера вы можете сложить весь блок кода, эффективно создав «дерево тегов», не затрагивая исходный буфер. Используя окно, оба буфера в обоих окнах складываются, потому что оба буфера одинаковы.

В общем, косвенный буфер - это совершенно другой буфер, в котором используется один и тот же текст и файл в исходном буфере, поэтому при сохранении клонированного буфера сохраняется и исходный файл.


3
Я согласен, что косвенные буферы имеют преимущества. Но ваш первый пункт не нуждается в буферах, чтобы быть косвенными. Вы можете просматривать и редактировать несколько местоположений одного и того же буфера, даже если один и тот же буфер просто открывается в двух окнах. Но да, независимое сужение, свертывание и т. Д., По моему мнению, являются сильными сторонами косвенного буфера.
Каушал Моди

5
Также отредактируйте один и тот же буфер в нескольких режимах (объедините косвенный буфер с сужением). Вы можете редактировать некоторые части буфера с режимами уценки, другую часть с режимами Python, другую часть с режимами json
freakhill

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

9

Один вариант использования - использование другого основного режима в одной части файла.

Например, когда-то я работал с XML-документами с кодом внутри определенных элементов. Я хотел иметь возможность редактировать весь документ так, как если бы он был в формате xml, но при этом все основные функции режима для языка программирования были встроены в определенные элементы, поэтому я сузил тело этих элементов в косвенном буфере, в котором выполнялся соответствующий основной режим.

Вот функция из моего конфига, которую я использую для этого:

(defun indirect-region (start end)
  "Edit the current region in another indirect buffer.
    Prompt for a major mode to activate."
  (interactive "r")
  (let ((buffer-name (generate-new-buffer-name "*indirect*"))
        (mode (intern
               (completing-read
                "Mode: "
                (mapcar (lambda (e)
                          (list (symbol-name e)))
                        (apropos-internal "-mode$" 'commandp))
                nil t))))
    (pop-to-buffer (make-indirect-buffer (current-buffer) buffer-name))
    (funcall mode)
    (narrow-to-region start end)
    (goto-char (point-min))
    (shrink-window-if-larger-than-buffer)))

Примечание: это не идеально, такие вещи, как font-lock, требуют особой дополнительной работы для использования в этом сценарии.


3

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

Как narrow-indirect.elсказано в комментарии к библиотеке :

Вы можете использовать косвенные буферы больше, чем вы думаете. Вы можете использовать клоны, взятые из частей буферов Dired, например, чтобы предоставить вам полезные (активные) представления в списке каталогов. Есть только несколько клавиш / команд (таких как gобновление списка), которые не работают, потому что они зависят от представления всего буфера Dired. Поэкспериментируйте, и вы, несомненно, найдете интересные новые применения для косвенных буферов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.