Che cos'è una finestra scratch?


10

A volte vedo una finestra aperta con il nome scratch.

So che è una specie di buffer / finestra temporanea.

Come posso crearne uno?

:h scratch non restituisce nulla.

Risposte:


11

Probabilmente è un buffer di memoria virtuale, che può essere nominato. Dall'aiuto:

graffiare

Contiene testo che può essere scartato in qualsiasi momento. Viene mantenuto alla chiusura della finestra, deve essere eliminato in modo esplicito. Impostazioni:>

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

Questo può essere trovato in :help special-buffers.


1
quale :hcomando ha usato per accedere a questa guida?
wizzup,

2
: h buffer, quindi leggi "Tipi speciali di buffer". Eri sulla strada giusta.
wbogacz,

Quando si apre un file utilizzando uno dei comandi Vim, viene automaticamente creato un buffer. Ad esempio, se si utilizza il :editfile per modificare un file, viene automaticamente creato un nuovo buffer. È possibile creare un buffer vuoto inserendo :enewo :newo :vnew. Dalle domande frequenti sul buffer Vim: vim.fandom.com/wiki/Vim_buffer_FAQ
NeilG

2
@wizzup :helpgrep scratchlo mostra come uno dei 10 risultati (nella mia installazione).
Ricco

2

Ricordo un suggerimento di vim (che è stato migrato su vim.wikia) sull'argomento.

L'ultima versione della funzione che utilizzo per creare buffer di memoria virtuale imposta anche:

  • 'buflisted' a falso
  • 'readonly'

(Dal mio plugin della libreria 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

Un buffer "scratch" è solo un termine informale per indicare un luogo in cui inserire contenuti temporanei arbitrari.

Dopo la risposta accettata e un'altra domanda, ho creato la seguente funzione nel mio vimrc.

La funzione crea un buffer vuoto nella finestra corrente e lo chiama 'scratch'. Il buffer di memoria virtuale non è protetto se si tenta di uscire. Verrà scartato senza richiedere conferma anche con modifiche non salvate se si esce da Vim o lo si cancella ( :bw).

Inserisci questa funzione nel tuo vimrc. Per creare un buffer di memoria virtuale utilizzare :call Scratch().

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

Puoi testarlo rapidamente strattonando le linee e poi :@". Puoi quindi provare :call Scratch().

Viene utilizzata una divisione in modo che il buffer corrente non venga influenzato quando si crea il buffer scratch.

(Se si preferisce omettere il splitdalla funzione, il buffer corrente sarebbe "nascosto" (non più in una finestra) quando si crea il buffer scratch. Vim si fermerà comunque e ti chiederà se si tenta di uscire con modifiche non salvate in quel buffer).

Il buffer scratch normalmente avrebbe la stessa directory di lavoro del buffer in cui ci si trova quando si chiama la funzione Scratch. Ho incluso una riga commentata per modificare la directory di lavoro del buffer scratch in home. Questo è per quelli con linee di stato divertenti che possono visualizzare il percorso della directory corrente come percorso del buffer. O solo per chi lo preferisce.

È possibile impostare il buffer di memoria virtuale come "elencato" o "non elencato" (elencato per impostazione predefinita). Se lo rendi non in :bufferselenco non lo vedrai nel tuo elenco, ma sarà presente :buffers!. Rimuovi il commento dalla nobuflistedlinea se preferisci che non sia presente nell'elenco. Elencato o non elencato, puoi sempre passare al tuo buffer di memoria virtuale in :b scratchogni caso. Rendere il buffer di memoria elencato lo rende leggermente più accessibile. Ad esempio :sballlo includerà in una divisione.

Se si utilizza :bw(buffer wipe) sul buffer scratch, Vim eliminerà il contenuto e rimuoverà il buffer senza preavviso. Se si utilizza :bd(eliminazione buffer) sul buffer scratch, Vim eliminerà il contenuto senza preavviso e renderà il buffer non elencato.

È possibile creare più buffer di memoria virtuale. Vim inizia a lamentarsi ma si finisce con altri.


2
Non è necessario l'esecuzione. La tua funzione può semplicemente eseguire enew ecc.
D. Ben Knoble

1
Se si imposta buftype=hide prima di impostare il nome, non è necessario modificare la directory, poiché il nome del buffer non verrà "gestito come un nome di file". Inoltre, potrebbe essere utile menzionare 'nobuflisted', il che impedisce al buffer di apparire nell'output di :ls. Ti sei in qualche modo alluso, ma non l'hai menzionato esplicitamente.
Ricco

Grazie per il tuo commento, @ D.BenKnoble. Ho ripulito la funzione su tuo consiglio.
NeilG

1
buftype=hideè davvero una sciocchezza, e sì, stavo davvero parlando di buftype=nofile:). Ma non riesco a riprodurre il comportamento che descrivi e credo ancora che l'affermazione Vim buffer names are always filenamessia errata. Se rimuovo la cdlinea dalla tua funzione e la eseguo, non c'è alcun percorso nella mia statusline o nell'output di echo bufname('%')Mi chiedo se forse questo è un problema con la tua statusline piuttosto che il nome del buffer. Qual è la tua 'statusline'opzione impostata?
Ricco

1
Aha! Sono contento che l'abbiamo capito! Se fossi in me, preferirei comunque non cambiare directory nella funzione Scratch, quindi invece cambierei statuslineper usare qualcosa di simile expand(&buftype == 'nofile' ? '%' : '%:p:~:h'), ma penso che ora siamo nel regno delle preferenze personali. Se decidi di continuare con la soluzione di modifica delle directory, potrebbe essere meglio utilizzare :lcdper limitare le modifiche alla finestra in questione, ma ancora una volta dipende da te. Comunque, penso che questa sia un'ottima risposta. +1!
Ricco
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.