しょぼしょぼすくりぷと xyzzy編 > xyzzy初歩講座(機能と操作) > xyzzyのインデント設定

xyzzyのインデント設定

--

秀丸などに比べるとちょっとわかりづらいインデント設定。最初戸惑いますね。 細かく設定できる分、インデント設定は少し複雑です。windowsなどでは シフトという言い方をするかもしれません。このページでは インデント設定についてJavaを例に取り説明しています。

このインデントページの目次

  • インデントの設定変数の説明
  • インデント設定例
    • javaのインデント設定例(グラフィカルにインデント設定するページ)
    • インデント設定サンプル C++
  • インデント(indent)系の関数
表記について、
このページは javaをメインに書いてます(昔の JavaAppletの名残です)。
他の言語の場合"java"を "c" や "perl" "php" "cc(c++)" "csharp"等に置き換えれば動くはずです。
動くかどうかは 標準のものはxyzzyフォルダの /lisp/hogehoge-mode.l を参照してください。

インデントの設定変数の説明

インデントレベルを設定したい

javaの場合以下の変数が設定できます。
(setq ed::java-indent-level 4)

インデントを タブ文字/空白文字で指定する場合

インデントを タブで指定:t 空白で指定:nil
(setq ed::*java-indent-tabs-mode* t)

インデントのタブ文字数を変更する

・共通設定 > 表示 > タブ幅

・フックモードで Java の時だけタブ幅指定 (add-hook '*java-mode-hook* #'(lambda () (set-tab-columns 4 (selected-buffer))))

ちなみに タブ幅とインデントの数字を同じにして、タブ指定するとインデントがすべてTabになります。

オートインデントをしたくない場合

