web-dev-qa-db-ja.com

Emacsの起動を速くするにはどうすればよいですか?

Linuxのプライマリテキストエディターとして Emacs v。22(コンソールバージョン、リモートでは PuTTY を使用して、またはローカルでは Konsole を使用)を使用しています。ただし、起動するたびにロードに時間がかかります。ただし、計時したことはありませんが、ほぼ1秒です。ファイル/ディレクトリの操作とコンパイルに Bash コマンドラインを使用する方が快適なので、Emacsを頻繁に開閉する傾向があります。

起動時間を短縮するにはどうすればよいですか?

67
Colin

Adam Rosenfieldのソリューション に加えて、 Emacs in server mode を使用することをお勧めします。 (server-start)をdotemacsに追加し、Emacsでファイルを開きたいときはいつでもemacsclientではなくemacsを実行します。そうすれば、Emacsの読み込みコストを一度だけ支払う必要があります。その後、クライアントはすぐにポップアップします。

編集

そうです、v22は新しいフレームを作成しません。トリックを実行するシェルスクリプトを作成します。

#!/bin/bash
# Argument: filename to open in new Emacs frame
/usr/bin/emacsclient -e '(let ((default-directory "`pwd`/")) (select-frame (make-frame)) (find-file "'$1'"))'
37
Török Gábor

他の人はgnuserveemacsclientの使用をカバーしています。私はemacs内でコンパイルすることをお勧めします(コンパイルエラーにジャンプできることは有利です)。

しかし、特に.emacsを高速化するには、次のようにします。

  1. .emacsファイルをバイトコンパイルします。これは このコードスニペット を使用して自動的に実行できます。

  2. (require 'package)ステートメントを autoload ed機能に置き換えます。これにより、実際に必要になるまでLISPのロードが遅延します。この手法を使用すると、起動時間を6秒以上から1秒未満に短縮できました。すべてのライブラリがautoloadと正しくマークされているわけではないため、これには少し作業が必要です。

  3. 使用しなくなったコード/機能を削除する。

  4. サイトのインストール--no-site-fileに不要なパッケージが読み込まれないようにするには、オプションsite-start.elを使用してemacsを実行してみてください。

  5. あなたが本当に真剣なら、すでにロードされているお気に入りの機能を使って自分のemacsをロールすることができます。もちろん、これは、バイナリの一部であるため、.emacsにあるものに変更を加えることがより複雑になることを意味します。 dump-emacs の使用方法については、リンクをクリックしてください。

  6. より高速なコンピュータまたは高速ディスク、あるいはその両方を購入します。

.emacsがロードするものを決定する方法

さて、.emacsが何をロードするかをどのようにして見つけますか?機能を削除するか、それを遅らせることを目標としていますか?次のような行を含む*Messages*バッファを確認します。

 /home/tjackson/.emacs.tjackson.el(ソース)を読み込んでいます... 
 /home/tjackson/installed/emacs/LISP/loaddefs.el(ソース)を読み込んでいます...完了
/user/tjackson/.elisp/source/loaddefs.el(ソース)を読み込んでいます...完了
自動復元を読み込んでいます...完了
/home/tjackson/.emacsを読み込んでいます.tjackson.el(ソース)...完了

お気づきのように、Loadingステートメントはネストできます。最初の.emacs.tjackson.el...で終わり、最後の行は.emacs.tjackson.elロードが...doneであることを示しています。他のすべてのファイルは、私の.emacs.tjackson.elファイル内からロードされます。他のすべての負荷はアトミックです。

注:.emacsが大きい場合、*Messages*バッファが一定量の情報しか保持しないため、メッセージの一部が失われます。この設定を.emacsの早い段階で追加して、すべてのメッセージを保持することができます。

(setq message-log-max t)

注:'load コマンドは、4番目の引数nomessageが非nilの場合にメッセージを抑制します。そのような呼び出し(または、'loadにアドバイスし、4番目の引数をnilに強制します)。

58
Trey Jackson

シェルを使用するたびにEmacsを閉じないでください。 Ctrl-Zを使用してEmacsをバックグラウンドに移動し、Bashのfgコマンドを使用してそれをフォアグラウンドに戻します。

28
hiena

