Qu'est-ce qu'une fenêtre scratch?


10

Parfois, je vois une fenêtre ouverte avec un nom scratch.

Je sais que c'est une sorte de tampon / fenêtre temporaire.

Comment puis-je en créer un?

:h scratch ne renvoie rien.

Réponses:


11

Il s'agit probablement d'un tampon de travail, qui peut être nommé. De l'aide:

rayure

Contient du texte qui peut être supprimé à tout moment. Il est conservé lors de la fermeture de la fenêtre, il doit être supprimé explicitement. Paramètres:>

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

Cela peut être trouvé dans :help special-buffers.


1
quelle :hcommande permet d'accéder à cette aide?
wizzup

2
: h buffer, puis lisez la liste des "Types spéciaux de tampons". Vous étiez sur la bonne voie.
wbogacz

Lorsque vous ouvrez un fichier à l'aide de l'une des commandes Vim, un tampon est automatiquement créé. Par exemple, si vous utilisez un :editfichier pour modifier un fichier, un nouveau tampon est automatiquement créé. Un tampon vide peut être créé en entrant :enewou :newou :vnew. À partir de la FAQ du tampon Vim: vim.fandom.com/wiki/Vim_buffer_FAQ
NeilG

2
@wizzup :helpgrep scratchapparaît comme l'un des 10 résultats (dans mon installation).
Rich

2

Je me souviens d'un conseil vim (qui a été migré vers vim.wikia) sur le sujet.

La dernière version de la fonction que j'utilise pour créer des tampons de travail définit également:

  • 'buflisted' à faux
  • 'readonly'

(De mon plugin de bibliothèque 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 tampon «à gratter» n'est qu'un terme informel pour désigner un endroit où taper du contenu temporaire arbitraire.

Suite à la réponse acceptée et à une autre question, j'ai créé la fonction suivante dans mon vimrc.

La fonction crée un tampon vide dans la fenêtre actuelle et le nomme «scratch». Le tampon de travail n'est pas protégé si vous essayez de quitter. Il sera supprimé sans invite même avec des modifications non enregistrées si vous quittez Vim ou l'effacez ( :bw).

Mettez cette fonction dans votre vimrc. Pour créer un tampon de travail, utilisez :call Scratch().

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

Vous pouvez tester cela rapidement en tirant sur les lignes puis :@". Vous pouvez alors essayer :call Scratch().

Un fractionnement est utilisé afin que votre tampon actuel ne soit pas affecté lorsque vous créez le tampon de travail.

(Si vous préférez omettre la splitde la fonction, votre tampon actuel sera "caché" (plus dans une fenêtre) lorsque vous créerez le tampon de travail. Vim s'arrêtera toujours et vous demandera si vous essayez de quitter avec des modifications non enregistrées dans ce tampon).

Le tampon de travail aurait normalement le même répertoire de travail que celui dans lequel vous vous trouvez lorsque vous appelez la fonction Scratch. J'ai inclus une ligne commentée pour changer le répertoire de travail du tampon de travail en home. C'est pour ceux qui ont des lignes d'état amusantes qui peuvent afficher le chemin du répertoire courant comme chemin du tampon. Ou tout simplement pour ceux qui le préfèrent.

Vous pouvez définir le tampon de travail pour qu'il soit "répertorié" ou "non répertorié" (répertorié par défaut). Si vous le rendez non répertorié, vous ne le verrez pas dans votre :buffersliste, mais il le sera :buffers!. Décommentez la nobuflistedligne si vous préférez qu'elle ne soit pas répertoriée. Répertorié ou non, vous pouvez toujours modifier votre tampon de travail avec :b scratch. Rendre le tampon de travail répertorié le rend légèrement plus accessible. Par exemple :sball, l'inclura dans une division.

Si vous utilisez :bw(effacement du tampon) sur le tampon de travail, Vim supprimera le contenu et supprimera le tampon sans avertissement. Si vous utilisez :bd(suppression du tampon) sur le tampon de travail, Vim supprimera le contenu sans avertissement et rendra le tampon non répertorié.

Vous pouvez créer plusieurs tampons de travail. Vim commence à se plaindre mais vous vous retrouvez toujours avec d'autres.


2
L'exécution n'est pas nécessaire. Votre fonction peut simplement s'exécuter de nouveau, etc.
D. Ben Knoble

1
Si vous définissez buftype=hide avant de définir le nom, il n'est pas nécessaire de modifier le répertoire, car le nom du tampon ne sera pas "traité comme un nom de fichier". Il convient également de mentionner 'nobuflisted', ce qui empêche le tampon de s'afficher dans la sortie de :ls. Vous y avez fait allusion, mais vous ne l'avez pas mentionné explicitement.
Rich

Merci pour votre commentaire, @ D.BenKnoble. J'ai nettoyé la fonction sur votre conseil.
NeilG

1
buftype=hideest en effet un non-sens, et oui, je parlais en fait buftype=nofile:). Mais je ne peux pas reproduire le comportement que vous décrivez, et je pense toujours que la déclaration Vim buffer names are always filenamesest incorrecte. Si je supprime la cdligne de votre fonction et l'exécute, il n'y a pas de chemin dans ma ligne d'état ou dans la sortie de echo bufname('%')Je me demande si c'est peut-être un problème avec votre ligne d'état plutôt que le nom du tampon. Quelle est votre 'statusline'option?
Rich

1
Ah! Heureux de l'avoir compris! Si c'était moi, je préférerais toujours ne pas changer de répertoire dans la fonction Scratch, donc je changerais plutôt statuslined'utiliser quelque chose comme expand(&buftype == 'nofile' ? '%' : '%:p:~:h'), mais je pense que nous sommes maintenant dans le domaine des préférences personnelles. Si vous décidez de vous en tenir à la solution de changement de répertoire, il peut être préférable d'utiliser :lcdpour limiter les modifications à la fenêtre en question, mais encore une fois, cela dépend de vous. Quoi qu'il en soit, je pense que c'est une excellente réponse. +1!
Rich
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.