IDEとしてのEmacsの使用


169

現在、CまたはC ++でコーディングしているときのEmacsでのワークフローには、3つのウィンドウが関係しています。右側の最大のファイルには、作業中のファイルが含まれています。左は2つに分かれており、下はコンパイルまたはmakeコマンドの入力に使用するシェルで、上は作業中に参照したいドキュメントやREADMEファイルであることがよくあります。現在、かなりの専門家のEmacsユーザーがいることを知っています。完全なIDEとして使用することが意図されている場合、他のEmacsが機能的にどのように役立つか知りたいです。特に、ほとんどのIDEは通常、これらの機能を何らかの形で実現します。

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

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

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


5
質問とすべての回答には、主なIDEポイントがまったくありません。しかし、最初に誤解しないでください。Emacsが提供できるIDEの近くにある(まれなLisp / Schemeのものを除いて)そこには単一のIDEがないと思います。 しかし、最近のIDEは次のようなことをします:可能性のあるコーディングエラーの即時のハイライト(たとえコンパイル不可能なASTでも)。IntelliJ IDEAはそれを行います。たとえば、@ NotNullを使用すると、違反の可能性についてリアルタイムで警告が表示されます。次に、「意図によるコーディング」全体があります。Emacsでは(まだ)機能しません。
SyntaxT3rr0r

18
優れたIDEが本当に輝くもう1つの領域は、コンテキストコードの補完です(もう一度、公平でコンパイルできないソースファイルに対しても)。状況に応じたコード補完により、面白くないようにいつでもヒッピー拡張が p0wnsされます。単にEmacsが恥ずかしくなります。もう一度言いますが、IDEの「テキストエディタ」がEmacsに比べると、安く、不器用で、愚かで、哀れなゴミのようなものだというのは非常に悲しいことです。しかし、優れたIDEは、Emacsが基本的に存在しない多くの領域(リファクタリング、コンテキストによるコード補完、リアルタイムの警告など)で輝きます。言った私のIDEの真ん中にEmacsをください。その日が待ち遠しいです。
SyntaxT3rr0r

コードの折りたたみはどうですか?
AlwaysLearning

ここでのコメントは、おそらくプログラマーによって書かれたものではありません。私はEmacsがそれができないこととできないことを読みましたが、他のIDEはできます。それは私のように聞こえます。プログラマー、プログラミング言語を使用して問題を解決する人。一部のプログラムには機能がないために悪化するという問題がありますが、彼らはその機能を作成したくありません。人のように、そもそもなぜあなたがプログラマーになるのか?? !!
red777-18年

回答:


76

「残り」の意味を具体的に説明する必要があります。(私が知っている)オブジェクトインスペクターを除いて、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がすべて思い浮かびます)

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

グーグル検索は間違いなくさらなる例を明らかにするでしょう。

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


3
それは「Mxコンパイル」ではないのですか?
Svante

1
最近、GNUグローバルはCScopeよりも優れていると思います。gnu.org/ software
global –JürgenHötzel'22

@JürgenHötzel:私はしばらくの間、積極的にEmacsを使用していません。当時、私はCScope、IIRCと組み合わせてGNUグローバルを使用していました。グローバルがCScopeを進化させたとしても、私は驚かないでしょう。
ベンコリンズ

また、<a href=" p4el.sourceforge.net/p4.el.html"> p4.el </ a >を使用したperforceサポート
forksandhope


19

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

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


15

emacsのコーナーがあり、一度発見されると、考えられなかった方法でより生産的になります。他の人が述べたように、タグを使用すると、ソースコードをすばやく簡単に拡大できます。また、M- /(dabbrev-expand)を使用すると、変数名を完成させるときに期待どおりの結果が得られることがよくあります。

バッファ内の正規表現がすべて出現するバッファを取得するには、発生を使用すると便利です。これは、コードをリファクタリングしてコードのフラグメントや変数の使用を探す場合、またはソースファイルで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を学ぶことは、他のemacsが一般的なIDEでできることを超えて何ができるかを自分で答えるためのもう1つの優れた方法です。

たとえば、blameなどのPERFORCEヘルパー関数の記述についてブログを書いています(独自に記述すると、希望どおりに動作させることができます)...

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

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

私のelispコードはどれも特に優れていません。そのほとんどはすでにライブラリに存在しますが、emacsに営業日に登場するカスタム機能を実行させることができると非常に便利です。


10

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


8

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

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

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

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

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

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


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サーバーをとして接続できないことです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


1
私はこれが5年後であることを知っていますが、そのときも使用していました。設定EDITOR="emacsclient -t" VISUAL="emacsclient -c"すると、sudo -eまたはsudoeditを使用してsudoベースの編集を行うことができます。することもできますとのemacsclientのinvoke --alternate-editor= 必要末尾にスペース)と、それはあなたがそれを待つために喜んでいる場合は、システムの起動時にデーモンを配置する必要がなくなり、それが動作していない場合は、デーモン、始めましょう最初の時間をあなたブートごとにエディターを実行します。
ダラエル

7

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

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

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


6

EmacsのVC機能を探索するための出発点(自明ではない場合があります)はMx vc-next-actionです。

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

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

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


4

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)

ええと...これは.emacsファイルにパスワードをプレーンテキストで入れることを真剣に主張していますか?
2015

@TED-いいえ、単なるイラストです。シークレットは、elispからの読み取りで別の場所に保存する必要があります。
Cheeso

3

compile、next-error、previous-errorはすべて、EmacsでのC ++開発にとって非常に重要なコマンドです(grep出力でも機能します)。Etag、visit-tags-table、find-tagも重要です。completion.elは、20世紀の有名なハックの1つであり、C ++ハッキングを桁違いに高速化できます。あぁ、エディフもお忘れなく。

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


3

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

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


1
かっこいい、新しいバージョンのタブバーを取得する方法を探していました。Ubuntuにないものについては、こちらで確認できます。packages.ubuntu.com/karmic/emacs-goodies-el
イブラヒム

3

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


EDITには「smarter-compile.el」があり、このアイデアをさらに一歩進めています。


2

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

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

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

IMOがIDEとしてemacsを使用する最良の方法は、emacsで言語サーバープロトコル使用することです。言語サーバーに関するすべての情報は、リンクされたWebサイトにあります。

簡単に設定するには、このページeglotにアクセスすることをお勧めします。IMO eglotはそれでかなりうまくいきます。それは会社のような自動補完パッケージとうまく統合します。検索リファレンスなどを提供します。

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

コードをコンパイルするには、シェルコマンドを使用するのが最善です。私はこのプロジェクトeprojに取り組んでいます。完了するまで少し時間がかかります。ただし、シェルコマンドをプロジェクトタイプにマップするだけです。シェル経由でプロジェクトをビルドします。コマンドを実行する場合も同様です。このプロジェクトを完了するのに手助けが必要かもしれません。使用する準備はできていませんが、elispを少し知っていれば、コードを試すことができます。

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

バージョン管理に関しては、私はまだmagitの能力に匹敵する他のパッケージを見たことがありません。これはgitに固有です。また、gitには別のパッケージgit-timemachineがあります。これは非常に便利です。

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

プロジェクトツリーは、treemacsとのide likeインターフェースに使用できます。

projectileと呼ばれるプロジェクト相互作用ライブラリもあります。

自動補完については、company-modeが非常に便利です。

本当にemacsは何でもすることができます。



0

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

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

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

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


0

lsp-modeを試してください。これで、サーバーに接続するemacs内で他のIDE機能を使用できます。詳しくはlsp-modeをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.