2014-09-11 19 views
7

My Emacs è su sistema OS X. C'è un modo per rendere un nuovo frame predefinito su un buffer vuoto ogni volta che uso ⌘N (proprio come funziona TextEdit)? Preferisco scrivere i contenuti prima e decidere un nome file appropriato più tardi. Tuttavia, Emacs vuole che decida prima il nome del file e scrivo i contenuti in seguito. Non vedo alcun vantaggio per questo. Qualcuno sa perché Emacs funziona in questo modo?Emacs: come posso creare un nuovo buffer "vuoto" ogni volta che creo un nuovo frame?

In sostanza, se utilizzo C-x 5 2, Emacs visualizza sempre un frame con qualsiasi file al momento sto lavorando. Questo è scomodo. Inoltre, non desidero che Emacs visualizzi automaticamente un nuovo frame su *scratch* (molti risultati di ricerca di Google suggeriscono in qualche modo questo approccio). Preferisco che un buffer venga temporaneamente chiamato "Senza titolo" nel nuovo frame, e se uso di nuovo ⌘N, Emacs apre un altro buffer "Untitled 2" temporaneo, e così via. In questo modo, posso decidere in seguito i nomi dei file del buffer.

+0

Quindi, basta sostituire * * scratch * 'con' * Untitled' nelle soluzioni trovate. – choroba

+0

Voglio avere più nuovi buffer "senza titolo". Finora, tutti i nuovi fotogrammi puntano allo stesso buffer "Senza titolo". –

+0

I buffer non dovrebbero avere nomi univoci? '* untitled-01 *' '* untitled-02 *' * * untitled-03 * 'Se i nomi non sono univoci, temo che in sostanza osserverai lo stesso buffer in ogni frame che mostra il nome del buffer. – lawlist

risposta

12

È possibile creare nuovi buffer con switch-to-buffer. Immettere C-x b, immettere un nome di buffer e premere RET. Se non esiste un buffer con quel nome, Emacs crea automaticamente uno nuovo in Modalità fondamentale. È possibile passare a qualsiasi altra modalità come al solito con M-x, ad es. M-x python-mode. Per modificare il buffer predefinito, impostare il valore predefinito di major-mode nel buffer desiderato.

Se desideri avere un nome del buffer scelto automaticamente, e creare un nuovo telaio, tuttavia, è necessario scrivere il proprio comando:

(defun lunaryorn-new-buffer-frame() 
    "Create a new frame with a new empty buffer." 
    (interactive) 
    (let ((buffer (generate-new-buffer "untitled"))) 
    (set-buffer-major-mode buffer) 
    (display-buffer buffer '(display-buffer-pop-up-frame . nil)))) 

Bind questo per C-c n:

(global-set-key (kbd "C-c n") #'lunaryorn-new-buffer-frame) 

Ora premendo C-c n viene creato un nuovo frame con un nuovo buffer vuoto denominato "senza titolo" dove x è un numero consecutivo.

+0

Nice - Non sapevo di generare-new-buffer, quindi ho provato a implementarlo da zero. – Tyler

+0

@lunaryorn, ho appena provato la tua funzione, funziona! C'è qualche ragione per cui lo si lega (kbd "C-c n") invece di (kbd "s-n")? Preferisco usare il CMD-n predefinito di sistema, è più intuitivo per me. L'hai vincolato in questo modo a causa di diversi potenziali conflitti di keybinding nei pacchetti MELPA/ELPA? –

+2

@BartSimpson 'Cc n' è" sicuro ", nel senso che non entrerà in conflitto con i collegamenti di Emacs stesso o di altre modalità, poiché' Cc 'sono riservati agli utenti, in base alle [Convenzioni di rilegatura chiave] (http: //www.gnu.org/software/emacs/manual/html_node/elisp/Key-Binding-Conventions.html). Né Emacs né qualsiasi altra modalità ben educata li legheranno mai, quindi non c'è rischio di conflitto. Ovviamente puoi usare qualsiasi altra associazione che preferisci, purché tu sappia che potrebbe entrare in conflitto con Emacs o altre modalità. – lunaryorn

5

Questo potrebbe funzionare per voi, se ho capito la vostra richiesta:

(defun empty-frame() 
    (interactive) 
    (let ((fl (make-temp-file "Untitled"))) 
    (switch-to-buffer-other-frame fl))) 

Si aprirà un nuovo file temporaneo per ogni nuovo buffer. Se si preferisce non creare effettivamente il file, è possibile utilizzare questo invece:

(defun empty-frame() 
    (interactive) 
    (let ((bn "Untitled-") 
     (num 1)) 
    (while 
     (get-buffer (concat bn (number-to-string num))) 
     (setq num (1+ num))) 
    (switch-to-buffer-other-frame 
    (concat bn (number-to-string num))))) 
+1

Non eseguire la mappatura e la ricerca sull'intera lista di buffer su ogni iterazione. Verificare invece l'esistenza di un buffer con il nome specifico, con 'get-buffer'. Ma in realtà, usa 'generate-new-buffer'. – lunaryorn

+0

Va meglio, grazie. Lascerò questo qui come alternativa (inferiore) alla tua risposta. – Tyler

4

Quanto segue creerà un buffer con un nome univoco. Il buffer non è associato a nessun file, quindi se/quando si è sempre C-x C-ssave-buffer, verrà richiesto di fornire un nome file.

(defun empty-frame() 
    "Open a new frame with a buffer named Untitled<N>. 

The buffer is not associated with a file." 
    (interactive) 
    (switch-to-buffer-other-frame (generate-new-buffer "Untitled"))) 
+0

Appena ho cliccato su Post Answer, ho visto che @lunaryorn aveva pubblicato qualcosa di simile, e con il tocco in più di impostare una modalità principale. Oh bene. –

4

Hai visto le risposte su come creare nuovi buffer "Senza titolo", ma per quanto riguarda il motivo per cui Emacs vuole di scegliere prima un nome, alcuni dei motivi sono:

  • storico: è proprio come ha funzionato, e una volta che ci si abitua, non è peggio dell'alternativa.
  • Le principali modalità e altri dettagli vengono generalmente scelti in base al nome del file. Quindi, invece di creare un buffer senza titolo e dover scegliere se metterlo in modalità LaTeX o C, basta aprire un file con estensione ".tex" o ".c".
  • Avere un nome file significa che Emacs può utilizzare la procedura standard di salvataggio automatico, mentre con l'approccio Senza titolo, le applicazioni devono avere un modo speciale per salvare automaticamente i documenti senza titolo in qualche luogo "standard".
Problemi correlati