¿Qué es una ventana de cero?

10

A veces veo una ventana abierta con nombre scratch.

Sé que es algún tipo de búfer / ventana temporal.

¿Cómo puedo crear una?

:h scratch no devuelve nada

wizzup
fuente

Respuestas:

11

Probablemente sea un búfer de memoria virtual, que se puede nombrar. De la ayuda:

rasguño

Contiene texto que se puede descartar en cualquier momento. Se mantiene al cerrar la ventana, debe eliminarse explícitamente. Configuraciones:>

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

Esto se puede encontrar en :help special-buffers.

wbogacz
fuente
1
el cual :hcomando utilizado para acceder a esta ayuda?
wizzup
2
: h buffer, luego lea a través de "Tipos especiales de buffers". Estabas en el camino correcto.
wbogacz
Cuando abre un archivo con cualquiera de los comandos de Vim, se crea automáticamente un búfer. Por ejemplo, si usa un :editarchivo para editar un archivo, se crea automáticamente un nuevo búfer. Se puede crear un búfer vacío ingresando :enewo :newo :vnew. Desde Vim buffer FAQ: vim.fandom.com/wiki/Vim_buffer_FAQ
NeilG
2
@wizzup :helpgrep scratchaparece como uno de los 10 resultados (en mi instalación).
Rico
2

Recuerdo una sugerencia de vim (que se ha migrado a vim.wikia) sobre el tema.

La última versión de la función que uso para crear buffers de memoria virtual también establece:

  • 'buflisted' a falso
  • 'readonly'

(Desde mi complemento de 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
fuente
2

Un búfer 'scratch' es solo un término informal para un lugar para escribir contenido temporal arbitrario.

Después de la respuesta aceptada y otra pregunta, creé la siguiente función en mi vimrc.

La función crea un búfer en blanco en la ventana actual y lo nombra 'scratch'. El búfer de memoria virtual no está protegido si intenta salir. Se descartará sin preguntar incluso con cambios no guardados si sale de Vim o lo borra ( :bw).

Pon esta función en tu vimrc. Para crear un tampón de scratch use :call Scratch().

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

Puede probar esto rápidamente tirando de las líneas y luego :@". Entonces puedes intentarlo :call Scratch().

Se utiliza una división para que su búfer actual no se vea afectado cuando crea el búfer de memoria virtual.

(Si prefiere omitir el splitde la función, entonces su búfer actual estaría "oculto" (ya no en una ventana) cuando cree el búfer de memoria virtual. Vim aún se detendrá y le preguntará si intenta salir con cambios no guardados en ese buffer).

El búfer scratch normalmente tendría el mismo directorio de trabajo del búfer en el que se encuentra cuando llama a la función Scratch. He incluido una línea comentada para cambiar el directorio de trabajo del búfer de memoria virtual a inicio. Esto es para aquellos con líneas de estado divertidas que pueden mostrar la ruta del directorio actual como la ruta del búfer. O solo para aquellos que lo prefieren.

Puede configurar el búfer de memoria virtual como "listado" o "no listado" (listado de forma predeterminada). Si no lo :buffersincluye en la lista, no lo verá en su lista, pero sí lo estará :buffers!. Descomente la nobuflistedlínea si prefiere que no aparezca en la lista. En la lista o en la lista, siempre puede cambiar a su búfer de memoria virtual de :b scratchtodos modos. Hacer que el búfer de scratch aparezca en la lista lo hace un poco más accesible. Por ejemplo, :sballlo incluirá en una división.

Si utiliza :bw(limpieza de búfer) en el búfer de memoria virtual, Vim eliminará el contenido y eliminará el búfer sin previo aviso. Si usa :bd(eliminar búfer) en el búfer de memoria virtual, Vim soltará el contenido sin previo aviso y dejará el búfer sin listar.

Usted puede crear varias memorias intermedias de rascar. Vim comienza a quejarse, pero aún así terminas con otros.

NeilG
fuente
2
La ejecución no es necesaria. Su función puede ejecutar enew, etc.
D. Ben Knoble
1
Si configura buftype=hide antes de configurar el nombre, no es necesario cambiar el directorio, porque el nombre del búfer no se "manejará como un nombre de archivo". Además, vale la pena mencionar 'nobuflisted', lo que evita que el búfer se muestre en la salida de :ls. Aludiste a eso, pero no lo mencionaste explícitamente.
Rico
Gracias por tu comentario, @ D.BenKnoble. He limpiado la función por su consejo.
NeilG
1
buftype=hidede hecho no tiene sentido, y sí, en realidad estaba hablando buftype=nofile:). Pero no puedo reproducir el comportamiento que describe, y todavía creo que la afirmación Vim buffer names are always filenameses incorrecta. Si elimino la cdlínea de su función y luego la ejecuto, no hay una ruta en mi línea de estado o en la salida de echo bufname('%')Me pregunto si tal vez sea un problema con su línea de estado en lugar del nombre del búfer. ¿Cuál es su 'statusline'opción establecida?
Rico
1
¡Ajá! ¡Me alegra que lo hayamos resuelto! Si fuera yo, aún preferiría no cambiar el directorio en la función Scratch, por lo que cambiaría statuslinepara usar algo como expand(&buftype == 'nofile' ? '%' : '%:p:~:h'), pero creo que ahora estamos en el ámbito de la preferencia personal. Si decide seguir con la solución de cambio de directorio, entonces podría ser mejor usar :lcdpara limitar los cambios a la ventana en cuestión, pero de nuevo eso depende de usted. De todos modos, creo que esta es una gran respuesta. +1!
Rico