Controlla se è aperta una finestra specifica
Ho una finestra in vim aperta (file corrente) e un'altra in split chiamata [Scratch]. Voglio controllare se [Scratch]è aperto o meno.
Ogni esempio è apprezzato.
Risposte
Il problema con [Scratch]se stesso è che non è proprio il nome di un buffer, ma solo Vim che ti dice che questo buffer di scratch è in realtà senza nome ...
È molto più semplice se inizi con un buffer denominato e lo usi bufadd()per crearlo. Per esempio:
let bufnr = bufadd('MyFancyScratchBuffer')
execute 'sb' bufnr
setlocal buftype=nofile bufhidden=hide noswapfile
" Use `setlocal buflisted` if you want it
" to show up in `:ls` too.
Quindi a questo punto puoi cercarlo per nome, con:
let winid = bufwinid('MyFancyScratchBuffer')
E qui puoi guardare winid. Se è -1, significa che il buffer non è caricato in una finestra (nella scheda corrente!) Quindi puoi creare una nuova divisione per esso:
sb MyFancyScratchBuffer
Altrimenti, puoi semplicemente andare alla finestra già aperta con quel buffer:
call win_gotoid(winid)
Un'alternativa all'uso bufadd()e all'assegnazione di un nome al buffer è salvarne il numero non appena viene creato. Per esempio:
if !get(g:, 'my_scratch_bufnr')
" Create new scratch buffer and store
" its buffer number in a global variable.
new
setlocal buftype=nofile bufhidden=hide noswapfile
let g:my_scratch_bufnr = bufnr()
else
" Find if it's loaded in a window in current tab.
let winid = bufwinid(g:my_scratch_bufnr)
if winid < 0
" It's not, so open it into a split.
execute 'sb' g:my_scratch_bufnr
else
" Already open, so go to that window.
call win_gotoid(winid)
endif
endif
Se stai scrivendo il tuo codice in un file plug-in, puoi utilizzare le s:variabili per variabili locali di script piuttosto che g:per quelle globali, in questo modo non devi preoccuparti di conflitti di nome con altri plug-in.
Ci sono un paio di plugin che hanno iniziato ad usare {name}://{whatever}per i buffer nome scratch (ad esempio tags://patternsearched, tasks://...,). Questo è un po 'utile quando altri plugin provano a fare cose sui buffer ma desiderano ignorare lo scratch buffer. Un tipico esempio è un plugin local-vimrc che applica le impostazioni di configurazione del progetto su ogni buffer in una determinata directory.
Ora possiamo anche filtrare &buftype==nofileper trovare i buffer di zero come di solito contrassegnati come tali. Aiuterà a trovare i buffer di memoria virtuale, ma non è necessario indicare il singolo buffer di memoria virtuale che stai cercando.
" will display the list of buffer numbers with a "nofile" buftype
:echo filter(range(1, bufnr('$')), 'getbufvar(v:val, "&buftype") == "nofile"')
Applicando bufwinnr()sui risultati, vedrai se vengono visualizzati (> = 0) in una finestra o meno (-1).