Що таке вікно подряпин?


11

Іноді я бачу відкрите вікно з назвою scratch.

Я знаю, що це якийсь тимчасовий буфер / вікно.

Як я можу зробити ящик?

:h scratch нічого не повертає.

Відповіді:


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.


1
яка :hкоманда використовується для доступу до цієї довідки?
wizzup

2
: буфер h, а потім зачитуйте "Спеціальні види буферів". Ви були на правильному шляху.
wbogacz

Коли ви відкриваєте файл за допомогою будь-якої з команд Vim, автоматично створюється буфер. Наприклад, якщо ви використовуєте :editфайл для редагування файлу, автоматично створюється новий буфер. Порожній буфер може бути створений шляхом введення :enewабо :newабо :vnew. З буфера Vim FAQ: 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. Я включив коментований рядок, щоб змінити робочий каталог буфера подряпин на домашній. Це для тих, хто має смішні рядки стану, які можуть відображати шлях поточного каталогу як шлях буфера. Або просто для тих, хто віддає перевагу.

Ви можете встановити буфер подряпин як "у списку" чи "в списку" (вказаний за замовчуванням). Якщо ви внесете його до списку, ви не побачите його у своєму :buffersсписку, але він буде в :buffers!. Відкоментуйте nobuflistedрядок, якщо ви хочете, щоб він не був у списку. У списку чи внесенні до списку, ви можете будь-коли перейти до буфера подряпин :b scratch. Якщо внесений до списку буфер нуля, це робить його трохи доступнішим. Наприклад :sball, включить його в розкол.

Якщо ви використовуєте :bw(wiper buffer) для буфера подряпин, Vim видалить вміст та видалить буфер без попередження. Якщо ви використовуєте :bd(видалення буфера) на буфері подряпин, Vim видалить вміст без попередження і внесе буфер до списку.

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


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!
Багатий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.