Co to jest okno scratch?

10

Czasami widzę okno otwarte z nazwą scratch.

Wiem, że to jakiś tymczasowy bufor / okno.

Jak mogę stworzyć skrzynkę?

:h scratch nic nie zwraca.

wizzup
źródło

Odpowiedzi:

11

Prawdopodobnie jest to bufor scratch, który można nazwać. Z pomocy:

zadraśnięcie

Zawiera tekst, który można w dowolnym momencie usunąć. Zachowuje się go podczas zamykania okna, należy je jawnie usunąć. Ustawienia:>

      :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.

Można to znaleźć w :help special-buffers.

wbogacz
źródło
1
które :hpolecenie wykorzystało dostęp do tej pomocy?
wizzup,
2
: h bufor, a następnie przeczytaj „Specjalne rodzaje buforów”. Byłeś na dobrej drodze.
wbogacz
Po otwarciu pliku za pomocą dowolnego polecenia Vima automatycznie tworzony jest bufor. Na przykład, jeśli używasz :editpliku do edycji pliku, automatycznie tworzony jest nowy bufor. Pusta bufor może być utworzony przez wejściem :enewi :newlub :vnew. Z bufora Vima FAQ: vim.fandom.com/wiki/Vim_buffer_FAQ
NeilG
2
@wizzup wyświetla :helpgrep scratchgo jako jeden z 10 (w mojej instalacji) wyników.
Bogaty
2

Pamiętam wskazówkę vima (która została migrowana do vim.wikia) na ten temat.

Najnowsza wersja funkcji, której używam do tworzenia buforów scratch, ustawia również:

  • 'buflisted' do fałszu
  • 'readonly'

(Z mojej wtyczki biblioteki 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
Luc Hermitte
źródło
2

Bufor „scratch” to tylko nieformalne określenie miejsca, w którym można wpisać dowolną treść tymczasową.

Po zaakceptowaniu odpowiedzi i kolejnym pytaniu utworzyłem następującą funkcję w moim vimrc.

Funkcja tworzy pusty bufor w bieżącym oknie i nazywa go „scratch”. Bufor scratch nie jest chroniony, jeśli spróbujesz wyjść. Zostanie odrzucony bez monitowania nawet przy niezapisanych zmianach, jeśli zamkniesz Vima lub go wyczyścisz ( :bw).

Umieść tę funkcję w swoim vimrc. Aby utworzyć bufor scratch, użyj :call Scratch().

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

Możesz to szybko przetestować, szarpiąc linie, a następnie :@". Następnie możesz spróbować :call Scratch().

Podział jest używany, więc podczas tworzenia bufora scratch nie ma to wpływu na bieżący bufor.

(Jeśli wolisz pominąć tę splitfunkcję, wówczas twój bufor byłby „ukryty” (nie ma go już w oknie) podczas tworzenia bufora scratch. Vim nadal się zatrzymuje i pyta, czy spróbujesz wyjść z niezapisanymi zmianami w tym bufor).

Bufor scratch normalnie miałby ten sam katalog roboczy, co bufor, w którym wywoływana jest funkcja Scratch. Dodałem komentarz, aby zmienić katalog roboczy bufora scratch na home. Dotyczy to osób ze śmiesznymi wierszami stanu, które mogą wyświetlać ścieżkę bieżącego katalogu jako ścieżkę bufora. Lub tylko dla tych, którzy wolą.

Możesz ustawić bufor scratch na „wymieniony” lub „niepubliczny” (domyślnie wymieniony). Jeśli uczynisz go niepublicznym, nie zobaczysz go na :buffersliście, ale będzie :buffers!. Usuń komentarz z nobuflistedlinii, jeśli wolisz, aby nie była na liście. Zarówno na liście, jak i na liście, możesz zawsze zmienić bufor na scratch :b scratch. Podanie wymienionego bufora scratch czyni go nieco bardziej dostępnym. Na przykład :sballuwzględni to w podziale.

Jeśli użyjesz :bw(czyszczenie bufora) w buforze scratch, Vim usunie zawartość i usunie bufor bez ostrzeżenia. Jeśli użyjesz :bd(usuń bufor) w buforze scratch, Vim upuści zawartość bez ostrzeżenia i sprawi, że bufor nie będzie na liście.

Państwo może utworzyć wiele buforów zera. Vim zaczyna narzekać, ale wciąż masz dodatkowe.

NeilG
źródło
2
Wykonanie nie jest konieczne. Twoja funkcja może działać zupełnie inaczej itp.
D. Ben Knoble
1
Jeśli ustawisz buftype=hide przed ustawieniem nazwy, zmiana katalogu nie jest konieczna, ponieważ nazwa bufora nie będzie „obsługiwana jak nazwa pliku”. Warto również wspomnieć 'nobuflisted', co zapobiega wyświetlaniu bufora na wyjściu :ls. Nawiązałeś do niej trochę, ale nie wspomniałeś o tym wprost.
Bogaty
Dziękuję za komentarz, @ D.BenKnoble. Wyczyściłem tę funkcję za twoją radą.
NeilG,
1
buftype=hideto jest bzdura i tak, tak naprawdę to mówiłem buftype=nofile:). Ale nie mogę odtworzyć opisanego zachowania i nadal uważam, że stwierdzenie Vim buffer names are always filenamesjest nieprawidłowe. Jeśli cdusunę wiersz z twojej funkcji, a następnie uruchomię go, nie będzie ścieżki w mojej linii statusu lub w wynikach. echo bufname('%')Zastanawiam się, czy może to jest problem z twoją linią statusu, a nie nazwą bufora. Jaka jest twoja 'statusline'opcja?
Bogaty
1
Aha! Cieszę się, że udało nam się to rozgryźć! Gdybym to był ja, nadal wolałbym nie zmieniać katalogu w funkcji Scratch, więc zamiast tego chciałbym statuslineużyć czegoś takiego expand(&buftype == 'nofile' ? '%' : '%:p:~:h'), ale myślę, że teraz jesteśmy w sferze osobistych preferencji. Jeśli zdecydujesz się pozostać przy rozwiązaniu z katalogiem zmian, lepiej użyć :lcdograniczenia do danego okna, ale to zależy od ciebie. W każdym razie myślę, że to świetna odpowiedź. +1!
Bogaty