RETキーを \newlineに置き換えても良いと思います。
(define-key *lisp-mode-map* #\RET 'newline)
または
(setq ed::*java-mode-map* (make-sparse-keymap))
キーマップをリセットします。

カーソル位置がどの位置でもインデントして欲しい/欲しくない場合

いつでもインデント:t カーソル位置より前に空白しかない場合インデント:nil
(setq *java-tab-always-indent* nil)

インデント設定 Q&A

    (Q)インデントレベルを設定したい。
    (A)javaの場合以下の変数が設定できます。一番上以外はデフォルト(無指定)のままで良いかもしれません。

     (setq ed::java-indent-level 4)
     (setq ed::java-brace-offset -4)
     (setq ed::java-continued-statement-offset 4)
     (setq ed::java-brace-imaginary-offset 0)
     (setq ed::java-label-offset -2)
     (setq ed::java-comment-indent 3)
     (setq ed::java-argdecl-indent 3)
     ; xyzzyのjavaインデントを対話的に設定するページ
     ; java以外の場合 Version 0.2.1.183


    (Q)インデントはタブで設定したい。
    (A)(setq ed::*java-indent-tabs-mode* t)  ; spaceの場合 nil


    (Q)Enterキーで、オートインデントさせたくない場合:
    (A)RETキーを普通の改行に置き換えます。
      (define-key *lisp-mode-map* #\RET 'newline)
      TABをインデントさせたい場合(javaですが c-です。)
      (define-key ed::*java-mode-map* #\TAB 'c-indent-line)
      TAB文字自体を入れたい場合
      (define-key ed::*java-mode-map* #\TAB 'self-insert-command)設定する。
      
modeの標準では、以下のようなインデントのキーバインド設定になっています。 (define-key *java-mode-map* #\TAB 'c-indent-line) (define-key *java-mode-map* #\RET 'c-newline-and-indent))
(Q)タブがインデントのキーになってしまっているので、タブ自体を入力するには? (A1)C-q TAB を入力。(C-q の後に どんなコードや文字も入れられます。) (A2)(define-key ed::*java-mode-map* #\TAB 'self-insert-command)設定する。 (Q)ある範囲全体をインデント整形したい。 (A)indent-regionが用意されているのでそれを使います。 使い方は、まずリージョンの範囲を C-SPCとカーソル位置で指定して M-x indent-regionを入力します。 (Q)バッファー全体をインデントしたい。 (A)こちらを参考にしてください。 バッファ全体をインデントするlisp (Q)インデントのところで BSを押すとスペースに変換されるのを止めたい。 (A)以下の設定をしてください(selection時の動作とか影響します) C-h backward-delete-char-untabify-or-selection

インデント設定例

javaのインデント設定例

javaの場合以下のような設定を書きます。
(define-key ed::*java-mode-map* #\TAB 'c-indent-line)

;t 常にインデント /  nil カーソル位置より前に空白しかない場合 インデント
(setq *java-tab-always-indent* nil)
(setq *java-indent-tabs-mode* nil)


(setq ed::java-indent-level 4)
(setq ed::java-brace-offset -4)
(setq ed::java-continued-statement-offset 4)
(setq ed::java-brace-imaginary-offset 0)
(setq ed::java-label-offset -2)
(setq ed::java-comment-indent 3)
(setq ed::java-argdecl-indent 3)
        

xyzzyのjavaインデントを対話的に設定するページを作成しました。それぞれの意味を直感的に調整できます。

ちなみにパッケージが重複するエラーが出るため Java パッケージを設定前にあらかじめ 読んでおく必要があります。 これらを実行するために、設定の直前に
(require "java")
とでも書いてください。 または 常に読み込む設定をするのはもったいないと思う人は java-hookを使ってこれらの設定を読み込ましても良いと思います。

インデント設定サンプル C++

私のC++のインデント設定です。参考にどうぞ。

(defun my-setting-c++ ()

  ;メインなインデント幅
  (setq ed::c++-indent-level  4)
  ;文やステートメントが ;で区切られずに続くとき(if文を{}で囲まないとき)
  (setq ed::c++-continued-statement-offset  (floor (/ ed::c++-indent-level  2)))
  ;括弧始まりの位置 java-continued-statement-offset の影響を考慮しておく
  (setq ed::c++-brace-offset (- 0 ed::c++-continued-statement-offset))
  ;閉じ括弧
  (setq ed::c++-brace-imaginary-offset 0);ed::java-indent-level)
  ;switchの   case文が { のインデントの位置から相対位置
  ;(setq ed::java-label-offset           (- 0 ed::java-indent-level));括弧
  と同じ位置
  (setq ed::c++-label-offset         0);インデントと同じ
  ;Java は関係ない?
  (setq ed::c++-argdecl-indent 0)

  (abbrev-mode t)

  (define-key ed::*c++-mode-map* #\{ 'electric-brace-insert)
  (define-key ed::*c++-mode-map* #\( 'electric-brace-insert)
  (define-key ed::*c++-mode-map* #\[ 'electric-brace-insert)
  (define-key ed::*c++-mode-map* #\" 'electric-brace-insert)

  (define-key ed::*c++-mode-map* #\TAB 'c-indent-line)

  (setq *c-tab-always-indent* nil)
  (setq *c++-indent-tabs-mode* nil)
  )

(add-hook 'ed::*c++-mode-hook* ' my-setting-c++)
        

インデント(indent)系の関数

indent-for-comment後ろの方で コメントを入れるために 移動して ; とかを入れてくれます。
indent-regionC-SPC などでマークした部分とカーソルの間についてインデントします。
indent-sexp関数 (S式)をインデント カーソルは関数の前に
indent-relative近いところとあわせる感じでインデント(たぶん)
newline-and-indentカーソル位置で改行して 次の行でインデント
back-to-indentation(省略)
delete-indentation(省略)
c-indent-line(省略)
c-newline-and-indent(省略)
indent-cpp-directive(省略)
lisp-inent-line(省略)
lisp-newline-and-indent(省略)

インデントと似たようなものに Tabを挿入するシフトがあります。その場合は以下の関数が参考になります。
delete-or-unshift-selection,shift-region,shift-selection,unshift-region,unshift-selection

関連リンク

バッファ全体をインデントするlisp

・(外)xyzzyでプログラミング整形(wiki)

静的/動的補完とは? とその設定方法
静的・動的補完の説明とその使い方を実例を上げて説明

キーバインド設定方法
xyzzyでキーバインドの設定する方法

キーワードファイルの設定方法
xyzzyのキーワード設定方法

動的なisearchのインクリメンタルサーチに色付け
isearch.lを拡張して、色がつくようにします。


しょぼしょぼすくりぷと xyzzy | xyzzy初歩講座(機能と操作) | next xyzzy補完機能の設定と使い方->