web-dev-qa-db-ja.com

EmacsをIDEとして使用する

現在、CまたはC++でコーディングしているときのEmacsでの私のワークフローには、3つのウィンドウが関係しています。右側の最大のファイルには、作業中のファイルが含まれています。左は2つに分割され、下はコンパイルまたはコマンドの入力に使用するシェルで、上は多くの場合、何らかのドキュメントまたはREADME現在、かなりのエキスパートEmacsユーザーがいることを知っていますが、完全なIDEとして使用することを意図している場合、他のEmacsが機能的に有用であることに興味があります。または別:

  • ソースコードエディター
  • コンパイラ
  • デバッグ
  • ドキュメント検索
  • バージョン管理
  • クラスルックアップやオブジェクトインスペクターなどのオブジェクト指向機能

これらのいくつかについては、Emacsがこれらの関数にどのように適合することができるかは明らかですが、残りはどうでしょうか?また、特定の言語に焦点を合わせる必要がある場合、C++である必要があります。

編集:あるユーザーは、「残りの部分については」と言ったとき、私はもっと具体的にすべきだと指摘しました。ほとんどの場合、ドキュメントの検索だけでなく、効率的なバージョン管理にも興味がありました。たとえば、SLIMEでは、LISP関数で簡単にhyperspecルックアップを実行できます。 C++ STLドキュメントで何かをすばやく検索する方法はありますか(たとえば hash_map の正確な構文を忘れた場合)?

165
user7545

「残り」とは何を意味するのかを明確にする必要があります。オブジェクトインスペクター(私が知っている)を除いて、emacsは上記のすべてを非常に簡単に実行します。

  • エディター(明らか)
  • コンパイラ-M-x compileそして、コンパイルコマンドを入力します。そこから、ただM-x compileおよびデフォルトを使用します。 EmacsはC/C++コンパイラエラーをキャプチャし(GCCで最適に動作します)、警告またはエラーのある行に移動するのに役立ちます。
  • デバッグ-同様に、デバッグする場合は、M-x gdbそして、特別なバインディングを持つgdbバッファを作成します
  • ドキュメント検索-emacsには、コードナビゲーション用の優れたCScopeバインディングがあります。その他のドキュメント:Emacsにはマンページリーダーもあります。その他にも、Webと書籍があります。
  • バージョン管理-さまざまなVCSバックエンド用のEmacsバインディングが多数あります(CVS、SCCS、RCS、SVN、GITがすべて頭に浮かびます)

編集:ドキュメントルックアップに関する私の答えは、コードナビゲーションに本当に関係していることに気付きました。ここにいくつかのより重要な情報があります:

Googleの検索により、さらなる例が明らかになることは間違いありません。

2番目のリンクが示すように、他のドキュメントで関数(および何でも)を検索することができます。

73
Ben Collins

Emacs Code Browser をより「伝統的な」ものとして推奨する必要がありますIDE emacsのスタイル環境。

[〜#〜] edit [〜#〜]:また、emacsの標準VCSインターフェイスよりも Magit を強く推奨します。

29
baudtack

シェルウィンドウでmakeコマンドを実行する代わりに、M-xコンパイルを試みましたか? makeコマンドを実行し、エラーを表示します。多くの場合、出力にファイル名と行番号が含まれていると、エラーの原因となったコード行に簡単にジャンプできます。

IDEのファンなら、emacsのspeedbarパッケージ(M-x speedbar)もご覧ください。また、まだ行っていない場合は、タグテーブルを使用してコードをナビゲートする方法について学習します。

19
Bryan Oakley

Emacsのコーナーには、かつて発見されたことのない方法で生産性を高めるものがあります。他の人が述べたように、タグの使用はソースコードをズームするための素晴らしくて速い方法であり、M- /(dabbrev-expand)を使用すると、変数名を完成するときに期待どおりに動作することがよくあります。

バッファ内の正規表現がすべて出現するバッファを取得するには、occurを使用すると便利です。これは、コードをリファクタリングしてコードのフラグメントや変数の使用を検索する場合、またはソースファイルでTODOマーカーを使用してそれらすべてにアクセスする場合に非常に便利です。

flush-lines、sort-numeric-fields、replace-regexp、およびrectangle関数は、いくつかのツールからダンプを取得し、elispプログラムやカンマ区切りスプレッドシートなどの有用なデータに変換するのに非常に役立ちます。

IDEについてemacsでできることのようなページを書きました

http://justinsboringpage.blogspot.com/2007/09/11-visual-studio-tricks-in-emacs.html

Elispの学習は、典型的なIDEができることを超えて、emacsができることを自分自身に答えるための別の素晴らしい方法です。

例えば、私は非難のようなPerforceヘルパー関数を書くことについてブログに書いています(あなた自身を書くことは、あなたがそれをあなたが望む通りに振る舞わせることができることを意味します)...

http://justinsboringpage.blogspot.com/2009/01/who-changed-line-your-working-on-last.html

また、ある時点で関数のコメントを動的に作成するコードを作成しました。これは、使用しているコーディング標準に一致します。

私のelispコードはどれも特に素晴らしいものではなく、そのほとんどはすでにライブラリに存在していますが、emacに仕事中に出てくるだけのカスタム処理をさせることができるのは本当に便利です。

15
justinhj

Emacsとバージョン管理統合の詳細な説明は my site にあります。また、C/C++、Java、Perl、LISP/Scheme、Erlangなど、多くの言語の開発環境としてEmacsを使用することに関する記事にも取り組んでいます。

10
Alex Ott

さて、ここのみんながemacsを素晴らしいIDEにするための完璧なヒントを与えています。

ただし、多くの拡張子(特にオンザフライでの型チェック、関数定義のルックアップなど)でemacsをカスタマイズすると、emacsの読み込みが非常に遅くなり、エディターで非常に遅くなることに注意してください。

これを回避するには、server modeでemacsを使用することを強くお勧めします。

使用方法は非常に簡単で、initファイルをカスタマイズする必要はありません。デーモンモードでemacsを起動するだけです。

emacs --daemon

これによりemacsサーバーが作成され、ターミナルまたはGUIから接続できます。また、電話をかけやすくするためにエイリアスを作成することをお勧めします。

alias ec="emacsclient -t"
alias ecc="emacsclient -c &"
# some people also prefer this but no need to fight here;
alias vi="emacsclient -t"

このようにして、emacsはgeditよりもさらに早く起動します。

ここで考えられる問題の1つは、カジュアルユーザーからemacsデーモンを実行している場合、おそらくemacsサーバーをrootとして接続できないことです。

したがって、ルートアクセス権を持つファイルを開く必要がある場合は、代わりにtrampを使用してください。通常のユーザーでemacsクライアントを実行し、このようなファイルを開くだけです。

C-x C-f
/Sudo:root@localhost/some/file/that/has/root/access/permissions
# on some linux distro it might be `/su:root@...` 

これにより私の生活が楽になりました。カスタマイズした重いpython IDEこの方法でミリ秒単位で開くことができます。システムにemacs --daemonを追加することもできます起動、またはemacsclientのデスクトップファイルを作成します。

Emacsデーモンとemacsクライアントの詳細については、wikiをご覧ください。

http://www.emacswiki.org/emacs/EmacsAsDaemon

http://www.emacswiki.org/emacs/EmacsClient

8
Muhammet Can

バージョン管理には、使用するバージョン管理システムに応じて、使用できるものがいくつかあります。ただし、一部の機能はそれらすべてに共通です。

vc.el ファイルレベルでバージョン管理を処理する組み込みの方法です。ほとんどのバージョン管理システム用のバックエンドがあります。たとえば、SubversionバックエンドにはEmacsが付属しており、gitバックエンドなど、他のソースから入手できるものがあります。

最も便利なコマンドは C-x v v (vc-next-action)訪問しているファイルに対して適切な次のアクションを実行します。これは、リポジトリからの更新または変更のコミットを意味する場合があります。vc.elも再バインドします C-x C-q ファイルを必要とするシステム(RCSなど)を使用している場合にファイルをチェックインおよびチェックアウトする。

他の非常に便利なコマンドは C-x v l そして C-x v = 使用しているファイルのログと現在の差分を表示します。

しかし、実際の生産性のために、単純なもの以外の単一ファイルvc.elコマンドの使用は避けてください。ツリー全体のステータスの概要を提供し、より多くのパワーを提供できるパッケージがいくつかあります。また、いくつかのファイルにまたがる一貫したコミットを作成する機能は言うまでもありません。

これらのほとんどは、オリジナルに大きく影響されているか、元に基づいています pcl-cvs/pcvs CVSの場合。 Subversionには2つも付属していますが、 psvn.el そして dsvn.el。 gitなどのパッケージがあります。

8
dkagedal

M-xのコンパイルについて学習する必要があることに同意します(それとM-xの次のエラーを短いキーシーケンスにバインドします)。

バージョン管理のバインディングについて学習します(例:vc-diff、vc-next-actionなど)

レジスタを調べます。バッファ内の場所だけでなく、ウィンドウ全体の構成を覚えることができます(C-x r w-window-configuration-to-register)。

7
HD.

EmacsのVC機能を探索するための開始点(非自明かもしれません)はM-x vc-next-actionです。

ファイルの状態とVCバックエンドに応じて、現在のファイルに対して「次の論理バージョン管理操作」を実行します。したがって、ファイルがバージョン管理下にない場合、登録しますファイルが変更されている場合、変更が送信されます。

慣れるまで少し時間がかかりますが、とても便利です。

デフォルトのキーバインディングはC-x v v

6
Chopmo

Microsoft TFSへのemacs統合のためのTFS.el があります。 Codeplex.comを実行するTFSを含む、すべてのTFSで動作します。

セットアップの基本手順:

  1. ロードパスにtfs.elを配置します。

  2. .emacsファイルで:

    (require 'tfs)
    (setq tfs/tf-exe  "c:\\vs2008\\common7\\ide\\tf.exe")
    (setq tfs/login "/login:domain\\userid,password")
          -or-
    (setq tfs/login (getenv "TFSLOGIN"))  ;; if you have this set
    
  3. また、.emacsファイルで、tfsコマンドのローカルまたはグローバルキーバインドを設定します。そのようです:

    (global-set-key  "\C-xvo" 'tfs/checkout)
    (global-set-key  "\C-xvi" 'tfs/checkin)
    (global-set-key  "\C-xvp" 'tfs/properties)
    (global-set-key  "\C-xvr" 'tfs/rename)
    (global-set-key  "\C-xvg" 'tfs/get)
    (global-set-key  "\C-xvh" 'tfs/history)
    (global-set-key  "\C-xvu" 'tfs/undo)
    (global-set-key  "\C-xvd" 'tfs/diff)
    (global-set-key  "\C-xv-" 'tfs/delete)
    (global-set-key  "\C-xv+" 'tfs/add)
    (global-set-key  "\C-xvs" 'tfs/status)
    (global-set-key  "\C-xva" 'tfs/annotate)
    (global-set-key  "\C-xvw" 'tfs/workitem)
    
4
Cheeso

compile、next-error、およびprevious-errorはすべて、EmacsでのC++開発にとって非常に重要なコマンドです(grep出力でも優れた動作をします)。 Etags、visit-tags-table、find-tagも重要です。 completion.elは20世紀の名のないハッキングの1つであり、C++ハッキングを1桁高速化できます。ああ、ediffを忘れないでください。

シェルにアクセスせずにバージョン管理を使用する方法はまだ学習していませんが、コミットを非常に頻繁に(gitを使用して)実行しているので、おそらく必要になります。

3
jfm3

Windowsではemacsを使用しています。コンパイルモジュールは素晴らしいですが、私はそれが示唆するコンパイルコマンドラインについてコンパイルをよりスマートにしたかったです。 「ファイル変数」を使用してcompile-command 、しかし、私はそれより少しスマートなものが欲しかった。そこで、私は手伝うための小さな関数を書きました。 compileの実行時に、ユーザーにプロンプ​​トを表示するために使用するコンパイルコマンドを推測します。

Guess関数はvbprojまたはcsprojまたはslnファイルを探し、見つかった場合はmsbuildを提案します。次に、バッファファイル名を調べ、それに応じて、さまざまなことを提案します。 .wxsファイルは、それがWIXプロジェクトであることを意味し、おそらくMSIをビルドしたいので、推測ロジックはMSIのnmakeコマンドを提案します。 Javascriptモジュールの場合、jslint-for-wsh.jsを実行して.jsファイルをリントすることをお勧めします。フォールバックとして、nmakeを提案します。

私が使用するコードは次のようになります。

(defun cheeso-guess-compile-command ()
  "set `compile-command' intelligently depending on the
current buffer, or the contents of the current directory."
  (interactive)
  (set (make-local-variable 'compile-command)
       (cond
        ((or (file-expand-wildcards "*.csproj" t)
             (file-expand-wildcards "*.vcproj" t)
             (file-expand-wildcards "*.vbproj" t)
             (file-expand-wildcards "*.shfbproj" t)
             (file-expand-wildcards "*.sln" t))
         "msbuild ")

        ;; sometimes, not sure why, the buffer-file-name is
        ;; not set.  Can use it only if set.
        (buffer-file-name
         (let ((filename (file-name-nondirectory buffer-file-name)))
           (cond

            ;; editing a .wxs (WIX Soluition) file
            ((string-equal (substring buffer-file-name -4) ".wxs")
             (concat "nmake "
                     ;; (substring buffer-file-name 0 -4) ;; includes full path
                     (file-name-sans-extension filename)
                     ".msi" ))

            ;; a javascript file - run jslint
            ((string-equal (substring buffer-file-name -3) ".js")
             (concat (getenv "windir")
                     "\\system32\\cscript.exe c:\\users\\cheeso\\bin\\jslint-for-wsh.js "
                     filename))

            ;; something else - do a typical .exe build
            (t
             (concat "nmake "
                     (file-name-sans-extension filename)
                     ".exe")))))
        (t
         "nmake "))))


(defun cheeso-invoke-compile-interactively ()
  "fn to wrap the `compile' function.  This simply
checks to see if `compile-command' has been previously set, and
if not, invokes `cheeso-guess-compile-command' to set the value.
Then it invokes the `compile' function, interactively."
  (interactive)
  (cond
   ((not (boundp 'cheeso-local-compile-command-has-been-set))
    (cheeso-guess-compile-command)
    (set (make-local-variable 'cheeso-local-compile-command-has-been-set) t)))
  ;; local compile command has now been set
  (call-interactively 'compile))

;; in lieu of binding to `compile', bind to my monkeypatched function
(global-set-key "\C-x\C-e"  'cheeso-invoke-compile-interactively)

私はコンパイル関数の「アドバイス前」としてこれを試しましたが、満足に機能させることができませんでした。そこで、新しい関数を定義し、compileに使用していたのと同じキーストロークの組み合わせにバインドしました。


[〜#〜] edit [〜#〜]現在、「 smarter-compile.el 」があります。さらに一歩。

3
Cheeso

tabbar が役立つこともあります。これは、EclipseからEmacsに移行するときに見落とした唯一の動作をエミュレートします。 「、」および「。」にバインド前のタブバーと次のタブバーに移動すると、Ctrl-x bで常にバッファーを切り替える必要がなくなります。

残念ながら、上記のWebページには、ダウンロードする正しいバージョンがありません。ただし、ほとんどのUbuntuバージョンは、emacs-goodiesパッケージで提供しています。

3
wr.

これは非常に古い投稿であることを知っています。しかし、この質問はemacs初心者には有効です。

IMOとしてemacsをideとして使用する最良の方法は、emacsで language server protocol を使用することです。リンクされたWebサイトで、言語サーバーに関するすべての情報を見つけることができます。

迅速なセットアップのために、このページに移動することをお勧めします eglot IMO eglotはその仕事をかなりうまくやっています。会社のような自動補完パッケージとうまく統合します。検索リファレンスなどを提供します。

また、デバッガの場合、特定の言語用の特定のデバッガが必要になる場合があります。 emacs内からgdbを使用できます。 M-x gdbと入力するだけです。

コードをコンパイルするには、シェルコマンドを使用するのが最適です。私はこのプロジェクトに取り組んでいます eproj 。それを完了するには時間がかかります。ただし、シェルコマンドをプロジェクトタイプにマップするだけです。そして、シェルを介してプロジェクトをビルドします。コマンドを実行するのと同じことを行います。このプロジェクトを完了するのに助けが必要な場合があります。使用する準備はできていませんが、少し知識があればコードを確認できます。

それはさておき、emacs compileコマンドを使用するのが常に最善です。

バージョン管理については、 magit のパワーに一致する他のパッケージはまだ見ていません。 gitに固有のものです。 gitには、別のパッケージgit-timemachineもあります。これは非常に便利です。

オブジェクト検索とクラス検索は、言語サーバープロトコルによって提供されます。

プロジェクトツリーは、 treemacs を使用したIDEのようなインターフェイスに使用できます。

projectile というプロジェクトインタラクションライブラリもあります。

自動補完の場合、 company-mode は非常に便利です。

本当に何でもするためにemacsを作ることができます。

2
sidharth arya

ドキュメントの検索:プログラミング言語に依存します。

Cライブラリとシステムコールは通常、マニュアルページに記載されています。そのために_M-x man_を使用できます。情報ページでより適切に文書化されるものもあります。 _M-x info_を使用します。

Elisp自体には、_C-h f_を使用します。 Pythonの場合、インタープリターで>>> help(<function, class, module>)を使用します。

他のほとんどの言語では、HTML形式のドキュメントが提供されています。そのためには、組み込みブラウザーを試してください(私はw3mを使用しています)。何かがブラウザを開いてemacs内で開きたい場合に備えて、BROWSER環境変数をemacsclient -e "(w3m-goto-url-new-session \"$@\")"(* nix上の)のラッパースクリプトに設定します。

2
Jonas Kölker

近年、ClangはEmacs C++サポートの重要な部分になりました。 Atila NevesがCppCon 2015で講演しました: "C++ IDEとしてのEmacs"

16分間の講演で、次のトピックの解決策を示します。

  • 定義にジャンプ
  • オートコンプリート
  • オンザフライ構文強調表示
  • プロジェクト内のファイルを検索

スライドは こちら にあります。

1
Philipp Claßen

UnixまたはXウィンドウスタイルでは、すべてに機能する統合されたIDEがあることを知りません。

IDEの1つのコンポーネントにすぎないデバッガと対話するには、 realgud を検討してください。私が便利だと思うもう1つのことは、ロケーションメッセージのパーサーです。そのため、コールスタックトレースがあり、コールスタック内の特定の場所で編集したい場合、このフロントエンドインターフェイスでそれを行うことができます。

はるかにこのプログラムは改善を使用できます。しかし、それから、それを改善するために作業している人々を使うこともできます。

免責事項:私はrealgudに取り組んでいます

0
rocky