Controlla se è aperta una finestra specifica

Sep 07 2020

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

3 filbranden Sep 07 2020 at 13:35

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.

2 LucHermitte Sep 07 2020 at 16:24

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