2012-06-13 10 views
7

Ich bin neu bei StackOverflow und ich habe eine Frage zu einem Thema, das mich bei meiner Aufgabe, Emacs zu meistern, geradezu ärgerte.Emacs: Holen Sie sich New-Frame und Emacsclient -c, um die Frame-Größe zu verwenden?

ich meine .emacs Datei die Standardrahmengröße für Emacs zu 70 Zeilen und 80 Spalten wie so einzustellen konfiguriert:

(add-to-list 'default-frame-alist '(left . 0)) 
(add-to-list 'default-frame-alist '(top . 0)) 
(add-to-list 'default-frame-alist '(height . 70)) 
(add-to-list 'default-frame-alist '(width . 80)) 

Dies funktioniert gut, wenn Emacs starten, ist das Problem, dass, wenn ich starten einen neuen Rahmen Mit new-frame oder emacsclient -c werden diese Einstellungen nicht berücksichtigt. Gibt es eine Möglichkeit, emacsclient und new-frame zu zwingen, die Einstellungen in der .emacs Datei zu lesen, wenn sie ausgeführt werden?

Edit:

Hier ist meine .emacs Datei:

;;This setting is meant to force emacs to read size settings before make-frame. 

(add-hook 'before-make-frame-hook 
     #'(lambda() 
      (add-to-list 'default-frame-alist '(left . 0)) 
      (add-to-list 'default-frame-alist '(top . 0)) 
      (add-to-list 'default-frame-alist '(height . 70)) 
      (add-to-list 'default-frame-alist '(width . 80)))) 

;;disable annoying welcome screen. 
(setq inhibit-splash-screen t) 
(setq inferior-lisp-program "/usr/bin/abcl") 
(add-to-list 'load-path "/usr/share/emacs/site-lisp/slime/") 
(require 'slime) 
(slime-setup) 

(add-to-list 'auto-mode-alist '("\\.lisp$" . lisp-mode)) 
(add-to-list 'auto-mode-alist '("\\.cl$" . lisp-mode)) 
(add-to-list 'auto-mode-alist '("\\.asd$" . lisp-mode)) 
(require 'slime) 
(slime-setup) 
(eval-after-load "slime" 
'(progn 
    (setq slime-complete-symbol*-fancy t 
     slime-complete-symbol-function 'slime-fuzzy-complete-symbol 
     slime-when-complete-filename-expand t 
     slime-truncate-lines nil 
     slime-autodoc-use-multiline-p t) 
(slime-setup '(slime-fancy slime-asdf)) 
(define-key slime-repl-mode-map (kbd "C-c ;") 
    'slime-insert-balanced-comments) 
(define-key slime-repl-mode-map (kbd "C-c M-;") 
    'slime-remove-balanced-comments) 
(define-key slime-mode-map (kbd "C-c ;") 
    'slime-insert-balanced-comments) 
(define-key slime-mode-map (kbd "C-c M-;") 
    'slime-remove-balanced-comments) 
(define-key slime-mode-map (kbd "RET") 'newline-and-indent) 
(define-key slime-mode-map (kbd "C-j") 'newline))) 

(add-to-list 'default-frame-alist '(left . 0)) 
(add-to-list 'default-frame-alist '(top . 0)) 
(add-to-list 'default-frame-alist '(height . 70)) 
(add-to-list 'default-frame-alist '(width . 80)) 

(normal-erase-is-backspace-mode 0) 
(tool-bar-mode -1) ;;method for disabling changed in 24. can not nil, most negative 
(scroll-bar-mode -1) 

;;for loading cedet. 
(load-file "/usr/share/emacs/site-lisp/cedet/common/cedet.el") 
+0

Laut Emacs 'Dokumentation ist' new-frame 'veraltet. Wenn ich 'make-frame' verwende, werden die Einstellungen respektiert. 'emacsclient -c' funktioniert auch gut für mich. – Thomas

Antwort

5

Sie könnten versuchen, die folgenden Haken zu Ihrem Emacs Start-up-Datei (normalerweise ~/.emacs) Zugeben, das heißt:

(add-hook 'before-make-frame-hook 
      #'(lambda() 
       (add-to-list 'default-frame-alist '(left . 0)) 
       (add-to-list 'default-frame-alist '(top . 0)) 
       (add-to-list 'default-frame-alist '(height . 70)) 
       (add-to-list 'default-frame-alist '(width . 80)))) 

Oder, wenn Sie die gesamte .emacs Datei laden möchten:

(add-hook 'before-make-frame-hook #'(lambda() (load-file "~/.emacs"))) 

Der ehemalige Haken ist vorzuziehen, mit ziemlicher Sicherheit, da die gesamten .emacs Datei neu zu laden ist wahrscheinlich nicht nur unnötig und eine Verschwendung von Ressourcen, sondern hat auch die möglichen Fehler oder seltsames Verhalten verursacht (abhängig von der Inhalt der Datei).

Um es genauer auszudrücken, sind Hooks Variablen, die Listen von Befehlen definieren, die ausgeführt werden, wenn bestimmte Ereignisse innerhalb Ihrer Emacs-Sitzung auftreten, z. B. das Laden eines Hauptbearbeitungsmodus oder wie in diesem Fall die Erstellung eines neuen Rahmens . Weitere Informationen finden Sie unter Emacs manual page on hooks. Allgemein gesagt, wenn Sie möchten, dass eine Funktion jedes Mal ausgeführt wird, wenn ein bestimmtes Ereignis in Emacs auftritt, ist das Hinzufügen der Funktion zum richtigen bereits vorhandenen Hook wahrscheinlich der beste Weg, um darüber zu handeln.

+0

Danke für die Hilfe, aber aus welchem ​​Grund auch immer, Ihre erste Lösung funktioniert nicht. 'make-frame' respektiert meine Einstellungen überhaupt nicht, und 'new-frame' scheint nur die Breiteneinstellungen zu berücksichtigen. –

+0

@ user126553, verzeihen Sie mir, wenn Ihnen das zu offensichtlich erscheint, aber Sie haben diesen ersten Befehl zu Ihrer '.emacs' hinzugefügt und tatsächlich Emacs geladen, bevor Sie versuchen,' emacsclient -c' auszuführen, richtig? Es funktioniert perfekt auf meinem System. Ist es möglich, dass Sie ein Paket laden, das diese Einstellungen ändert, oder dass sie anderswo konfiguriert sind, z. B. über die 'Emacs * Geometrie'-Einstellung in einer' ~/.Xresources' oder '~/.Xdefaults' Datei? –

+0

Ich weiß, dass es seltsam klingt, aber das Fenster erscheint sogar in der richtigen Position. Neben Schleim und Cedet habe ich keine zusätzlichen Plugins installiert. Ich habe nichts in meiner .Xresources-Datei und ich habe nur Einstellungen für Xterm in meiner .Xdefaults-Datei. –