いくつかのヒント:

  1. 自動ロードを使用する

    Autoloadを使用すると、使用するまでライブラリをロードする必要がなくなります。例えば:

    (if (locate-library "ediff-trees")
        (autoload 'ediff-trees "ediff-trees" "Start an tree ediff" t))
    
  2. .emacsをコンパイルする

    バージョン管理で作業し、.emacsが.emacs.elcよりも新しい場合は落とし穴がありますが、速度がわずかに向上します。一般的なトリックの1つは次のとおりです。

    (defun autocompile nil
      "compile itself if ~/.emacs"
      (interactive)
      (require 'bytecomp)
      (let ((dotemacs (file-truename user-init-file)))
        (if (string= (buffer-file-name) (file-chase-links dotemacs))
          (byte-compile-file dotemacs))))
    
    (add-hook 'after-save-hook 'autocompile)
    
  3. Emacsサーバーを愛することを学ぶ。

    Emacsをサーバーとして実行すると、サーバーを終了する必要がなくなります。ただし、まだemacs22を使用していることに注意してください。 emacs23はマルチttyをサポートしているため、1つのスクリーンセッションでemacsを実行してから、別の端末で新しいウィンドウを開くことが非常に簡単になります。私はemacsを使用してメールクライアント(mutt)のメールを編集し、emacsclientはこの種のクイック編集に最適です。

21
stsquad

の一つ

M-x Shell
M-x eshell
M-x term
M-x ansi-term

emacs内からコマンドラインのニーズを満たす必要があります。

M-!(別名M-x Shell-command)を使用して、シェルにドロップせずにワンライナーを実行することもできます。

19
Chris Conway

.emacsファイルを使用して、不要なパッケージをロードしているかどうかを確認します。パッケージのロードには、かなりの時間がかかる場合があります。たとえば、php-mode PHPファイルを編集している場合。パッケージはフックプロシージャをインストールすることで実行できますが、詳細はわかりません。

また、ロードするすべてのパッケージがコンパイルされていることを確認してください(.elcファイル)。次のコマンドを実行すると、elispファイルをコンパイルできます

emacs -batch -f batch-byte-compile thefile.el

コンパイルされたパッケージは、コンパイルされていないパッケージよりもはるかに速くロードされます。

14
Adam Rosenfield

「ファイル/ディレクトリの操作とコンパイルにbashコマンドラインを使用する方が快適なので、emacsを頻繁に開いたり閉じたりする傾向があります。」

Vimのようなエディターがどのように使用されるかを説明しています。シュートイン&アウト。 Emacsは通常開いたままで、ほとんどすべてが「その内部」から行われます。 hienaはすでに、ここでの正しいアプローチは何かと答えました。

13
Rook

最速の方法は profile your .emacs です。 .emacsの4つの特定の行がロード時間の80%以上を占めていることがわかったので、5分でロード時間を> 3秒から1秒に短縮しました。

11
Vicky Chijwani

autoloadに加えて(他の人が示唆しているように).emacsの読み込み時間を短縮するのに役立つ1つの点は、 eval-after-load です。次の例では、sql-set-productへの呼び出しを遅らせることで、sql.emacsにロードする必要がなくなり、既存のsqlオートロードがより効率的になります。

(eval-after-load "sql" 
 '(progn 
(sql-set-product' mysql)
(setq sql-mysql-options '( "-C" "-t" "-f" "-n"))
(setq sql-sqlite-program "sqlite3")
))

もちろん、一部のパッケージでは hook を使用して同じことを実行できますが、できない場合もあれば、この方法の方が簡単に考えることができる場合もあります。

9

Emacsは「常時」(または少なくとも長期間)実行されるように設計されているため、1日にEmacsを数回起動および停止することはお勧めしません。

画面の使用をお勧めします。 Screenはターミナルマルチプレクサで、1つのターミナルに無制限の仮想ターミナルを提供します。

インストールした後、単にあなたのターミナルで「画面emacs」を書いてください。 Emacsは通常どおり起動しますが、「c-a c」を押す(つまり、ctrl-aを押してからcを押す)と、新しい仮想端末が開きます。 「c-a c-a」(Ctrl-Aの2倍)を押すと、emacsに戻ることができます。

実行中のスクリーンセッションから切り離すこともできます。キーシーケンスは「c-a d」です。

「screen -R」を発行してセッションに再接続すると、前の場所に戻ります。これにより、職場でemacsセッションを開始し、デタッチし、家に帰って、家から再接続することができます。

私はこのようなEmacsを何ヶ月も続けて実行しています。

これが公式のWebサイトです: http://www.gnu.org/software/screen/ しかし、画面のチュートリアルとハウツーについてはグーグルを試してください

8
slu

benchmark-init を使用して、Emacsスタートアップのプロファイルを作成できます。ロードされているモジュールと、それぞれに費やされた時間を追跡します。結果は、表形式またはツリーとして表示できます。ツリーを使用すると、誰が何をロードしたかを追跡しやすくなります。これは、多くの依存関係を持つパッケージをロードするときに役立ちます。表形式のフォームは、ほとんどの時間が費やされている場所をすばやく見つけるのに役立ちます。

これらの結果が得られたら、すべてのモジュールを常にロードする必要があるかどうか、またはそれらの一部をオンデマンドでロードできるかどうかを調べてください。たとえば、私の設定では、特定のモードに固有のEmacs拡張機能のみをロードします。そのモードが実際にアクティブになるのは、ほとんどの場合、セッションでそれらの小さなサブセットしか使用しないためです。 eval-after-load そしてモードフックはここであなたの友達になります。

この方法を適用することで私のEmacsは3〜4秒で始まり、私は200拡張に近いインストールされています。ほとんどの時間は、Helmのロードに費やされます。これは、find-fileと常に必要なその他のコア機能を置き換えるため常にロードされます。CEDETは、最新バージョンを使用しており、Emacsが古いロードを試みる前にロードする必要があるためです。組み込みバージョン。

5
David Holm

開始時間は約120秒でした。私はこれをインストールする修正を見つけることができました:

https://github.com/dholm/benchmark-init-el あなたのinit.elの上に置く

(let ((benchmark-init.el "~/.emacs.d/el-get/benchmark-init/benchmark-init.el"))
  (when (file-exists-p benchmark-init.el)
    (load benchmark-init.el)))

次に、emacsが起動したら、次のコマンドを実行します。

M-x benchmark-init/show-durations-tree

私の側では、問題はtramp-loaddefsで127秒でした

追加して修正しました

127.0.0.1  Host.does.not.exist

/ etc/hostsにすると、起動が速くなりました

詳細はこちら: https://github.com/emacs-helm/helm/issues/1045

あなたに役立つかもしれないもう一つ: https://www.emacswiki.org/emacs/ProfileDotEmacs

4
DmitrySemenov

他の人が言及していないことの1つは、使用するelispライブラリを dumped Emacs の一部として組み込み、ライブラリのロード時間をEmacsの起動からEmacsビルドに移動することです。気の弱い人には向いていませんが、.emacsに複数のライブラリをロードすると、数秒の起動時間を獲得できます。

4

これは質問には答えませんが、関連性のあるものです

早く起動する方法はわかりませんが、いくつか提案できることがあります。

  • コマンドラインで行うほとんどのことは、emacsで行うことができます。

    • コンパイル:M-xコンパイルし、使用するコマンドを入力します
    • 私の経験はC++でのみですが、g ++ではC-x `を押してコンパイラーが不平を言う行にジャンプできます
    • シェルコマンドを実行:M- !、出力をバッファーにダンプ
    • インタラクティブシェル:M-xシェル
  • または、次のようにemacsを実行することもできます。

    • emacs file.ext &
    • シェルを使用できるようにバックグラウンドでemacsを開きます(これは、PuTTYおよびXmingなどのX転送で最適に機能します)
3
clawr

https://github.com/jwiegley/use-package マクロを使用して、パッケージのロードとカスタマイズを定義してみてください。パッケージの遅延読み込みを処理するため、構成済みのパッケージが多数存在する場合でも、比較的簡単に適切な起動時間を取得できます。 .emacsで参照しているパッケージはほぼ100ですが、起動時間はLinuxでは2秒未満、Macでは2.2秒未満です。

3
John Wiegley

ここでこの質問に出くわしたとき、私は同じ問題を解決しようとしていました。私の問題はemacs LISPパッケージのロード時間によるものではなく、ホストが完全に解決されたホスト名を持っていなかったという事実を追加したかっただけです。

パッケージの読み込み時間をチェックするには

M-x emacs-init-time

私にとっては0.3秒でしたが、読み込み時間は非常に長くなりました。ホスト名を正しく変更すると、問題が解決しました。

完全に解決されたホスト名を構成するには、/ etc/hostnameおよび/ etc/hostsfileを次のように編集します。

127.0.0.1       localhost localhost.localdomain
192.168.0.2   hostname hostname.domain
2
tsar2512

カスタマイズを確認する必要がありますが、gnuserveまたはemacsclientというパッケージがあります。それはたくさん移行するので、ググる必要があります。

バックグラウンドで1つのemacsセッションを実行します。 emacsの以降のセッションは、基本的にそのセッションの新しいフレームです。 1つの利点は、後のセッションの起動時間が短いことです。

1
BubbaT