O que é uma janela arranhada?

10

Às vezes, vejo uma janela aberta com o nome scratch.

Eu sei que é algum tipo de buffer / janela temporário.

Como posso criar um?

:h scratch não retorna nada.

wizzup
fonte

Respostas:

11

Provavelmente é um buffer temporário, que pode ser nomeado. Da ajuda:

coçar, arranhão

Contém texto que pode ser descartado a qualquer momento. É mantido ao fechar a janela, deve ser excluído explicitamente. Configurações:>

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

Isso pode ser encontrado em :help special-buffers.

wbogacz
fonte
11
qual :hcomando usado para acessar esta ajuda?
Wizzup
2
: h buffer e depois leia "Tipos especiais de buffers". Você estava no caminho certo.
Wbogacz
Quando você abre um arquivo usando qualquer um dos comandos do Vim, um buffer é criado automaticamente. Por exemplo, se você usar o :editarquivo para editar um arquivo, um novo buffer será criado automaticamente. Um buffer vazio pode ser criado digitando :enewou :newou :vnew. Do FAQ do buffer do Vim: vim.fandom.com/wiki/Vim_buffer_FAQ
NeilG
2
O @wizzup :helpgrep scratcho exibe como um dos 10 (na minha instalação) resultados.
Rich
2

Lembro-me de uma dica do vim (que foi migrada para o vim.wikia) sobre o assunto.

A versão mais recente da função que eu uso para criar buffers de rascunho também define:

  • 'buflisted' para falso
  • 'readonly'

(No meu plugin da biblioteca 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
fonte
2

Um buffer temporário é apenas um termo informal para um local digitar conteúdo temporário arbitrário.

Após a resposta aceita e outra pergunta, criei a seguinte função no meu vimrc.

A função cria um buffer em branco na janela atual e o denomina 'zero'. O buffer temporário não está protegido se você tentar sair. Ele será descartado sem avisar, mesmo com alterações não salvas, se você sair do Vim ou limpá-lo ( :bw).

Coloque esta função no seu vimrc. Para criar um buffer temporário, use :call Scratch().

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

Você pode testar isso rapidamente, puxando as linhas e depois :@". Você pode tentar :call Scratch().

Uma divisão é usada para que seu buffer atual não seja afetado quando você cria o buffer temporário.

(Se você preferir omitir a splitfunção from, seu buffer atual ficará "oculto" (não está mais em uma janela) ao criar o buffer de rascunho. O Vim ainda será interrompido e perguntará se você tentar sair com alterações não salvas nesse amortecedor).

O buffer temporário normalmente teria o mesmo diretório de trabalho do buffer em que você se encontra quando chama a função Scratch. Incluí uma linha comentada para alterar o diretório de trabalho do buffer temporário para home. É para aqueles com linhas de status engraçadas que podem exibir o caminho do diretório atual como o caminho do buffer. Ou apenas para quem prefere.

Você pode definir o buffer temporário como "listado" ou "não listado" (listado por padrão). Se você torná-lo não listado você não vai vê-lo em sua :bufferslista, mas será em :buffers!. Descomente a nobuflistedlinha se preferir que não esteja na lista. Listado ou não, você sempre pode alterar para seu buffer temporário de :b scratchqualquer maneira. Tornar o buffer temporário listado o torna um pouco mais acessível. Por exemplo :sball, incluirá em uma divisão.

Se você usar :bw(limpeza do buffer) no buffer temporário, o Vim excluirá o conteúdo e removerá o buffer sem aviso. Se você usar :bd(exclusão do buffer) no buffer temporário, o Vim eliminará o conteúdo sem aviso e tornará o buffer não listado.

Você pode criar vários buffers de rascunho. O Vim começa a reclamar, mas você ainda acaba com outros.

NeilG
fonte
2
A execução não é necessária. Sua função pode apenas executar enew etc.
D. Ben Knoble
11
Se você definir buftype=hide antes de definir o nome, não será necessário alterar o diretório, porque o nome do buffer não será "tratado como um nome de arquivo". Além disso, vale a pena mencionar 'nobuflisted', o que impede que o buffer apareça na saída de :ls. Você meio que aludiu, mas não o mencionou explicitamente.
Rich
Obrigado pelo seu comentário, @ D.BenKnoble. Limpei a função seguindo seu conselho.
21419 NeilG
11
buftype=hideé realmente um disparate, e sim, eu estava realmente falando sobre buftype=nofile:). Mas não consigo reproduzir o comportamento que você descreve e ainda acredito que a afirmação Vim buffer names are always filenamesestá incorreta. Se eu remover a cdlinha da sua função e executá-la, não há caminho na minha linha de status ou na saída de echo bufname('%')Gostaria de saber se talvez esse seja um problema com sua linha de status e não com o nome do buffer. Qual é a sua 'statusline'opção definida?
Rich
11
Aha! Fico feliz que conseguimos descobrir! Se fosse eu, eu ainda preferiria não alterar o diretório na função Scratch; portanto, mudaria statuslinepara usar algo como expand(&buftype == 'nofile' ? '%' : '%:p:~:h'), mas acho que agora estamos no reino da preferência pessoal. Se você optar por seguir a solução de diretório de alterações, talvez seja melhor usar :lcdpara limitar as alterações na janela em questão, mas novamente isso depende de você. De qualquer forma, acho que essa é uma ótima resposta. +1!
Rich