progモードでシンボルを単語として扱う


12

Emacsには、「単語」に適用される多くのコマンドがあります。例としてはforward-wordkill-wordupcase-wordmark-wordtranspose-words、などの「単語」の定義は、コマンド間のビットを変化させるように思えます。例えば、forward-word単語(例えば内のアンダースコアで停止しますfoo_bar)が、mark-wordアンダースコアで停止しません。

Emacsが現在の言語の構文に適切な単語境界を使用するように、progモードのときに「単語」の定義を変更することは可能ですか?

私は午前ときc-mode、私欲しいforward-wordアンダースコアをスキップして、中に私はときlisp-mode私が欲しいforward-wordなど、ハイフンとアンダースコアの両方をスキップします

回答:


4

Emacsはすでに「現在の言語の構文に適切な単語境界」を使用する必要があります。そうでない場合は、その言語のメジャーモードのバグを報告します。

でもたぶん言葉を意味しないかもしれません。たぶん、あなたは単語の構文ではなく、シンボルの構文を意味します。Emacsは2つを区別します。

シンボル構文には、ワードコマンドではなく、シンボルコマンドを使用しますforward-symbol。など。説明から、これが本当に必要なものです。

シンボルでワード関数を本当に使用したい場合は、特定の文字の構文カテゴリを変更して 、シンボル構成構文ではなくワード構成構文を使用できます。しかし、一般的にこれはあなたがしたいことではなく、あなたがそれをする必要はないはずです。

文字の構文については、Elispのマニュアルを参照してください。また、シンボル(Lispシンボルではなく、任意の言語のシンボル構文のテキスト)を操作するコマンドおよびその他の機能については、EmacsマニュアルおよびElispマニュアルを参照してください。

また、sexpの操作は、シンボルC-M-fforward-sexp)、C-M-ttranspose-sexps)などに作用する場合にも役立つことが多いことに留意してください。


C-M-fにバインドされてforward-sexpおり、あなたが説明したような動作はしません。私が望んでいるのはシンボルでナビゲートすることであるというのは正しいですが、そのオプションは表示されません。
nispio 14年

@nispio forward sexpは基本的にforward-symbolほとんどの場合、一致する中括弧を超える汎用性が追加されています。チャンスを与えるべきです。
マラバルバ14年

@Malabarba私はこれforward-sexpがに近い近似であることに強く反対しforward-symbolます。まず第一に、それはあなたを混乱させて機能全体を飛び越え、あなたが始めたところから何百もの行を着陸させます。また、引数リストなどにもジャンプします。そして、これを試してください。次のlispコード(global-set-key [remap list-buffers] 'ibuffer)を使用して、単語の中央にカーソルを置き、数回remap実行forward-sexpします。これは、エラーを発生させ、それが終了に到達したとき]。結構です。
nispio 14年

@nispio私は常にsexpと単語ナビゲーションの組み合わせを使用します。こうすることで、これらの問題を回避しながら、両方の汎用性を確保できます。しかし、それはすべて好みの問題です。;-)単語のナビゲーションを見逃すことがないことがわかっているなら、superword-modeあなたの男かもしれません。
マラバルバ14年

申し訳ありませんが、私はあることを示唆しているべきではないC-M-fC-M-t(彼らはsexpsに作用)のシンボルに作用します。その印象を修正するために編集します。ただしforward-symbol、特に便利な場合は、好きなキーにバインドできます。がありませんがtranspose-symbols、便利だと思うなら、もう一度書くことができます。
ドリュー

11

見てみましょうsuperword-modesubword-mode。スーパーワードは、アンダースコアを境界ではなく単語の一部として扱うためfoo_bar 、単一の単語として扱われます。
サブワードはキャメルケースでは反対ですがfooBar、1語ではなく2語として扱われます。

あなたが望む振る舞いはcc-mode使用するためのようsuperword-modeです。

(add-hook 'c-mode-common-hook 'superword-mode)

subword-modeこれらの2つのモードが希望どおりに動作していない場合でも、単語検出動作を変更する方法を説明する必要があるため、ソースを読んでお勧めします。

emacsreduxおよびergomacsに関するより長い議論。


superword-mode遊びをうまくすることは可能pareditですか?たとえばparedit-forward-kill-wordsuperword-modeが有効な場合、単語全体(アンダースコアを含む)を削除しません。
レナンラネリ14年

言葉の定義を変えてpareditおり、それを尊重しているので、求められていることをやっていると思います。
14年

問題は、pareditがそれを尊重していないことです。paredit-forward-kill-wordで定義されたのと同じ単語を殺しませんsuperword-mode
レナンラネリ14年

ああ、私は誤解しています。うーん。ただ見てみるとparedit-forward-kill-word、独自の構文解析を行っているように見えます。スワップアウトできるかもしれませんが、おそらくそうではありません。
14年

3

あなたの質問を理解したら、言語構文テーブルを変更できます。たとえば、c ++の場合:

(modify-syntax-entry ?_ "w" c++-mode-syntax-table)

M-x apropos 次に、構文テーブルの検索も役立ちます。

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