Emacs を IDE として使用する
-
09-06-2019 - |
質問
現在、C または C++ でコーディングしているときの Emacs のワークフローには 3 つのウィンドウが含まれています。右側の最大のものには、私が作業しているファイルが含まれています。左側は 2 つに分割されており、下部はコンパイルまたはコマンドの作成に使用するシェルで、上部は作業中に参照したいドキュメントまたは README ファイルであることがよくあります。さて、世の中にはかなり専門的な Emacs ユーザーがいることが分かりました。また、完全な IDE として使用することを目的としている場合、他の Emacs が機能的にどのような役に立つのか興味があります。具体的には、ほとんどの IDE は通常、何らかの形で次の機能を実行します。
- ソースコードエディタ
- コンパイラ
- デバッグ
- ドキュメントの検索
- バージョン管理
- クラスルックアップやオブジェクトインスペクタなどのオブジェクト指向機能
これらのうちのいくつかについては、Emacs がこれらの関数にどのように適合できるかは明らかですが、残りの部分についてはどうでしょうか?また、特定の言語に重点を置く必要がある場合は、C++ にするべきだと思います。
編集: あるユーザーは、「残りはどうするか」というとき、もっと具体的に言うべきだったと指摘しました。主に、効率的なバージョン管理とドキュメントの検索に興味がありました。たとえば、SLIME では、Lisp 関数でハイパースペック ルックアップを簡単に行うことができます。C++ STL ドキュメントで何かを簡単に検索する方法はありますか (正確な構文を忘れた場合) ハッシュマップ, 、 例えば)?
解決
「残り」が何を意味するのかを具体的にする必要があります。(私が知っている) オブジェクトインスペクターを除いて、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 番目のリンクに示されているように、そのままではサポートされていない場合でも、他のドキュメント内の関数 (など) を検索することができます。
他のヒント
お勧めしなければなりません Emacsコードブラウザ emacs のより「伝統的な」IDE スタイル環境として。
編集:私も今オススメしています マジット emacs の標準 VCS インターフェイスを大幅に上回ります。
シェル ウィンドウで make コマンドを実行する代わりに、M-x コンパイルを試してみましたか?これにより、make コマンドが実行され、エラーが表示されます。また、出力にファイル名と行番号が含まれている場合は、多くの場合、エラーの原因となったコード行に簡単にジャンプできます。
IDE のファンなら、emacs の Speedbar パッケージ (M-x Speedbar) も検討してみるとよいでしょう。まだ行っていない場合は、タグ テーブルを使用してコードをナビゲートする方法について学びましょう。
emacs には、一度発見すると、思いもよらなかった方法で生産性が向上する機能があります。他の人が述べたように、タグの使用はソース コードをズームするための素晴らしい高速な方法であり、変数名を完成させるときに M-/ (dabbrev-expand) を使用すると、多くの場合、期待どおりの結果が得られます。
happens を使用すると、バッファ内の正規表現のすべての出現を含むバッファを取得するのに便利です。これは、コードをリファクタリングしてコードの断片や変数の使用を検索する場合、またはソース ファイルで TODO マーカーを使用しており、そのすべてにアクセスしたい場合に非常に便利です。
flash-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 コードは特に素晴らしいものはなく、そのほとんどはすでにライブラリに存在していますが、勤務中に思いついたカスタム処理を emacs に実行させることができるのは非常に便利です。
emacs とバージョン管理の統合の詳細な説明は、次のサイトで見つけることができます。 私のサイト. 。また、C/C++、Java、Perl、Lisp/Scheme、Erlang など、多くの言語の開発環境として Emacs を使用することに関する記事にも取り組んでいます。
バージョン管理には、使用するバージョン管理システムに応じて、いくつかのものが使用できます。ただし、機能の一部はすべてに共通です。
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/PCV CVS用。そのうちの 2 つは Subversion に付属しています。 psvn.el そして dsvn.el. 。gitなどのパッケージもあります。
さて、ここにいる誰もが 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 サーバーに接続できないことです。 root
.
したがって、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 を参照してください。
M-x コンパイル (それと M-x next-error を短いキー シーケンスにバインドする) について学ぶべきであることに同意します。
バージョン管理のバインディングについて学びます (例:vc-diff、vc-next-action など)
レジスターを調べます。バッファ内の位置だけでなく、ウィンドウ構成全体を記憶することもできます (C-x r w -- window-configuration-to-register)。
Emacs の VC 機能を探索するための出発点 (自明ではないかもしれません) は次のとおりです。 M-x vc-next-action.
ファイルと VC バックエンドの状態に応じて、現在のファイルに対して「次の論理バージョン管理操作」を実行します。したがって、ファイルがバージョン管理されていない場合は登録され、ファイルが変更されている場合は変更が送信されます。
慣れるまで少し時間がかかりますが、とても便利だと思います。
デフォルトのキーバインドは C-x v v
あります Emacs を Microsoft TFS に統合するための TFS.el. 。Codeplex.com を実行する TFS を含む、あらゆる TFS で動作します。
セットアップの基本的な手順:
tfs.el をロードパスに配置します。
.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
.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)
compile、next-error、previous-error はすべて、Emacs での C++ 開発にとって非常に重要なコマンドです (grep 出力でもうまく機能します)。Etag、visit-tags-table、find-tag も重要です。completed.el は、20 世紀の知られざる偉大なハックの 1 つであり、C++ ハッキングを桁違いに高速化できます。ああ、エディフも忘れないでください。
私はシェルにアクセスせずにバージョン管理を使用する方法をまだ学んでいませんが、(git を使用して) コミットをより頻繁に実行しているので、おそらくそうする必要があるでしょう。
あなたも見つけるかもしれません タブバー 役に立つ。これは、Eclipse から Emacs に移行するときに見逃した唯一の動作をエミュレートします。「、」にバインドされています。前後のタブバーに移動するために、常にCTRL-X Bによってバッファーを切り替えることができます。
残念ながら、上記の Web ページでは、ダウンロードするための正しいバージョンが提供されていません。ただし、ほとんどの Ubuntu バージョンでは、emacs-goodies パッケージで提供されます。
Windows 上で emacs を使用しています。コンパイル モジュールは優れていますが、私はコンパイルが提案するコンパイル コマンド ラインについてもっと賢明にしてほしかったのです。 「ファイル変数」を使用して指定することが可能 compile-command
, 、しかしそれよりももう少しスマートなものが欲しかった。そこで、それを助けるためにちょっとした関数を書きました。実行時に使用するコンパイル コマンドを推測し、ユーザーにプロンプトを表示します。 compile
.
guess 関数は vbproj、csproj、または sln ファイルを検索し、見つかった場合は msbuild を提案します。次に、バッファ ファイル名を調べ、それに応じてさまざまな内容を提案します。.wxs ファイルは、それが WIX プロジェクトであることを意味し、おそらく MSI をビルドする必要があるため、推測ロジックは MSI 用の nmake コマンドを提案します。Javascript モジュールの場合は、jslint-for-wsh.js を実行して .js ファイルを lint することをお勧めします。フォールバックとして、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
.
編集 今があるよ」スマートコンパイル.el」は、このアイデアをさらに一歩進めたものです。
ドキュメントの検索時:それはプログラミング言語によって異なります。
C ライブラリとシステム コールは通常、マニュアル ページに文書化されています。そのために使用できます M-x man
. 。いくつかのことについては、情報ページの方が文書化されている可能性があります。使用 M-x info
.
elisp 自体については、次を使用します C-h f
. 。Python の場合は、使用します >>> help(<function, class, module>)
通訳で。
他のほとんどの言語ではドキュメントが HTML 形式で提供されていることがわかりました。そのためには、埋め込みブラウザ (私は w3m を使用しています) を試してください。を設定してください BROWSER
ラッパースクリプトへの環境変数 emacsclient -e "(w3m-goto-url-new-session \"$@\")"
(*nix 上)、何かがブラウザを開く可能性があり、それを emacs 内で開きたい場合に備えて。
これが非常に古い投稿であることは承知しています。しかし、この質問は emacs 初心者にとって有効です。
IMO では、emacs を IDE として使用する最良の方法は、 言語サーバープロトコル emacsで。言語サーバーに関するすべての情報は、リンクされた Web サイトで見つけることができます。
簡単なセットアップについては、このページにアクセスすることをお勧めします。 エグロット 。IMO eglot は非常にうまく機能します。company のような自動補完パッケージとうまく統合されます。検索リファレンスなどを提供します。
デバッガーについても、特定の言語に対応した特定のデバッガーが必要になる場合があります。emacs 内から gdb を使用できます。入力するだけ M-x gdb
.
コードをコンパイルするには、シェルコマンドを使用するのが最善です。私はこのプロジェクトに取り組んでいます プロジェクト. 。完了するまでにはしばらく時間がかかります。ただし、シェルコマンドをプロジェクトタイプにマッピングするだけです。そしてシェル経由でプロジェクトをビルドします。コマンドを実行する場合も同様です。このプロジェクトを完了するには助けが必要かもしれません。まだ使用できる状態ではありませんが、elisp について少しでも知っていれば、コードを読み進めることができます。
それはさておき、emacs コンパイル コマンドを使用することが常に最善です。
バージョン管理に関しては、これに匹敵するパッケージをまだ見たことがありません。 マジット. 。これは git に固有のものです。また、git には別のパッケージ git-timemachine があり、これは非常に便利です。
オブジェクト検索とクラス検索は、言語サーバー プロトコルによって提供されます。
プロジェクト ツリーは、IDE のようなインターフェイスとして使用できます。 ツリーマック.
というプロジェクトのインタラクション ライブラリもあります。 発射体.
自動補完については、次のようになります。 カンパニーモード 非常に便利。
本当に emacs は何でもできるようになります。
近年、Clang は Emacs C++ サポートの重要な部分になりました。Atila Neves は CppCon 2015 で次のように講演しました。「C++ IDEとしてのEmacs」
これは 16 分間の講演で、次のトピックに対する解決策を示します。
- 定義にジャンプ
- オートコンプリート
- オンザフライ構文ハイライト
- プロジェクト内のファイルを検索
スライドが見つかります ここ.
Unix または X Windows スタイルでは、すべてに対応する統合 IDE があるかどうかはわかりません。
IDE の 1 つのコンポーネントであるデバッガーと対話する場合は、次のことを考慮してください。 リアルガッド. 。私が便利だと思うもう 1 つの機能は、位置メッセージのパーサーです。これにより、呼び出しスタック トレースがあり、呼び出しスタック内の特定の場所を編集したい場合、このフロントエンド インターフェイスでそれを行うことができます。
現時点では、このプログラムには改善の余地があります。しかし、それを改善するためにそれに取り組んでいる人々を利用することもできます。
免責事項:リアルグドに取り組んでいます