マウスホイールによる連続スクロールのスピードを調節 on Emacs

マウスホイールにより連続スクロールすると画面がどんどん飛んでしまうので、それを抑制する設定。

(global-set-key [mouse-5] '(lambda () "" (interactive) (scroll-up 1)))
(global-set-key [mouse-4] '(lambda () "" (interactive) (scroll-down 1)))
(global-set-key [double-mouse-5] '(lambda () "" (interactive) (scroll-up 1)))
(global-set-key [double-mouse-4] '(lambda () "" (interactive) (scroll-down 1)))
(global-set-key [triple-mouse-5] '(lambda () "" (interactive) (scroll-up 2)))
(global-set-key [triple-mouse-4] '(lambda () "" (interactive) (scroll-down 2)))
(global-set-key [wheel-down] '(lambda () "" (interactive) (scroll-up 1)))
(global-set-key [wheel-up] '(lambda () "" (interactive) (scroll-down 1)))
(global-set-key [double-wheel-down] '(lambda () "" (interactive) (scroll-up 1)))
(global-set-key [double-wheel-up] '(lambda () "" (interactive) (scroll-down 1)))
(global-set-key [triple-wheel-down] '(lambda () "" (interactive) (scroll-up 2)))
(global-set-key [triple-wheel-up] '(lambda () "" (interactive) (scroll-down 2)))

summarye.elの設定 改訂版

かつてsummarye.elの設定に関する記事を書いたことがあるが、今回いくつか見直した。

display-line-numbers-modeによる行番号の表示を止めた。これをしないと行番号がsummarye由来ものと合わせて2重に行番号が表示されるからである。またサマリがポップアップする位置とサイズをshackleにより制御した。つねにframeの半分以上を占拠してポップアップするsummaryeデフォルトの挙動が不満だったからである。

(eval-when-compile (require 'summarye)
                   (require 'view)
                   (require 'shackle))
(declare-function View-quit "view")

;; fで当該バッファのサマリ位置にジャンプ
;; SPCでカーソル位置のサマリをプレビュー
;; nでプレビューしながら次のサマリを表示
;; bでプレビューしながら前のサマリを表示
;; dでサマリ一覧から削除
;; gでリロード、削除したサマリも復活
;; mでマーク

(autoload 'se/make-summary-buffer "summarye" nil t)
(autoload 'socuur "summarye" nil t)

(define-key help-map "M" 'se/make-summary-buffer)

(defun se/quit-summary-item ()
  "Quit summary."
  (interactive)
  (view-mode 1)
  (View-quit))

(defvar summary-edit-summary-mode-hook nil)
(add-hook 'summary-edit-summary-mode-hook
          #'(lambda ()
              ;; 行番号の表示を止める
              (display-line-numbers-mode -1)

              (define-key summary-edit-mode-map (kbd "q") 'se/quit-summary-item)))

(with-eval-after-load "shackle"
  (add-to-list 'shackle-rules
               '("^function-in-.*" :regexp t :align right :ratio 0.3))
  (add-to-list 'shackle-rules
               '("^Items-in-.*" :regexp t :align right :ratio 0.3)))

バイトコンパイル時の警告を抑制した修正版summarye.elのコードはこちらから。

EmacsにおけるLaTeX執筆環境構築(2)LaTeXのlanguage serverであるtexlabをeglotから使う

はじめに

LaTeXにもlanguage serverがあると聞いて、早速インストールを試してみたときの記録。そのlanguage serverとはtexlabである。これをEglotによりEmacs上から使うのが目的である。

実行環境

手順

texlabの公式を見ると、Rustをインストールせよ、とのことなのでインストール。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

その後、以下のコマンドでインストールが完了するのでお手軽。

cargo install texlab


githubから最新ソースコードをダウンロードして、コンパイルする方法もある。

texlabのマスターブランチをcloneする(cloneの場所はお好みで)。

 git clone https://github.com/latex-lsp/texlab.git

texlab/crates/srcにcdする。

 cd texlab/crates/esrc

ビルドする。

cargo build --release

texlab/target/release/texlabが目当てのバイナリである。これをPATHの通った場所に置く(例えば/usr/local/bin)。

コピーが終わったら余分なものは消しておくとディスクスペースの節約になる。ただしtargetフォルダもすべて消えるので注意。

cargo clean

Emacsの設定

Emacsでlanguage serverを扱うためにEglotを使うことにする。EglotはEmacsのパッケージシステムからインストールできる。

M-x package-install RET eglot RET

Eglotの設定は以下。Eglotはデフォルトでdigestifという別のtex用language serverの設定が入っているので、最初にそれを取り除きtexlabの設定で置き換える。

(require 'eglot)

;; AUCTeXで使う設定
(add-hook 'TeX-mode-hook 'eglot-ensure)
;; digestifの設定を取り除く
(delete (assoc '(tex-mode context-mode texinfo-mode bibtex-mode)
               eglot-server-programs) eglot-server-programs)
;; texlabの設定を追加する
(add-to-list 'eglot-server-programs
             '((latex-mode tex-mode context-mode
                           texinfo-mode bibtex-mode) . ("texlab")))

またLaTeXの編集モードにはAUCTeXを使っている。YaTeXユーザならばyatex-mode-hookにeglot-ensureを引っ掛ければよいだろう。

EmacsにおけるLaTeX執筆環境構築(1)AUCTeXの設定と使い方について

Emacs上でLaTeXを編集するときに便利なパッケージの一つとしてAUCTeXが知られている。本記事は設定と使い方を備忘録として残すのが主旨である。

TeXのインストール

TeX Wikiを参考にするとよい。Emacs上で執筆するならばscheme-small (BasicTeX)とcollection-langjapaneseをインストールするのが良いだろう。

AUCTeXのインストール

M-x package-install RET auctex RET

とするか、もしくは

M-x list-packages RET

からauctexを選択する。

設定

Emacsの設定

日本語文章の執筆を前提とする。またPDFビューワーにはpdf-toolsを使用していることに注意。使用するビューワーは各自の好みで選択し、その設定を変えることができる。

コードを表示する
gist.github.com

latexmkの設定

もしlatexmkを利用する場合は、.latexmkrcを設定して~/.latexmkrcなどに保存したうえで実行するのが良い。以下の.latexmkrcはdviを経由するタイプである。

uplatexを用いる場合は以下の設定を参考に。

#!/usr/bin/env perl

$latex  = "uplatex -halt-on-error -interaction=nonstopmode -file-line-error %O %S";
$bibtex = 'upbibtex %O %S';
$biber = 'biber --bblencoding=utf8 -u -U --output_safechars %O %S';
$makeindex = 'mendex %O -o %D %S';
$dvipdf = 'dvipdfmx %O -o %D %S';

$pdf_mode = 3;
$max_repeat = 5;

platexを用いる場合は以下の設定を参考に。

#!/usr/bin/env perl

$latex  = "platex -kanji=utf8 -halt-on-error -interaction=nonstopmode -file-line-error %O %S";
$bibtex = 'pbibtex -kanji=utf8 %O %S';
$biber = 'biber --bblencoding=utf8 -u -U --output_safechars %O %S';
$makeindex = 'mendex %O -o %D %S';
$dvipdf = 'dvipdfmx %O -o %D %S';

$pdf_mode = 3;
$max_repeat = 5;

もしtexから直接pdfを生成する場合の設定例は以下。$pdf_modeを1にすることが重要である。

#!/usr/bin/env perl

# texからpdfを直接生成 (pdflatex)
$pdf_mode = 1;

$bibtex = 'upbibtex %O %S';
$makeindex = 'umendex %O -o %D %S';
$pdf_previewer = "evince %S";
$max_repeat = 5;

ただし日本語文章でpdflatexを通す場合はBXjscls パッケージなどを併用するとよい。

\documentclass[pdflatex, ja=standard]{bxjsarticle}  %ほかはa4paperなどがオプションに入る

設定の参考にしたサイト

解説と補足

AUCTeXの公式情報

ホームページは以下のサイトである。
www.gnu.org

また最新のソースコードは以下のサイトから確認できる。

AUCTeXの設定の情報源

AUCTeX Wikiに多くの情報が集約されており、まずはここに書いてある設定を参考にしながら自身の設定ファイルに追記していくのがよい。

使い方

コンパイルからPDF表示まで

AUCTeX Wikiを参考に、よく使うものをテーブルにリストする。

  • コマンド起動
入力 機能
C-c C-c コマンドの選択メニューを表示(処理対象範囲:文書全体)
C-c C-r コマンドの選択メニューを表示(処理対象範囲:リージョン)
C-c C-b コマンドの選択メニューを表示(処理対象範囲:カレントバッファ)

C-c C-cの「文書全体」とは、例えばファイル分割している場合にそれらをすべて取り込む形を指す。C-c C-bはカレントバッファ(=現在編集中のバッファ)のみが処理対象となる。

  • コマンド例(C-c C-cの場合)
メニュー 入力例 機能
LaTeX C-c C-c latex 指定された TeX エンジン (TeX-engine)でタイプセット
BibTeX C-c C-c bibtex bibtex の実行(文献データベースの更新)
Dvipdfmx C-c C-c dvipdfmx dvipdfmx の実行
View C-c C-c view プレビュー
Clean C-c C-c clean 中間ファイル (.log .aux etc...) の削除
Clean All C-c C-c clean all 中間ファイル及び dvi ps pdf の削除

上記はC-c C-c経由でコマンドを発動した場合の例である。個々のコマンドの機能はC-c C-rC-c C-bでも同じである。

  • その他
入力 機能
C-c C-v プレビューの起動(Viewのショートカット起動)
C-c C-a タイプセット、(文献DB更新、)dvipdfmx、プレビューを順に実行
C-c C-l タイプセット処理を表示

基本となるのは

1. "LaTeX"によりタイプセットコンパイル)→texソースからpdfファイルを生成
2. "View"によりpdfを開く

という処理の流れである。 これを使う場合,texソースに\usepackage[pdftex]{graphicx}を書いておくべし。

dviを経由する場合,代わりに\usepackage[dvipdfmx]{graphicx}texソースに記入し、

(setq TeX-PDF-from-DVI "Dvipdfmx")

の設定を追記しておく。処理の流れは以下の通り。

1. "LaTeX"によりタイプセットコンパイル)→texソースからdviファイルを生成
2. "Dvipdfmx"によりdviからpdfを生成
3. "View"によりpdfを開く

文章中で参考文献を引用している場合は1と2の間にBibTeXが入る。

1. "LaTeX"によりタイプセット
2. "BiBTeX"により文献データベースを更新 →bibファイルからbblファイルを生成
3. "LaTeX"によりもう一度タイプセットtexソースからdviファイルを生成
4. "Dvipdfmx"によりdviからpdfを生成
5. "View"によりpdfを開く

編集中に便利なキーバインドスニペット

以下は多用するキーバインドである。

入力 機能
C-c C-e LaTeX環境(\begin{...} \end{....})を選択的に挿入
C-c C-s セクション関係(\section{}や\subsection)を選択的に挿入
C-c ] LaTeX環境を閉じる(\end{...} をのみ挿入)
C-c ; リージョンをコメントアウト
C-c % カーソル最寄りの段落をコメントアウト
C-c * カーソルに最寄りのセクション関係をマーク
C-c . カーソルに最寄りのLaTeX環境をマーク


yasnippetユーザならば、多くのスニペットLaTeX用に提供されるので、使ってみるとよい。上記のキーバインドがあれば十分かもしれないが、どちらも便利なので併用している。

latexmkについて

latexmkを用いて PDF をコマンド一つで生成するという主旨の記事がある。同記事では"auctex-latexmk"というパッケージが件の機能を提供するものとして紹介されている。本記事で紹介している設定ではauctex-latexmk関連をコメントアウトしてある。利用はお好みで。

日本語対応のエンジンの例としてLuaTeX-jaが知られている。LuaTeX-jaを用いるとpdflatexでなくともtexからpdfを直接生成できるので便利に使える。ほか、LuaTeXを用いるメリットとして、フォント周りの設定がしやすいことが挙げられる。詳細は別の記事で紹介する予定である。

latexmkを保存と同時に走らせる場合は以下の記事で紹介した設定を追記する。

インラインプレビューについて

AUCTeXでは数式や画像のインラインプレビューが可能である。対象となる数式はpng画像に変換されてEmacs上でプレビューされる。以下は主なキーバインドである。C-c C-p(pはpreviewの意味)から始まるので比較的覚えやすい。

入力 機能
C-c C-p C-d マスタ文書のプレビュー開始
C-c C-p C-c C-d 文書全体のプレビュー終了
C-c C-p C-b カレントバッファのプレビュー開始
C-c C-p C-c C-b カレントバッファのプレビュー終了
C-c C-p C-p ポイント位置のプレビュー開始
C-c C-p C-c C-p ポイント位置のプレビュー終了
C-c C-p C-e LaTeX環境で囲まれた部分のプレビュー開始
C-c C-p C-c C-e LaTeX環境で囲まれた部分のプレビュー終了
C-c C-p C-s セクションのプレビュー開始
C-c C-p C-c C-s セクションのプレビュー終了

参考

以下は本記事の続編である。
tam5917.hatenablog.com

tam5917.hatenablog.com

Emacs27で"Package cl is deprecated"を抑制する方法

起動直後

early-init.elの先頭に以下を記述する。

(setq byte-compile-warnings '(cl-functions))

設定ファイルなどをバイトコンパイルするとき

以下の設定を追記する。

(eval-when-compile (setq byte-compile-warnings '(cl-functions)))

Emacsで補完入力を行うCompany-modeの設定 2021

はじめに

Emacsで補完入力を行うためのパッケージとしてcompany-modeがよく知られている。
本記事ではこの設定を紹介し、備忘録として残しておく。

設定

以下の設定を適用する。

コードを表示する

;; -*- mode: emacs-lisp; coding: utf-8

;; 主なデフォルトのキーバインド
;;
;; M-n 次の候補選択
;; M-p 前の候補選択
;; C-g 候補選択中止
;; RET 候補選択
;; F1, C-h docを別バッファに表示
;; C-w 定義場所を表示 (関数)
;; C-s 候補検索; 表示されている範囲で入力クエリにより候補選択 (modelineが変化する)
;; C-M-s 候補フィルタリング
;; [tab] 共通するprefixを挿入

;; C-sやC-M-sは忘れがちだが使うと便利

(require 'company)
(add-hook 'after-init-hook 'global-company-mode)

(setq company-idle-delay 0.3)
(setq company-minimum-prefix-length 2)

;; キー設定
(define-key company-active-map (kbd "C-n") 'company-select-next)
(define-key company-active-map (kbd "C-p") 'company-select-previous)
(define-key company-active-map (kbd "M-n") nil)
(define-key company-active-map (kbd "M-p") nil)
(define-key company-active-map (kbd "C-m") 'company-complete-selection)

;; 候補に番号を付け、
;; M-1やM-2などM-をつけて押すことで候補選択をショートカットできる
(setq company-show-numbers t)

;; 候補の一番下でさらに下に行こうとすると一番上に戻る
(setq company-selection-wrap-around t)

;; ツールチップ上の候補を右揃え
(setq company-tooltip-align-annotations t)

;; 参考 https://qiita.com/zk_phi/items/9dc373e734d20cd31641
;; シンボルの途中部分を補完する
;; → company にはこの挙動が実装されておらず、カーソルの直後に (空白以外
;; の) 文字がある場合は補完が始まらないため
(require 'company-anywhere)

;; 参考 https://qiita.com/zk_phi/items/9dc373e734d20cd31641
;; ac-dwim時の挙動をcompanyで再現
(require 'company-dwim)
(define-key company-active-map (kbd "TAB") 'company-dwim)
(setq company-frontends
      '(company-pseudo-tooltip-unless-just-one-frontend
        company-dwim-frontend
        company-echo-metadata-frontend))

;; 参考 https://qiita.com/zk_phi/items/9dc373e734d20cd31641
;; company-require-match
;; - never: 補完候補の選択を開始後、補完候補にない文字も打てる
(setq company-require-match 'never)

;; 参考 https://qiita.com/zk_phi/items/9dc373e734d20cd31641
;; 『これは「現在編集中のバッファ、またはそのバッファと同じメジャーモー
;; ドになっているバッファ」から補完候補を探してきてくれるものです。』
(require 'company-same-mode-buffers)
(company-same-mode-buffers-initialize)
(setq company-backends
      `(
        company-dabbrev
        company-capf
        company-semantic
        company-cmake
        company-clang
        company-files

        ;; https://qiita.com/zk_phi/items/9dc373e734d20cd31641
        ;; 「組み込みのキーワードも words-in-same-mode-buffers
        ;; の候補もみんないっしょくたに出てくる」
        ;; (company-keywords :with company-same-mode-buffers)

        (company-dabbrev-code company-gtags company-etags
                              company-keywords)
        company-oddmuse
        company-bbdb
        ,@(unless (version< "24.3.51" emacs-version)
            (list 'company-elisp))
        ,@(unless (version<= "26" emacs-version)
            (list 'company-nxml))
        ,@(unless (version<= "26" emacs-version)
            (list 'company-css))
        ))
(push 'company-same-mode-buffers company-backends) ;先頭に追加

;; lowercaseのみで補完されるのを抑制する(case sensitive)
(eval-when-compile (require 'company-dabbrev))
(setq company-dabbrev-downcase nil)

;; 参考 https://shwaka.github.io/2017/05/03/company-dabbrev-japanese.html
;; company-dabbrevで日本語文字が補完候補に含まれないようにする
(defun edit-category-table-for-company-dabbrev (&optional table)
  (define-category ?s "word constituents for company-dabbrev" table)
  (let ((i 0))
    (while (< i 128)
      (if (equal ?w (char-syntax i))
          (modify-category-entry i ?s table)
        (modify-category-entry i ?s table t))
      (setq i (1+ i)))))
(edit-category-table-for-company-dabbrev)
(setq company-dabbrev-char-regexp "\\cs")

;; company-same-mode-buffers.elにおいて "\\sw"が使用されている箇所を "\\cs"に変更する
;; →日本語文字が補完候補に含まれることを抑制する効果
(defun company-same-mode-buffers-query-construct-any-followed-by (str)
  (cons "\\(?:\\cs\\|\\s_\\)*?" (regexp-quote str)))
(defun company-same-mode-buffers-query-construct-any-word-followed-by (str)
  (cons "\\cs*?" (regexp-quote str)))
(defun company-same-mode-buffers-query-to-regex (lst)
  "Make a regex from a query (list of `query-construct-*' s)."
  (concat "\\_<"
          (mapconcat (lambda (pair) (concat (car pair) "\\(" (cdr pair) "\\)")) lst "")
          "\\(?:\\s_\\|\\cs\\)*"))
(defun company-same-mode-buffers-update-cache (&optional buffer)
  "Put all symbols in the buffer into
`company-same-mode-buffers-cache'."
  (with-current-buffer (or buffer (current-buffer))
    (when (and company-same-mode-buffers-cache-is-dirty
               (derived-mode-p 'prog-mode))
      (let ((tree (gethash major-mode company-same-mode-buffers-cache))
            (symbols (company-same-mode-buffers-search-current-buffer
                      (concat "\\(:?+\\cs\\|\\s_\\)\\{"
                              (number-to-string company-same-mode-buffers-minimum-word-length)
                              ","
                              (number-to-string company-same-mode-buffers-maximum-word-length)
                              "\\}"))))
        (dolist (s symbols)
          (setq tree (company-same-mode-buffers-tree-insert tree s)))
        (puthash major-mode tree company-same-mode-buffers-cache)
        (setq company-same-mode-buffers-cache-is-dirty nil)))))

;; 参考 https://qiita.com/sune2/items/b73037f9e85962f5afb7#company-transformers
;; 補完候補のソート。nilが辞書順
(setq company-transformers
      '(company-sort-by-occurrence company-sort-by-backend-importance))

;; prescientのアルゴリズム
;; - 直近の選択を上位に移すソーティング
;; - 直近の選択を履歴として保存する
(require 'company-prescient)
(company-prescient-mode 1)
;; →company-transformersに prescient由来のものを追加

;; companyで英単語を補完するためのcompany-wordfreq →MELPAからダウンロード
;; 専用の単語辞書をダウンロードするため以下のコマンドを実行しておく
;; M-x company-wordfreq-download-list
(add-hook 'text-mode-hook (lambda ()
                            (setq-local company-backends
                                        '(company-wordfreq
                                          company-dabbrev
                                          company-capf))
                            (setq-local company-transformers nil)))

;; irony C/C++
(require 'company-irony-c-headers)
(setq company-backends (append company-backends '(company-irony-c-headers)))
(setq company-backends (append company-backends '(company-irony)))
(setq company-backends (append company-backends '(company-reftex-labels)))
(setq company-backends (append company-backends '(company-reftex-citations)))

(provide 'init-company)


補足

zk_phi氏の以下の記事を参考にした部分は多い。
qiita.com
同氏の記事では候補のソーティングにcompany-statisticsが使われていたが、本記事ではcompany-prescientを採用した。

また、company-dabbrevで日本語文字が補完候補に含まれないようにするための設定では以下の記事を参考にした。
shwaka.github.io
この記事で導入された正規表現”\\\cs”をzk_phi氏謹製のcompany-same-mode-buffers.elにも適用し、日本語文字の候補出現を抑制する。このため一部の関数を再定義した。

英単語をcompanyで補完するために、company-wordfreqの設定も入れてある。


おわりに

ひとまず快適に使えているので良しとする。

EmacsからJupyter Notebookを触るための設定

はじめに

Emacsのeinというパッケージを用いることで、EmacsからJupyter Notebookを編集し、表示することができる。
実行イメージは以下の通りである。

Emacsから直接Jupyter Notebookが編集できるので、ブラウザにはない各種補完機能やカーソルジャンプ、undoなど充実したEmacsの編集機能を継承して使えるので便利ということである。

本記事ではその設定をメモしておく。

事前準備

1. jupyterをインストール

pip3 install jupyter

2. MELPAからeinをインストール(必須)

M-x package-install RET ein RET

設定

(eval-when-compile
  (require 'ein)
  (require 'ein-notebook)
  (require 'ein-notebooklist)
  (require 'ein-markdown-mode)
  (require 'smartrep))

;; (add-hook 'ein:notebook-mode-hook 'electric-pair-mode) ;; お好みで
;; (add-hook 'ein:notebook-mode-hook 'undo-tree-mode) ;; お好みで

;; undoを有効化 (customizeから設定しておいたほうが良さげ)
(setq ein:worksheet-enable-undo t)

;; 画像をインライン表示 (customizeから設定しておいたほうが良さげ)
(setq ein:output-area-inlined-images t)

;; markdownパーサー
;; M-x ein:markdown →HTMLに翻訳した結果を*markdown-output*バッファに出力
(require 'ein-markdown-mode)

;; pandocと markdownコマンドは入れておく
;; brew install pandoc
;; brew install markdown
(setq ein:markdown-command "pandoc --metadata pagetitle=\"markdown preview\" -f markdown -c ~/.pandoc/github-markdown.css -s --self-contained --mathjax=https://raw.githubusercontent.com/ustasb/dotfiles/b54b8f502eb94d6146c2a02bfc62ebda72b91035/pandoc/mathjax.js")

;; markdownをhtmlに出力してブラウザでプレビュー
(defun ein:markdown-preview ()
  (interactive)
  (ein:markdown-standalone)
  (browse-url-of-buffer ein:markdown-output-buffer-name))

;; smartrepを入れておく。
;; C-c C-n C-n C-n ... で下のセルに連続で移動、
;; その途中でC-p C-p C-pで上のセルに連続で移動など
;; セル間の移動がスムーズになってとても便利
(declare-function smartrep-define-key "smartrep")
(with-eval-after-load "ein-notebook"
  (smartrep-define-key ein:notebook-mode-map "C-c"
    '(("C-n" . 'ein:worksheet-goto-next-input-km)
      ("C-p" . 'ein:worksheet-goto-prev-input-km))))

実行手順

1. M-x ein:run を実行
Notebookを作成したいディレクトリを選択できるようになる。ディレクトリを決定するとJupyterがバックグラウンドで起動する。

2. カーネルを選択
要するにPythonのバージョン指定。

3. ファイル/ノートブック一覧から、ノートブックのところの[Open]をRET
既存のNotebookが起動する。

4. Notebook新規作成は[New Notebook]をRET

使い方

主なキーバインドとコマンド一覧を以下に示す。

とりあえず、セルに何か書いたらC-c C-cすれば、セルが評価される。

キーバインド/コマンド 説明
M-x ein:run jupyterを起動
C-c C-t 当該セルの評価モードをPython->MarkDown->rawの順に切り替える
C-c C-n 1つ下のセルに移動
C-c C-p 1つ上のセルに移動
C-c C-e 当該セルの表示をトグル
C-c C-c 当該セルを評価(Pythonのみ; Markdownは不可) →C-uをつけて実行するとすべてのセルを先頭から評価できる
C-c C-k 当該セルを削除
C-c C-a 新規セルを当該セルの上に作成 (C-uを先につけるとMarkdownで作成)
C-c C-b 新規セルを当該セルの下に作成 (C-uを先につけるとMarkdownで作成)
C-c C-s 当該セルを分割(split)
C-c C-m 当該セルをマージ(merge)
C-c C-l 当該セルの出力をクリア
C-c C-S-l 全てのセルの出力をクリア
C-x C-s 現在のnotebookを保存
C-x C-w 現在のnotebookを別名保存
M-x ein:notebook-save-to-command 当該ノートのコピーを、名前を付けて保存
C-c C-x C-r notebookのセッションを再起動する →番号をクリアしたいときに使う
M-x ein:stop jupyterを終了

Markdownのプレビューには、設定ファイルに書いた ein:markdown-preview を使うことでブラウザ上のプレビューが可能である。応用すればewwやemacs-w3m上で表示させ、Emacs内で完結させることもできるだろう。

おまけ:Einにおける数式表示

Markdown中にLatexで記述した数式をプレビューするための設定。インライン表示ではない。
実行イメージはこちら:


設定

M-x my-markdown-preview-latexとするとバッファがポップアップして、そこに数式が表示される。

(defun my-markdown-preview-latex ()
  "Preview LaTeX from the current cell in a separate buffer.

Handles only markdown and code cells, but both in a bit different
ways: on the former, its input is being rendered, while on the
latter - its output."
  (interactive)
  (let* ((cell (ein:worksheet-get-current-cell))
         (text-to-render
          (cond ((ein:markdowncell-p cell) (slot-value cell :input))
                ((ein:codecell-p cell)
                 (plist-get (car (cl-remove-if-not
                                  (lambda (e) (string= (plist-get e :name) "stdout"))
                                  (slot-value cell :outputs)))
                            :text))
                (t (error "Unsupported cell type"))))
         (buffer (get-buffer-create " *ein: LaTeX preview*")))
    (with-current-buffer buffer
      (when buffer-read-only
        (read-only-mode -1))
      (unless (= (point-min) (point-max))
        (delete-region (point-min) (point-max)))
      (insert text-to-render)
      (goto-char (point-min))
      (org-mode)
      (org-toggle-latex-fragment 16)
      (special-mode)
      (unless buffer-read-only
        (read-only-mode 1))
      (display-buffer
       buffer
       '((display-buffer-below-selected display-buffer-at-bottom)
         (inhibit-same-window . t)))
      (fit-window-to-buffer (window-in-direction 'below)))))

おわりに

EmacsからJupyter Notebook、一度試してみる価値はあると思う。