176

現在、C または C++ でコーディングしているときの Emacs のワークフローには 3 つのウィンドウが含まれます。右側の最大のものには、私が作業しているファイルが含まれています。左側は 2 つに分かれており、下部はコンパイルまたは make コマンドを入力するために使用するシェルであり、上部は多くの場合、作業中に参照したいある種のドキュメントまたは README ファイルです。Emacs の専門家が何人かいることがわかったので、完全な IDE として使用する場合、機能的に役立つ Emacs が他にあることに興味があります。具体的には、ほとんどの IDE は通常、これらの機能を何らかの形で満たします。

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

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

編集:あるユーザーは、「残りはどうなるか」と言ったとき、もっと具体的にすべきだったと指摘しました。主に、効率的なバージョン管理とドキュメントの検索に興味がありました。たとえば、SLIME では、Lisp 関数のハイパースペック検索を簡単に行うことができます。C++ STL ドキュメントで何かを調べる簡単な方法はありますか (たとえば、 hash_mapの正確な構文を忘れた場合)。

4

18 に答える 18

75

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

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

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

Google で検索すると、さらに多くの例が明らかになります。

2 番目のリンクが示すように、最初からサポートされていない場合でも、他のドキュメントで関数 (およびその他のもの) を検索できます。

于 2008-09-15T14:41:01.380 に答える
29

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

編集:また、emacsの標準VCSインターフェースよりもMagitを強くお勧めします。

于 2008-09-16T02:20:33.303 に答える
19

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

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

于 2008-09-15T14:40:06.170 に答える
16

かつては考えもしなかった方法で生産性を向上させることが発見された emacs のコーナーがあります。他の人が述べたように、タグを使用することは、ソース コードを拡大する素晴らしい方法であり、変数名を完成させるときに M-/ (dabbrev-expand) を使用すると、期待どおりの結果が得られることがよくあります。

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

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

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

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

elisp を学習することは、通常の IDE でできること以外に emacs でできることを自分で解決するもう 1 つの優れた方法です。

たとえば、私は Blame のような Perforce ヘルパー関数の作成についてブログに書いています (独自の関数を作成すると、思い通りに動作させることができます)...

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

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

私の elisp コードはどれも特に優れたものではなく、そのほとんどは既にライブラリーに存在しています。

于 2009-02-01T22:19:33.310 に答える
10

私のサイトで、emacs とバージョン管理の統合の詳細な説明を見つけることができます。また、C/C++、Java、Perl、Lisp/Scheme、Erlang など、多くの言語の開発環境として Emacs を使用する方法についての記事にも取り組んでいます。

于 2008-11-04T08:50:05.957 に答える
8

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

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

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

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

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

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

于 2008-10-02T11:08:39.497 に答える
8

さて、ここにいる全員が、emacs を優れた IDE にするための完璧なヒントを提供しています。

しかし、emacs を多くの拡張機能 (特にその場での型チェック、関数定義のルックアップなど) でカスタマイズすると、emacs の読み込みがエディターにとって非常に遅くなることを覚えておく必要があります。

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

使い方はとても簡単で、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 サーバーを .xml として接続できないことです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

于 2013-01-31T22:14:34.163 に答える
7

Mxコンパイルについて学ぶ必要があることに同意します(それとMx next-errorを短いキーシーケンスにバインドします)。

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

レジスターを調べます。バッファ内の場所だけでなく、ウィンドウ全体の構成(Cx rw --window-configuration-to-register)も記憶できます。

于 2008-09-15T14:54:48.943 に答える
6

Emacs の VC 機能を調べるための出発点 (自明ではないかもしれません) はMx vc-next-actionです。

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

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

デフォルトのキーバインドはCx vvです

于 2008-09-17T10:34:31.033 に答える
4

emacsをMicrosoftTFSに統合するための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)
    
于 2009-10-24T04:24:32.710 に答える
3

compile、next-error、previous-error はすべて、Emacs での C++ 開発にとって非常に重要なコマンドです (grep 出力でもうまく機能します)。Etags、visit-tags-table、find-tag も重要です。completion.el は、20 世紀の偉大な陰のハックの 1 つであり、C++ のハッキングを桁違いに高速化することができます。ああ、ediff を忘れないようにしましょう。

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

于 2008-09-16T05:58:58.613 に答える
3

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

推測機能は 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


編集このアイデアをさらに一歩進めた " smarter-compile.el " があります

于 2011-01-06T23:13:59.513 に答える
3

タブバーも便利だと思うかもしれません。Eclipse から Emacs に移行したときに見逃した唯一の動作をエミュレートします。"," および "." にバインドされます。前と次のタブバーに移動するために、Ctrl-x b でバッファを切り替えることから解放されます。

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

于 2009-05-10T15:38:43.870 に答える
2

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

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

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

スライドはこちらからご覧いただけます

于 2015-11-15T14:50:05.043 に答える
2

ドキュメント検索時: プログラミング言語によって異なります。

C ライブラリとシステム コールは通常、man ページに記載されています。そのためには、 を使用できますM-x man。情報ページの方が適切に文書化されているものもあります。使用してM-x infoください。

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

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

于 2009-02-27T12:21:39.903 に答える