Was ist ein Arbeitsfenster?

10

Manchmal sehe ich ein Fenster mit Namen geöffnet scratch.

Ich weiß, dass es eine Art temporärer Puffer / Fenster ist.

Wie kann ich eine kisten?

:h scratch gibt nichts zurück.

wizzup
quelle

Antworten:

11

Es ist wahrscheinlich ein Arbeitspuffer, der benannt werden kann. Aus der Hilfe:

kratzen

Enthält Text, der jederzeit verworfen werden kann. Es bleibt beim Schließen des Fensters erhalten, es muss explizit gelöscht werden. Einstellungen:>

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

Dies kann in gefunden werden :help special-buffers.

wbogacz
quelle
1
Welcher :hBefehl verwendet, um auf diese Hilfe zuzugreifen?
Wizzup
2
: h Puffer, dann lesen Sie "Spezielle Arten von Puffern". Sie waren auf dem richtigen Weg.
wbogacz
Wenn Sie eine Datei mit einem der Vim-Befehle öffnen, wird automatisch ein Puffer erstellt. Wenn Sie beispielsweise eine :editDatei zum Bearbeiten einer Datei verwenden, wird automatisch ein neuer Puffer erstellt. Ein leerer Puffer kann durch Eingabe von :enewoder :newoder erstellt werden :vnew. Von Vim Buffer FAQ: vim.fandom.com/wiki/Vim_buffer_FAQ
NeilG
2
@wizzup zeigt :helpgrep scratches als eines von 10 (in meiner Installation) Ergebnissen an.
Rich
2

Ich erinnere mich an einen vim-Tipp (der auf vim.wikia migriert wurde) zu diesem Thema.

Die neueste Version der Funktion, die ich zum Erstellen von Arbeitspuffern verwende, setzt außerdem:

  • 'buflisted' zu falsch
  • 'readonly'

(Aus meinem VimL-Bibliotheks-Plugin: 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
quelle
2

Ein "Scratch" -Puffer ist nur ein informeller Begriff für einen Ort, an dem beliebige temporäre Inhalte eingegeben werden können.

Nach der akzeptierten Antwort und einer weiteren Frage habe ich die folgende Funktion in meinem vimrc erstellt.

Die Funktion erstellt im aktuellen Fenster einen leeren Puffer und nennt ihn "Scratch". Der Arbeitspuffer ist nicht geschützt, wenn Sie versuchen, ihn zu beenden. Es wird auch bei nicht gespeicherten Änderungen ohne Aufforderung verworfen, wenn Sie Vim beenden oder es löschen ( :bw).

Fügen Sie diese Funktion in Ihr vimrc ein. Verwenden Sie zum Erstellen eines Arbeitspuffers :call Scratch().

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

Sie können dies schnell testen, indem Sie an den Linien ziehen und dann :@". Sie können es dann versuchen :call Scratch().

Ein Split wird verwendet, damit Ihr aktueller Puffer beim Erstellen des Arbeitspuffers nicht beeinflusst wird.

(Wenn Sie splitdie Funktion lieber weglassen möchten, wird Ihr aktueller Puffer beim Erstellen des Arbeitspuffers "ausgeblendet" (nicht mehr in einem Fenster). Vim stoppt weiterhin und fordert Sie auf, wenn Sie versuchen, mit nicht gespeicherten Änderungen daran zu beenden Puffer).

Der Arbeitspuffer hat normalerweise das gleiche Arbeitsverzeichnis wie der Puffer, in dem Sie sich befinden, wenn Sie die Kratzfunktion aufrufen. Ich habe eine auskommentierte Zeile eingefügt, um das Arbeitsverzeichnis des Arbeitspuffers in "Home" zu ändern. Dies ist für diejenigen mit lustigen Statuszeilen, die möglicherweise den Pfad des aktuellen Verzeichnisses als Pufferpfad anzeigen. Oder nur für diejenigen, die es bevorzugen.

Sie können den Arbeitspuffer so einstellen, dass er "aufgelistet" oder "nicht gelistet" ist (standardmäßig aufgelistet). Wenn Sie es nicht gelistet machen, wird es nicht in Ihrer :buffersListe angezeigt , aber es wird angezeigt :buffers!. Kommentieren Sie die nobuflistedZeile aus, wenn Sie möchten, dass sie nicht aufgeführt wird. Gelistet oder nicht gelistet, können Sie :b scratchtrotzdem jederzeit zu Ihrem Arbeitspuffer wechseln . Wenn Sie den Scratch-Puffer auflisten, ist er etwas leichter zugänglich. Zum Beispiel :sballwird es in einem Split enthalten.

Wenn Sie :bw(Pufferlöschung) für den Arbeitspuffer verwenden, löscht Vim den Inhalt und entfernt den Puffer ohne Vorwarnung. Wenn Sie :bd(Puffer löschen) für den Arbeitspuffer verwenden, löscht Vim den Inhalt ohne Warnung und macht den Puffer nicht aufgelistet.

Sie können mehrere Arbeitspuffer erstellen. Vim fängt an sich zu beschweren, aber Sie haben immer noch zusätzliche.

NeilG
quelle
2
Die Ausführung ist nicht notwendig. Ihre Funktion kann einfach neu ausgeführt werden usw.
D. Ben Knoble
1
Wenn Sie buftype=hide vor dem Festlegen des Namens festlegen , ist das Ändern des Verzeichnisses nicht erforderlich, da der Puffername nicht "wie ein Dateiname behandelt" wird. Erwähnenswert ist auch 'nobuflisted', dass der Puffer nicht in der Ausgabe von angezeigt wird :ls. Sie haben irgendwie darauf angespielt, es aber nicht explizit erwähnt.
Rich
Vielen Dank für Ihren Kommentar, @ D.BenKnoble. Ich habe die Funktion auf Ihren Rat hin bereinigt.
NeilG
1
buftype=hideist in der Tat Unsinn, und ja, ich habe tatsächlich darüber gesprochen buftype=nofile:). Aber ich kann das von Ihnen beschriebene Verhalten nicht reproduzieren und glaube immer noch, dass die Aussage Vim buffer names are always filenamesfalsch ist. Wenn ich die cdZeile aus Ihrer Funktion entferne und sie dann ausführe, gibt es keinen Pfad in meiner Statuszeile oder in der Ausgabe von echo bufname('%')Ich frage mich, ob dies möglicherweise eher ein Problem mit Ihrer Statuszeile als mit dem Puffernamen ist. Was ist Ihre 'statusline'Option eingestellt?
Rich
1
Aha! Ich bin froh, dass wir es herausgefunden haben! Wenn ich es wäre, würde ich es immer noch vorziehen, das Verzeichnis in der Scratch-Funktion nicht zu ändern, also würde ich stattdessen so statuslineetwas wie verwenden expand(&buftype == 'nofile' ? '%' : '%:p:~:h'), aber ich denke, jetzt befinden wir uns in den Bereichen persönlicher Vorlieben. Wenn Sie sich für die Lösung des Änderungsverzeichnisses entscheiden, ist es möglicherweise besser, :lcddie Änderungen auf das betreffende Fenster zu beschränken, aber auch dies liegt ganz bei Ihnen. Jedenfalls denke ich, dass dies eine großartige Antwort ist. +1!
Rich