Каковы преимущества использования косвенных буферов ? При каких обстоятельствах они полезны?
Каковы преимущества использования косвенных буферов ? При каких обстоятельствах они полезны?
Ответы:
Чтобы увидеть и редактировать несколько мест в одном буфере. Таким образом, вам не нужно прокручивать длинный буфер, а просто переключать окно в видимую область. Каждый клонированный буфер также имеет различные метки кольца, сужения и другие свойства буфера. Если вы не используете косвенный буфер, а создаете другое окно с тем же буфером, то все совместно используется, и вы не можете выполнять другие дополнительные функции, кроме просмотра и редактирования разных мест. Например, с помощью косвенного буфера вы можете сложить весь блок кода, эффективно создав «дерево тегов», не затрагивая исходный буфер. Используя окно, оба буфера в обоих окнах складываются, потому что оба буфера одинаковы.
В общем, косвенный буфер - это совершенно другой буфер, в котором используется один и тот же текст и файл в исходном буфере, поэтому при сохранении клонированного буфера сохраняется и исходный файл.
Один вариант использования - использование другого основного режима в одной части файла.
Например, когда-то я работал с 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, требуют особой дополнительной работы для использования в этом сценарии.
Косвенные буферы дают вам несколько просмотров одного и того же буфера, в частности, несколько сужений, каждое из которых во многих отношениях действует как отдельный буфер.
Как narrow-indirect.el
сказано в комментарии к библиотеке :
Вы можете использовать косвенные буферы больше, чем вы думаете. Вы можете использовать клоны, взятые из частей буферов Dired, например, чтобы предоставить вам полезные (активные) представления в списке каталогов. Есть только несколько клавиш / команд (таких как
g
обновление списка), которые не работают, потому что они зависят от представления всего буфера Dired. Поэкспериментируйте, и вы, несомненно, найдете интересные новые применения для косвенных буферов.