Что такое скретч-окно?

10

Иногда я вижу открытое окно с именем scratch.

Я знаю, что это какой-то временный буфер / окно.

Как я могу ящик один?

:h scratch ничего не возвращает

wizzup
источник

Ответы:

11

Вероятно, это пустой буфер, который можно назвать. Из справки:

царапина

Содержит текст, который можно удалить в любое время. Оно сохраняется при закрытии окна, оно должно быть удалено явно. Настройки:>

      :setlocal buftype=nofile
      :setlocal bufhidden=hide
      :setlocal noswapfile
  The buffer name can be used to identify the buffer, if you give it a meaningful name.

Это можно найти в :help special-buffers.

wbogacz
источник
1
какая :hкоманда использовалась для доступа к этой справке?
Wizzup
2
: h, затем прочитайте «Специальные виды буферов». Вы были на правильном пути.
wbogacz
Когда вы открываете файл с помощью любой из команд Vim, автоматически создается буфер. Например, если вы используете :editфайл для редактирования файла, автоматически создается новый буфер. Пустой буфер можно создать, введя :enewили :newили :vnew. Часто задаваемые вопросы из буфера Vim: vim.fandom.com/wiki/Vim_buffer_FAQ
NeilG
2
@wizzup показывает :helpgrep scratchодин из 10 (в моей установке) результатов.
Рич
2

Я помню подсказку vim (которая была перенесена в vim.wikia) на эту тему.

Последняя версия функции, которую я использую для создания чистых буферов, также устанавливает:

  • 'buflisted' ложно
  • 'readonly'

(Из моего плагина библиотеки VimL: lh-vim-lib)

function! lh#buffer#scratch(bname, where) abort
  try
    set modifiable
    " The next function takes care of working around this damn E36
    call lh#window#create_window_with(a:where.' sp '.escape(substitute(a:bname, '\*', '...', 'g'), '#%'))
  catch /.*/
    throw "Can't open a buffer named '".a:bname."'!"
  endtry
  setlocal bt=nofile bh=wipe nobl noswf ro
  return bufnr('%')
endfunction
Люк Эрмитт
источник
2

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

После принятого ответа и другого вопроса я создал следующую функцию в моем vimrc.

Функция создает пустой буфер в текущем окне и называет его «нуля». Чистый буфер не защищен, если вы попытаетесь выйти. Он будет удален без запроса даже с несохраненными изменениями, если вы выйдете из Vim или сотрете его ( :bw).

Поместите эту функцию в ваш vimrc. Для создания рабочего буфера используйте :call Scratch().

function! Scratch()
    split
    noswapfile hide enew
    setlocal buftype=nofile
    setlocal bufhidden=hide
    "setlocal nobuflisted
    "lcd ~
    file scratch
endfunction

Вы можете проверить это быстро, дергая строки, а затем :@". Вы можете попробовать :call Scratch().

Разделение используется, чтобы ваш текущий буфер не затрагивался при создании чистого буфера.

(Если вы предпочитаете опускать splitиз функции, тогда ваш текущий буфер будет «скрыт» (больше не в окне), когда вы создаете чистый буфер. Vim все равно остановится и предложит вам, если вы попытаетесь выйти с несохраненными изменениями в этом буфер).

Чистый буфер обычно имеет тот же рабочий каталог буфера, в котором вы находитесь, когда вызываете функцию Scratch. Я включил закомментированную строку, чтобы изменить рабочий каталог рабочего буфера на home. Это для тех, у кого смешные строки состояния, которые могут отображать путь к текущему каталогу в качестве пути к буферу. Или просто для тех, кто предпочитает это.

Вы можете установить рабочий буфер, чтобы он был «в списке» или «не в списке» (по умолчанию). Если вы сделаете это в :buffersсписке, вы не увидите его в своем списке, но он будет в :buffers!. Раскомментируйте nobuflistedстроку, если вы предпочитаете, чтобы она не была в списке. В :b scratchлюбом случае вы всегда можете перейти в свой рабочий буфер . Создание списка «чистых» буферов делает его немного более доступным. Например :sball, включит его в разделение.

Если вы используете :bw(очистка буфера) в чистом буфере, Vim удалит содержимое и удалит буфер без предупреждения. Если вы используете :bd(удаление буфера) в чистом буфере, Vim удалит содержимое без предупреждения и сделает буфер не включенным в список.

Вы можете создать несколько буферов нуля. Vim начинает жаловаться, но у вас все еще есть дополнительные.

NeilG
источник
2
Исполнять не нужно. Ваша функция может быть запущена заново и т.
Д.
1
Если вы установили buftype=hide перед установкой имени, то изменение каталога не требуется, потому что имя буфера не будет «обрабатываться как имя файла». Также стоит упомянуть 'nobuflisted', что предотвращает отображение буфера на выходе :ls. Вы как бы намекали на это, но не упоминали об этом явно.
Рич
Спасибо за ваш комментарий, @ D.BenKnoble. Я убрал функцию по твоему совету.
NeilG
1
buftype=hideэто действительно ерунда, и да, я на самом деле говорил о buftype=nofile:). Но я не могу воспроизвести поведение, которое вы описываете, и все же считаю, что утверждение Vim buffer names are always filenamesневерно. Если я удаляю cdстроку из вашей функции и затем запускаю ее, в моей строке состояния или в выходных данных нет пути, и echo bufname('%')я задаюсь вопросом: возможно, это проблема вашей строки состояния, а не имени буфера. Какая у вас 'statusline'опция?
Рич
1
Ага! Рад, что мы поняли это! Если бы это был я, я бы все же предпочел не менять каталог в функции Scratch, поэтому вместо этого я бы изменил statuslineна что-то подобное expand(&buftype == 'nofile' ? '%' : '%:p:~:h'), но теперь я думаю, что мы находимся в сфере личных предпочтений. Если вы решите придерживаться решения для каталога изменений, то может быть лучше использовать его, :lcdчтобы ограничить изменения рассматриваемым окном, но опять же, это ваше дело. Во всяком случае, я думаю, что это отличный ответ. +1!
Богатый