#author("2021-01-10T04:35:39+00:00","","")
#author("2021-05-21T21:16:31+00:00","","")
#topicpath

////////////////////////////////////////////////////////////////////////////////
* 目次 [#xdc7c37e]
#contents();
#ls2(Editor/emacs/);


////////////////////////////////////////////////////////////////////////////////
* 編集関連 [#d174f0d4]
//==============================================================================
** 矩形編集 [#h1d64252]
- rectangle-mark-mode を使う。
|~Key         |~command name       |~Operation           |
|C-x SPC      |rectangle-mark-mode |矩形選択の開始         |
|C-w          |kill-region         |選択した箇所をカット    |
|M-w          |kill-ring-save      |選択した箇所をコピー    |
|C-y          |yank                |選択した箇所をヤンク    |
|C-o          |open-line           |矩形選択した箇所に空行を挿入         |
|C-t CHAR     |transpose-chars     |矩形選択した箇所を CHAR で置換       |
|C-x r t CHAR |transpose-chars     |矩形選択した箇所を CHAR で置換       |
|C-SPC → (region選択) → C-x SPC |  |選択したリージョンを矩形選択に変更 |
|C-x r k      |kill-rectangle      |矩形の切り取り   |
|C-x r y      |yank-rectngle       |矩形の貼り付け   |
-- 矩形編集は emacs24 あたりから使うことが出来るが、使うなら emacs25 以降の方が良い。理由は、特に挿入時に入力内容がバッファに直接反映される為(emacs24では、確定前の矩形編集入力はミニバッファにしか表示されない為、他の行とカラムを揃えたい場合に分かり難い)

//------------------------------------------------------------------------------
*** 使い方 [#d2cde02a]
+ 矩形編集モードに入る
 C-X SPC
+ 編集対象とする矩形をカーソルキーで選択する
+ 編集したいコマンドを実行する
-- 例:矩形選択した箇所を CHAR で置換
 C-x r t CHAR

//------------------------------------------------------------------------------
*** 参考リンク [#k8b26146]
- [[GNU Emacs Manual(Japanese Translation): Rectangles>https://ayatakesi.github.io/emacs/25.1/Rectangles.html]]
- [[Emacs における矩形領域のコピペ系編集機能 | プログラマーズ雑記帳>http://yohshiy.blog.fc2.com/blog-entry-254.html]]

//==============================================================================
** 一括インデント [#y159cc3a]
+ まず、バッファ全体を選択する
 C-x h (mark-whole-buffer)
+ 選択領域に対してインデントを実行する
 C-M-\ (indent-region)

////////////////////////////////////////////////////////////////////////////////
* 編集以外の機能 [#q1c8a63a]
//==============================================================================
** 文字数を数える [#t87cae47]
- 対象領域を選択し、
 M-x: count-lines-region
または
 M-=
とする。
- 行数と文字数が表示される。文字数は、全角も半角もそれぞれ1文字として扱われる。

//==============================================================================
** ファイルを read-only で開く [#sd5faa53]
 C-x C-r

//==============================================================================
** HTML文書編集での自動補完 [#d02f9e86]
- yahtmlを使う(yahtmlは、YaTeXに付属しているもの)。
- [[参考リンク>http://www.namazu.org/~tsuchiya/elisp/yahtml-mode.html]]

//==============================================================================
** 起動済みのemacs にファイルを渡す (emacsclient) [#ob79c7cd]
- emacs起動時に、emacs-serverが起動するようにしておく必要がある。
-- .emacs に以下の行がなければ追記する:
 (server-start)
- 起動済みのemacsに、コマンドラインからファイルを渡す方法
 $ emacsclient <file-name> &
-- ファイルを送っただけのようで、実際には送り先のemacsとは別プロセスとして稼働するらしい。 '&' を付けないと、コマンドを打った端末のフォアグラウンドジョブになってしまう。
-- 上記コマンドを打った端末を終了すると、送り先のemacsからも、送られたファイルのエントリが消えてしまうので注意すること。
-- どうしてもemacsclientを起動した端末が死んでも構わないようにしたいなら、nohupコマンドから起動すればよい。
 $ nohup emacslient <file-name> &
→[[System/Process#never-kill]]


////////////////////////////////////////////////////////////////////////////////
* 設定関連 [#l0e4033f]
//==============================================================================
** フォント設定 [#ld049214]
+ Menu → "Options" → "Set Default Font..." でフォントを選択。
+ Menu → "Options" → "Save Options" で設定を保存する。(この操作により、上で行ったフォント設定が ${HOME}/.emacs.dinit.el に保存される)
+ Menu → "Options" → "Save Options" で設定を保存する。(この操作により、上で行ったフォント設定が ${HOME}/.emacs.d/init.el に保存される)

//==============================================================================
** lisp の場所を設定する [#sa55267e]
- load-path : 指定したディレクトリを lisp を走査する場所として設定する
-- 書式:
 (load-path <path-to-lisp-dir>)
-- 書式例:
 (load-path (expand-file-name "~/.emacs.d/lisp")) ; ${HOME}/.emacs.d/lisp 相当の絶対パスに変換される
- normal-top-level-add-subdirs-to-load-path : load-path に登録されたディレクトリの下位ディレクトリも lisp を走査の対象に含める
-- 書式:
 (normal-top-level-add-subdirs-to-load-path)
-- 環境によってはアクセス権の問題等でエラーになる場合があるので注意すること。

//==============================================================================
** タイトルバーの表示書式にファイル名を入れる [#h8aae4c1]
 (setq frame-title-format (format "emacs@%s : %%f" (system-name)))

//==============================================================================
** 文字色の変更 [#j1818f18]
- emacs 上で指定された文字色を変更する方法について。
- magit, xcscope などのパッケージで、文字色の制御を行っているものがある。これらは端末の background color などの関係で、場合によって却って見難くなることがある。

//------------------------------------------------------------------------------
*** terminal 上で動作させる場合 [#q0925a19]
- 方法1
 $ cat ${HOME}/.bashrc
 alias emacsd='env TERM=xterm emacs --daemon'
 alias emacs='emacsclient -t'
- 方法2
 $ TERM=xterm-256color emacs -nw
- 方法3 init.elに以下を追加する
 (defun terminal-init-gnome ()
   "Terminal initialization function for gnome-terminal."
 
   ;; This is a dirty hack that I accidentally stumbled across:
   ;;  initializing "rxvt" first and _then_ "xterm" seems
   ;;  to make the colors work... although I have no idea why.
   (tty-run-terminal-initialization (selected-frame) "rxvt")
   (tty-run-terminal-initialization (selected-frame) "xterm"))
- 方法4 init.elに以下を追加する
 (add-hook 'tty-setup-hook
           '(lambda ()
              (set-terminal-parameter nil 'background-mode 'dark)))

//------------------------------------------------------------------------------
*** どの変数で色定義されているかを調べる [#eefe35f4]
+ 対象となる文字列にカーソルを合わせた上で、以下を実行する:
 M-x: describe-face
すると、ミニバッファに以下のように表示される:
 Describe face (default `cscope-file-face'): 
+ ここで決定(return キーを押す)と、以下のように表示される:
 Face: cscope-file-face (sample) (customize this face)
 
 Documentation:
 Face used to highlight file name in the *cscope* buffer.
 
 Defined in `xcscope.el'.
 
            Family: unspecified
           Foundry: unspecified
             Width: unspecified
            Height: unspecified
            Weight: unspecified
             Slant: unspecified
        Foreground: yellow
 DistantForeground: unspecified
        Background: unspecified
         Underline: unspecified
          Overline: unspecified
    Strike-through: unspecified
               Box: unspecified
           Inverse: unspecified
           Stipple: unspecified
              Font: unspecified
           Fontset: unspecified
           Inherit: unspecified

//------------------------------------------------------------------------------
*** 色変更の定義 [#v3047709]
+ 上記を元に、以下のように設定してやれば、色を変えることが出来る
 (set-face-foreground 'cscope-file-face "#d54e53")  ; yellow → (RGB)=(0xd5,0x4e,0x53)

//==============================================================================
** 色設定 [#uf6d738d]
- ${HOME}/.bashrc での、emacs/XEmacs の色設定
 alias emacsk='emacs -bg "#303030" -fg white'
 alias emacsb='emacs -bg azure'
 alias emacsy='emacs -bg lightyellow'
 alias emacsg='emacs -bg "#e0ffe0"'
 alias emacsr='emacs -bg "#fff5f5"'
 
 alias xemacs='/usr/bin/xemacs21'
 alias xemacsb='xemacs -bg azure'
 alias xemacsy='xemacs -bg lightyellow'
 alias xemacsg='xemacs -bg "#e0ffe0"'
 alias xemacsr='xemacs -bg "#fff5f5"'

//==============================================================================
** {menu|tool}-barを消す [#y7f4f9fe]
 (tool-bar-mode 0)		; tool bar を表示しない
 (menu-bar-mode 0)		; menu bar を表示しない
 (which-function-mode 1)	; 現在の関数名をモードラインに表示

//==============================================================================
** 行頭に行番号を表示する(モード行ではなく) [#hd23498b]
- linum-mode を使用する(Emacs23以降で有効)
 M-x: linum-mode
- Toggle する関数
 ; 行番号表示をトグル
 ; http://qiita.com/yyamamot/items/df430d4e725ea38ffc9f
 (defun toggle-linum-mode ()
   "toggle display line number"
   (interactive)
   (setq linum-format "%4d ")
   (linum-mode
    (if linum-mode -1 1)))
 (global-set-key [f5]  'toggle-linum-mode)			; linum-mode
- 参考:[[Emacsで行番号表示をトグルする>http://qiita.com/yyamamot/items/df430d4e725ea38ffc9f]]

//==============================================================================
** モードラインに現在カーソルが位置している関数の関数名を表示する [#h095036c]
- モードラインに、現在カーソルがある位置の関数名を動的に表示することが出来る。
 M-x: which-function-mode
- .emacs に設定するには、
 (setq which-function-mode t)

//==============================================================================
** モードラインの現在時刻の表示 [#l41ac910]
- 現在時刻を表示する
 (display-time)
- 24時間表示にする
 (setq display-time-24hr-format t)
- 24時間制・秒も表示する
 (setq display-time-interval 1)
 (setq display-time-string-forms
       ; '((format "%s:%s:%s" 24-hours minutes seconds))
       '((format "%s.%s.%s(%s) %s:%s:%s" day month year dayname 24-hours minutes seconds)) ; ヨーロッパ式
       ; '((format "%s/%s/%s(%s) %s:%s:%s" year month day dayname 24-hours minutes seconds)) ; 日本式
       )
-- 秒の表示は、フォーマットで秒まで指定しただけでは駄目で、表示を更新するインターバルの設定値 display-time-interval を1にする必要がある(この値は、デフォルト値が60、つまり1分となっている為)。

//==============================================================================
** use-package [#use-package]
- 設定を、統一的な分かり易い記述で書けるようにするライブラリ。
- use-package マクロを利用することで、ライブラリのロード、遅延ロード、設定を分かり易く記述出来る。

- 取得元: https://github.com/jwiegley/use-package.git

//==============================================================================
** 参考リンク [#wcfdf2c7]
- [[use-packageで可読性の高いinit.elを書く - Qiita>https://qiita.com/kai2nenobu/items/5dfae3767514584f5220]]
- [[use-packageの使い方 [QumaWiki]>https://www-he.scphys.kyoto-u.ac.jp/member/shotakaha/dokuwiki/doku.php?id=toolbox:emacs:use-package:start]]

//==============================================================================
** Time-stamp [#m59e6eee]
 ; Time-stamp
 ; http://homepage.mac.com/zenitani/elisp-j.html#time-stamp
 (require 'time-stamp)
 (setq time-stamp-start "Last updated: <")	; 開始文字列の設定。通常は "Time-stamp: <>"
 ;; 日本語で日付を入れたくないのでlocaleをCにする
 (defun time-stamp-with-locale-c ()
   (let ((system-time-locale "C"))
     (time-stamp)
     nil))
 (if (not (memq 'time-stamp-with-locale-c write-file-hooks))
     (add-hook 'write-file-hooks 'time-stamp-with-locale-c))
 ; (setq time-stamp-format "%3a %3b %02d %02H:%02M:%02S %Z %:y")
 (setq time-stamp-format "%04y/%02m/%02d %02H:%02M:%02S %Z")	; YYYY/MM/DD HH:MM:SS JST


//==============================================================================
** isearch で、カーソルの位置にある単語を検索対象にする [#t5442189]
- isearch時に、 C-w と打てばOK

//==============================================================================
** shell-mode で制御文字を処理する [#s805f2e5]
 ; shell-mode で制御文字を処理する。
 (autoload 'ansi-color-for-comint-mode-on "ansi-color"
           "Set `ansi-color-for-comint-mode' to t." t)
 (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)


//==============================================================================
** バックアップファイルを作らないようにする [#d7ff8fd4]
 (setq make-backup-files nil)  ; *.~ とかのバックアップファイルを作らない
 (setq auto-save-default nil)  ; .#* とかのバックアップファイルを作らない


//==============================================================================
** 選択領域を [DEL] で一気に消せるようにする [#y95ca8b8]
 ; (setq delete-selection-mode t)
 (delete-selection-mode)

//==============================================================================
** scroll を1行単位にする [#l150a348]
 (setq scroll-step 1)


//==============================================================================
** 分割した window のサイズを変える [#y029a37e]
|~command |~description |~remark |
|M-x: enlarge-window |縦方向にサイズを大きくする | |
|M-x: shrink-window  |縦方向にサイズを小さくする | |
|M-x: enlarge-window-horizontally |横方向にサイズを大きくする | |
|M-x: shrink-window-horizontally |横方向にサイズを小さくする | |

- 参考: emacs25.1.1 では以下のように設定することで、キー割り当てが出来た
 (global-set-key (kbd "M-<up>")    'enlarge-window)
 (global-set-key (kbd "M-<down>")  'shrink-window)
 (global-set-key (kbd "M-<right>") 'enlarge-window-horizontally)
 (global-set-key (kbd "M-<left>")  'shrink-window-horizontally)

- 参考: emacs23 では以下のように設定することで、キー割り当てが出来た
 (global-set-key "M-<up>"    'enlarge-window)
 (global-set-key "M-<down>"  'shrink-window)
 (global-set-key "M-<right>" 'enlarge-window-horizontally)
 (global-set-key "M-<left>"  'shrink-window-horizontally)


//==============================================================================
** ウインドウ自動分割時の制御 [#k8d8ac5a]
- ウインドウが自動分割される際の、垂直分割・水平分割の制御
- 垂直分割を防ぐには、下記を設定する:
 (setq split-width-threshold nil)
- 挙動としては、
++ split-height-threshold の値が選択したウィンドウより小さい場合、下側にウィンドウを分割する。
++ そうでない場合、 split-width-threshold がウィンドウの横幅より小さい場合は、右側に分割する。
++ どちらも満たさず、既にウィンドウが分割されてない場合は、下側にウィンドウを分割することを試みる。


//==============================================================================
** beep 音を消す [#oe941343]
- 以下を設定することで、beep が一切無効になる
 (setq ring-bell-function 'ignore) ; beep を一切無効にする

- 嘗ては、以下の設定でカスタマイズすることが出来たが、emacs 24.4.1 では効かないようである。
-- Visible bell にする
 (setq visible-bell t);; Visual Bell有効(エラー時画面反転)
 ;(setq visible-bell nil);; Visual Bell無効(エラー時ブザー音)
-- beep を鳴らさないようにする
 ; (setq message-beep 'silent)


//==============================================================================
** 今日の日付を挿入する [#af85099b]
 (defun today()
   (interactive)
   (insert (format-time-string "%Y/%m/%d" (current-time))))

//==============================================================================
** 前のウインドウに戻る [#ia6f365e]
 ; XEmacsにはあるが、emacsにはない(!)
 ; http://matome.replore.com/index.php?title=Emacs_Lisp%E3%81%BE%E3%81%A8%E3%82%81
 ; xemacsに合わせて、関数名を backward-other-window に変更。
 ; (defun other-window-backward (&optional n)
 (defun backward-other-window (&optional n)
   "Select nth previous window."
   (interactive "P")
   (other-window (- (prefix-numeric-value n))))

//==============================================================================
** 検索時に大文字・小文字を区別するかしないかの設定 [#case-fold-search]
 (setq default-case-fold-search nil)  ; 大文字・小文字を区別させる(〜emacs23.1)
 (setq case-fold-search nil)          ; 大文字・小文字を区別させる (emacs23.2〜)
- emacs23.2 以降では default-case-fold-search ではなく case-fold-search を使うように推奨されている&br;(see also M-x describe-variable case-fold-search)

//==============================================================================
** ediff の control window を別ウインドウにしないようにする [#ediff]
- X11 環境では、デフォルトではコントロールウインドウが別のウインドウとして表示される。これをコンソール内で ediff を起動したときと同様、同じウインドウ内に表示するには、以下の設定を行う:
- 方法1
++ M-x: customize-group
++ [Ediff Window Setup Function] 行頭の三角をクリックし、詳細を表示する
++ [Value Menu] をクリックし、プルダウンから [Single Frame] を選択
++ バッファ先頭付近の [Apply and Save] をクリックして設定・保存する
- 方法2:以下を設定する:
 ;; コントロール用のバッファを同一フレーム内に表示
 (setq ediff-window-setup-function 'ediff-setup-windows-plain)
 ;; diffのバッファを上下ではなく左右に並べる
 (setq ediff-split-window-function 'split-window-horizontally)

//------------------------------------------------------------------------------
*** 参考リンク [#qd6e9c5e]
- [[同一フレーム内にediffのコントロールバッファを表示>https://yamadawindsurf.blogspot.com/2016/07/ediff.html]]

//==============================================================================
** カレンダーで日本の祝日を表示する [#u4db1263]
- M-x: calendar で表示するカレンダーで日本の祝日を表示する方法。
- japanese-holidays.el を入手する
-- 入手先: https://github.com/emacs-jp/japanese-holidays/blob/master/japanese-holidays.el
- 設定
-- 参考: http://blog.livedoor.jp/tek_nishi/archives/3027665.html
- enmacs 起動時に cl-lib が見つからないと怒られた場合
-- cl-lib.el を入手し、load-path の通っているところに配置する。ちなみに Debian7 では相当するファイルはリポジトリにない模様。自分で取ってきて仕込むこと。
-- 入手先: http://elpa.gnu.org/packages/cl-lib.html



////////////////////////////////////////////////////////////////////////////////
* helm [#helm]

** 入手先 [#s31bbdeb]
- [[GitHub: emacs-helm/helm>https://github.com/emacs-helm/helm]]

** 参考リンク [#g7fffd17]
- [[初心者〜初級者のためのEmacs-Helm事始め : 前編>https://qiita.com/jabberwocky0139/items/86df1d3108e147c69e2c]]
- [[【Emacs】helmを使う>https://www.yokoweb.net/2017/01/20/emacs-helm-mode/]]



////////////////////////////////////////////////////////////////////////////////
* emacs のローカルビルド [#i3fe752c]
+ 最新のコードを取得する
-- この項の執筆時点の最新は 27.1
 http://ftp.jaist.ac.jp/pub/GNU/emacs/emacs-27.1.tar.xz
-- 又は、開発リポジトリから取得する
 git://git.savannah.gnu.org/emacs.git
// git clone git://git.sv.gnu.org/emacs.git
--- 開発リポジトリから取得した場合は、 tag で checkout してから使う
 $ git checkout refs/tags/emacs-27.1
~
+ ビルドに使うパッケージをインストールする
 # apt-get install xaw3dg-dev xaw3dg libjpeg-dev libpng-dev libgif-dev libtiff-dev texinfo
-- gtk3 ToolKit を使う場合は、以下もインストールする
 libgtk-3-dev
+ ビルドする
 $ ./configure
 ここでエラーが出る場合、「こういうオプションをつけろ」というメッセージが出るので、それに従う。今回の環境では ''--with-gnutls=no'' が必要だった。
 $ ./configure --with-gnutls=no
 $ make



////////////////////////////////////////////////////////////////////////////////
* 参考リンク [#links]
- [[るびきち「日刊Emacs」>http://rubikitch.com/]]
- [[Programming in Emacs Lisp [ja]>http://www.math.s.chiba-u.ac.jp/~matsu/lisp/emacs-lisp-intro-jp.html]]
- [[Meadow/Emacs memo>http://www.bookshelf.jp/soft/meadow.html#SEC_Top]]
- [[Emacs 活用法>http://www.math.s.chiba-u.ac.jp/~matsu/emacs/emacs21/index.html]]
- [[navi.el(関数の一覧表示とジャンプ)>http://www.ne.jp/asahi/love/suna/pub/soft/navi.el/index.html]]
-- fume-mode.el は XEmacsでしか使えないが、これはemacsで使える。
- [[Emacs Lispまとめ>http://matome.replore.com/index.php?title=Emacs_Lisp%E3%81%BE%E3%81%A8%E3%82%81]]
- [[CEDET>http://sourceforge.jp/projects/sfnet_cedet/]]
- [[Undo-tree.el>http://www.emacswiki.org/emacs/UndoTree]]


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS