SlideShare a Scribd company logo
1 of 37
Download to read offline
Emacs上のターミナルを最強に
伊奈 林太郎
2012-10-20 @ 関西 Emacs#x06
伊奈 林太郎 Emacs 上のターミナルを最強に 1
ターミナル使ってますか?
◮ 素のターミナル
◮ 標準的なターミナルエミュレータ
xterm, gnome-terminal, Terminal.app, ...
◮ マルチプレクサ
screen, tmux, ...
◮ ssh といっしょになってるもの
PuTTY, Tera Term, ...
◮ Emacs 上
term.el
◮ 使ってない
eshell.el, ...
◮ その他
伊奈 林太郎 Emacs 上のターミナルを最強に 2
ターミナル使ってますか?
◮ 素のターミナル
◮ 標準的なターミナルエミュレータ
xterm, gnome-terminal, Terminal.app, ...
◮ マルチプレクサ
screen, tmux, ...
◮ ssh といっしょになってるもの
PuTTY, Tera Term, ...
◮ Emacs 上
term.el
◮ 使ってない
eshell.el, ...
◮ その他
伊奈 林太郎 Emacs 上のターミナルを最強に 2
ターミナルとEmacs
ターミナルエミュレータを使う理由
◮ ncurses アプリもちゃんと動いてほしい
◮ 素の端末を触るときにパニくらない
Emacs との共存
◮ Emacs は別窓で
◮ ウィンドウが増えてうざい
◮ 端末とのコピペが面倒
◮ screenの中で Emacs
◮ キーボードだけでコピペ
◮ Emacs ごと detach
伊奈 林太郎 Emacs 上のターミナルを最強に 3
screenのままならないところ
◮ 改造しにくい
◮ CJK ambiguous width
◮ 問題の切り分けが難しくなる
◮ (X などの) クリップボードとの連携
◮ 面倒なハックが必要
◮ 環境変数の引き渡し
◮ 外部からのコマンド発行で解決 (要開発版)
# この辺は tmux でも同じですね
伊奈 林太郎 Emacs 上のターミナルを最強に 4
すべてEmacsでやる
◮ CJK, クリップボード
なども OK
◮ detach もできる
(emacs --daemon)
◮ Emacs 本体と連携 ⊚
◮ 操作性を一体に
◮ Lisp で改造しまくり
伊奈 林太郎 Emacs 上のターミナルを最強に 5
Emacs内端末エミュレータterm.el
使い方
M-x term, M-x ansi-term
特徴 — 2 つのモード
◮ term-char-mode
◮ 打ったものがそのまま端末へ
◮ term-line-mode
◮ Emacs のバッファに近い編集
しくみ
◮ process-filterで制御シーケンスを解釈
◮ バッファに put-text-propertyしながら表示
伊奈 林太郎 Emacs 上のターミナルを最強に 6
term.elのいけてないところ
◮ キーがほぼすべて端末に持っていかれる
◮ M-x とかきかない
◮ でも ESC とかどっちで認識すべき?
◮ 端末が 1 つしか開けない
(内部的には可能だけどインタフェースが無い)
◮ 色が 8 色しかない
◮ term-line-modeがちょっと貧弱
◮ コードがレガシーで拡張しにくい
◮ 関数がでかい
◮ hook も少ない
◮ 遅い
伊奈 林太郎 Emacs 上のターミナルを最強に 7
term+.el — term.elを強化する
主な機能
◮ 256 色対応 / xterm 互換性向上
◮ キーバインド強化
◮ 編集機能の強化
◮ ログ機能
◮ マルチプレクサ (+ マルチセッション)
◮ シェル連携強化
伊奈 林太郎 Emacs 上のターミナルを最強に 8
term+.elをとりあえず使ってみる
ダウンロード → 真っ新な状態でのお試し
° git clone git://github.com/tarao/term-plus-all.git
° cd term-plus-all
° git submodule update --init
° make emacs # or make term
# or make EMACS=emacs-snapshot term
注意点
◮ Emacs 24.1.50 で開発してます
◮ 22 はサポートしません
◮ 23 は細かいところが不安定かも
◮ 24.2 はおそらく OK
◮ 24.3 (24.2.50) の term.elの変更には未対応
伊奈 林太郎 Emacs 上のターミナルを最強に 9
デモ
伊奈 林太郎 Emacs 上のターミナルを最強に 10
term+.el — term.elを強化する
主な機能
◮ 256 色対応 / xterm 互換性向上
◮ キーバインド強化
◮ 編集機能の強化
◮ ログ機能
◮ マルチプレクサ (+ マルチセッション)
◮ シェル連携強化
伊奈 林太郎 Emacs 上のターミナルを最強に 11
256色対応 / xterm互換性
(require ³xterm-256color)
256 色対応
◮ 256 色表示の制御シーケンスの解釈を実装
◮ ついでに斜体 , 取り消し線等にも対応
◮ 原理的には 24bit 色に対応可能 (cf. Konsole)
(24bit 色表示しようとするアプリはあるのか?)
xterm 互換性 (TERM=xterm-256color)
◮ TERM=eterm-256colorを定義すればよい?
◮ たいていのアプリは terminfo なんか見てない
◮ xterm を騙れば 256 色表示しようとしてくれる
◮ 騙るからには xterm 制御シーケンスを処理 (不完全)
伊奈 林太郎 Emacs 上のターミナルを最強に 12
term+.el — term.elを強化する
主な機能
◮ 256 色対応 / xterm 互換性向上
◮ キーバインド強化
◮ 編集機能の強化
◮ ログ機能
◮ マルチプレクサ (+ マルチセッション)
◮ シェル連携強化
伊奈 林太郎 Emacs 上のターミナルを最強に 13
キーバインド強化 [1/2]
(require ³term+)
端末に奪わせないキーを定義
◮ term+char-mapに 
define-key
定義 するだけ
(multi-term.elでもできますね)
◮ 定義済みのキー (M-x des-fun, term-char-mode)
C-q 後続のキーをそのまま端末に渡す
C-y 端末へ貼り付け
M-RET 編集モード (term-line-mode)へスイッチ
ESC 端末へ ESC を送る
C-c 0.5 秒間何も入力がなければ端末へ C-c
直後に何か入力すればプレフィックスキー
◮ Emacs 本体で実行 (nil をマップ): M-x, M-:, C-x
伊奈 林太郎 Emacs 上のターミナルを最強に 14
キーバインド強化 [2/2]
(require ³key-intercept)
後続のキーがあるかどうかで意味が違う!
ESC 端末へ ESC を送る
M-x ふつうの M-x
C-c 0.5 秒間何も入力がなければ端末へ C-c
直後に何か入力すればプレフィックスキー
実装: key-intercept.el
◮ https://github.com/tarao/key-intercept-el
◮ プレフィックスキーにもコマンドを割り当てる
http://d.hatena.ne.jp/tarao/20120427/1335527960
伊奈 林太郎 Emacs 上のターミナルを最強に 15
term+.el — term.elを強化する
主な機能
◮ 256 色対応 / xterm 互換性向上
◮ キーバインド強化
◮ 編集機能の強化
◮ ログ機能
◮ マルチプレクサ (+ マルチセッション)
◮ シェル連携強化
伊奈 林太郎 Emacs 上のターミナルを最強に 16
編集機能強化 [1/2]
(require ³term+)
編集モード (term-line-mode)中は
◮ 入力フィールド外では読取専用
◮ SPC で選択開始
もう一度 SPC で範囲コピー → 編集モード終了
◮ RET, ESC で編集モード終了
◮ 入力フィールド内ではふつうのバッファ
◮ ただし RET で端末に送信
◮ ふつうの改行は C-j
◮ 別のメジャーモードにもできる
e.g. シェルのプロンプトに sh-modeで入力
伊奈 林太郎 Emacs 上のターミナルを最強に 17
編集機能強化 [1/2]
(require ³term+)
編集モード (term-line-mode)中は
◮ 入力フィールド外では読取専用
◮ SPC で選択開始
もう一度 SPC で範囲コピー → 編集モード終了
◮ RET, ESC で編集モード終了
◮ 入力フィールド内ではふつうのバッファ
◮ ただし RET で端末に送信
◮ ふつうの改行は C-j
◮ 別のメジャーモードにもできる
e.g. シェルのプロンプトに sh-modeで入力
伊奈 林太郎 Emacs 上のターミナルを最強に 17
編集機能強化 [2/2]
(require ³multi-mode-util)
入力フィールドだけ別モード
◮ あらかじめどのモードにするか指定 (後述)
◮ 編集モードに入ると 
indirect buffer
間接バッファ を作成
◮ multi-mode.el
http://www.loveshack.ukfsn.org/emacs/multi-mode.el
◮ multi-mode-util.el
https://github.com/tarao/multi-mode-util
伊奈 林太郎 Emacs 上のターミナルを最強に 18
term+.el — term.elを強化する
主な機能
◮ 256 色対応 / xterm 互換性向上
◮ キーバインド強化
◮ 編集機能の強化
◮ ログ機能
◮ マルチプレクサ (+ マルチセッション)
◮ シェル連携強化
伊奈 林太郎 Emacs 上のターミナルを最強に 19
ログ機能
(require ³term+)
term-start-output-log
◮ term.elに元からある (ほぼデバッグ用)
term+hardcopy (C-c h)
◮ 一画面だけテキスト保存 (追記可)
◮ screenの:hardcopy相当
term+start-buffer-log (C-c l)
◮ いままでの累積テキストを保存
◮ 表示限界 (2048 行) を超えた分も保存
term+start-record (C-c r)
◮ 端末の制御シーケンスを時系列で保存
◮ ttyrec互換 (ttyplayで再生可)
伊奈 林太郎 Emacs 上のターミナルを最強に 20
term+.el — term.elを強化する
主な機能
◮ 256 色対応 / xterm 互換性向上
◮ キーバインド強化
◮ 編集機能の強化
◮ ログ機能
◮ マルチプレクサ (+ マルチセッション)
◮ シェル連携強化
伊奈 林太郎 Emacs 上のターミナルを最強に 21
マルチプレクサ [1/3]
(require ³term+mux)
やりたいこと
◮ 複数の端末をタブ表示
(tabbar.el, emux.elでもできますね)
◮ 編集モード以外のときはモードラインをタブに
◮ セッション (ユーザ/ホストの別) ごとにグループ化
◮ 同一セッションからは 1 つだけバッファ一覧に
◮ セッション内の選択中のタブが代表
◮ 一覧中ではバッファ名ではなくセッション名
伊奈 林太郎 Emacs 上のターミナルを最強に 22
マルチプレクサ [2/3] タブグループ
(require ³term+mux)
実装: tab-group.el
◮ https://github.com/tarao/tab-group-el
◮ 車輪の再発明
◮ tabbar.elでできることはだいたいできる
◮ モードラインにも表示できる
◮ バッファをひとまとめにできる
◮ かっこいいタブ選択 UI
◮ D&D でタブ移動
伊奈 林太郎 Emacs 上のターミナルを最強に 23
マルチプレクサ [3/3] セッション管理
(require ³term+mux)
M-x term+mux-new
◮ 現在のセッションで (or 選択して) 端末を開く
M-x term+mux-new-command
◮ 現在のセッションで指定のコマンドを実行
M-x term+mux-remote-session
◮ ユーザ/ホストを指定してセッションを作成
◮ シェル端末も 1 つ開く
◮ ローカルで root なら sudo する
◮ リモートなら ssh する
伊奈 林太郎 Emacs 上のターミナルを最強に 24
term+.el — term.elを強化する
主な機能
◮ 256 色対応 / xterm 互換性向上
◮ キーバインド強化
◮ 編集機能の強化
◮ ログ機能
◮ マルチプレクサ (+ マルチセッション)
◮ シェル連携強化
伊奈 林太郎 Emacs 上のターミナルを最強に 25
シェル連携
できること
◮ 編集モード
◮ 編集モードでのメジャーモード指定
◮ バッファ内容を引き継いで編集モードへ
◮ ユーザ/ホスト/ディレクトリ通知
◮ ファイル転送 (open / view / get / put)
◮ シェルコマンド履歴選択
◮ マルチプレクサ
◮ タブタイトル設定
◮ cdd (別タブの現在ディレクトリを取得)
方法
◮ 端末内から特殊な制御コマンドを送る
伊奈 林太郎 Emacs 上のターミナルを最強に 26
シェル連携 [1/6] 編集モード
M-i で sh-modeの編集モードへ (zsh)
function switch-to-line-mode-insert () {1
local buf="°BUFFER"2
zle kill-buffer3
zle -R # reset command line4
echo -ne "e]51;mode;sh-modee" > /dev/tty5
echo -ne "e]52;i;°bufe" > /dev/tty6
}7
zle -N switch-to-line-mode-insert8
bindkey ³^[i³ switch-to-line-mode-insert9
参照 https://raw.github.com/tarao/dotfiles/master/.zsh/eterm.zsh
伊奈 林太郎 Emacs 上のターミナルを最強に 27
シェル連携 [2/6] セッション情報
ユーザ名/ホスト名を通知
host= hostname # ホスト名10
echo -ne "e]51;host;°hoste" > /dev/tty11
user= id -run # ユーザ名12
echo -ne "e]51;user;°usere" > /dev/tty13
ディレクトリ通知 (zsh)
function precmd_eterm_cwd () {14
local dir; dir= pwd15
echo -ne "e]51;cd;°dire" > /dev/tty16
}17
typeset -Uga precmd_functions # これは一回だけ18
precmd_functions+=precmd_eterm_cwd19
◮ Emacs 側の default-directoryが変更される
◮ TRAMP でリモートファイルも開ける
伊奈 林太郎 Emacs 上のターミナルを最強に 28
シェル連携 [3/6] ファイル転送
function o() { # シェルで見えてるファイルを開く20
echo -ne "e]51;open;°1e" > /dev/tty }21
function v() { # シェルで見えてるファイルを view-mode で開く22
echo -ne "e]51;view;°1e" > /dev/tty }23
function get() { # シェルで見えてるファイルを手元にコピー24
echo -ne "e]51;get;°1e" > /dev/tty }25
function put() { # シェルで見えてる場所に26
# ファイルを選択してコピー27
echo -ne "e]51;put;e" > /dev/tty }28
◮ セッション情報を通知しておく必要あり
◮ get/put は FTP と同じ向き
◮ put するとミニバッファでファイルを訊く
◮ dired インタフェースでの複数選択も可
伊奈 林太郎 Emacs 上のターミナルを最強に 29
シェル連携 [4/6] 履歴選択
C-r で履歴選択 (zsh)
echo -ne "e]51;histfile;°HISTFILEe" >/dev/tty #一回だけ29
30
function history-search-eterm () {31
local buf="°BUFFER"32
zle kill-buffer33
echo -ne "e]52;h;°bufe" > /dev/tty }34
zle -N history-search-eterm35
bindkey ³^R³ history-search-eterm36
◮ 類似: zsh の履歴検索に anything.elを使う
http://d.hatena.ne.jp/tarao/20100429/1272509893
伊奈 林太郎 Emacs 上のターミナルを最強に 30
シェル連携 [5/6] マルチプレクサ
タブタイトル変更
◮ screen の ekSTR e 形式
◮ tmux の e]2;STRe 形式
参考 https://raw.github.com/tarao/dotfiles/master/.zsh/screen-title.zsh
cdd
◮ 他のタブの pwd に移動する
◮ オリジナルは id:secondlife さん (screen用)
http://d.hatena.ne.jp/secondlife/20080218/1203303528
参照 https://raw.github.com/tarao/dotfiles/master/.zsh/eterm.zsh
伊奈 林太郎 Emacs 上のターミナルを最強に 31
シェル連携 [6/6] カスタマイズ
定義済みの特殊制御コマンドを調べる
◮ M-x des-fun, term-emulate-terminal
◮ M-x term+control-command-list
新しい特殊制御コマンドを定義する
(require ³term+vars)37
(defun my-control-command (text) ...)38
(term+new-control-command39
"START" "END " ³my-control-command)40
例
(defun term+open (files &optional find-file) ...)41
(term+new-control-command42
"033]51;open;" "033" ³term+open)43
伊奈 林太郎 Emacs 上のターミナルを最強に 32
まとめ
Emacs 上でだって端末機能をフルに使いたい!
◮ 256 色対応
◮ xterm 互換性向上
◮ キーバインド
Emacs なのをいいことに魔改造
◮ 編集機能の強化
◮ ログ機能
◮ マルチプレクサをまるごと実装
◮ シェル連携しまくり
伊奈 林太郎 Emacs 上のターミナルを最強に 33
参考URL
伊奈林太郎.
このスライド.
http://up.orezdnu.org/papers/kansai-emacs/%23x06/slide/slide.pdf.
INA Lintaro.
term+.el のソースリポジトリ.
https://github.com/tarao/term-plus-el.
INA Lintaro.
term+.el の emacs 側設定例.
https://github.com/tarao/dotfiles/blob/master/.emacs.d/init/term.el
https://github.com/tarao/dotfiles/blob/master/.emacs.d/init/tarao/term.el.
INA Lintaro.
term+.el のシェル側設定例.
https://github.com/tarao/dotfiles/blob/master/.zsh/eterm.zsh.
伊奈 林太郎 Emacs 上のターミナルを最強に 34
おわり

More Related Content

What's hot

Pythonのシグナル処理
Pythonのシグナル処理Pythonのシグナル処理
Pythonのシグナル処理Atsuo Ishimoto
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
[DL輪読会]A Bayesian Perspective on Generalization and Stochastic Gradient Descent
 [DL輪読会]A Bayesian Perspective on Generalization and Stochastic Gradient Descent [DL輪読会]A Bayesian Perspective on Generalization and Stochastic Gradient Descent
[DL輪読会]A Bayesian Perspective on Generalization and Stochastic Gradient DescentDeep Learning JP
 
Performance Comparison of Mutex, RWLock and Atomic types in Rust
Performance Comparison of Mutex, RWLock and  Atomic types in RustPerformance Comparison of Mutex, RWLock and  Atomic types in Rust
Performance Comparison of Mutex, RWLock and Atomic types in RustMitsunori Komatsu
 
Visualizing Data Using t-SNE
Visualizing Data Using t-SNEVisualizing Data Using t-SNE
Visualizing Data Using t-SNETomoki Hayashi
 
クラスタ数の決め方(Tokyo.r#60)
クラスタ数の決め方(Tokyo.r#60)クラスタ数の決め方(Tokyo.r#60)
クラスタ数の決め方(Tokyo.r#60)osamu morimoto
 
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)Deep Learning JP
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
NP完全問題の紹介
NP完全問題の紹介NP完全問題の紹介
NP完全問題の紹介yutaka1999
 
ウェーブレット変換の基礎と応用事例:連続ウェーブレット変換を中心に
ウェーブレット変換の基礎と応用事例:連続ウェーブレット変換を中心にウェーブレット変換の基礎と応用事例:連続ウェーブレット変換を中心に
ウェーブレット変換の基礎と応用事例:連続ウェーブレット変換を中心にRyosuke Tachibana
 
(文献紹介)デブラー手法の紹介
(文献紹介)デブラー手法の紹介(文献紹介)デブラー手法の紹介
(文献紹介)デブラー手法の紹介Morpho, Inc.
 
20分でわかるgVisor入門
20分でわかるgVisor入門20分でわかるgVisor入門
20分でわかるgVisor入門Shuji Yamada
 
近年のHierarchical Vision Transformer
近年のHierarchical Vision Transformer近年のHierarchical Vision Transformer
近年のHierarchical Vision TransformerYusuke Uchida
 
帰納バイアスが成立する条件
帰納バイアスが成立する条件帰納バイアスが成立する条件
帰納バイアスが成立する条件Shinobu KINJO
 
[DL輪読会]Glow: Generative Flow with Invertible 1×1 Convolutions
[DL輪読会]Glow: Generative Flow with Invertible 1×1 Convolutions[DL輪読会]Glow: Generative Flow with Invertible 1×1 Convolutions
[DL輪読会]Glow: Generative Flow with Invertible 1×1 ConvolutionsDeep Learning JP
 
[DL輪読会]An Image is Worth 16x16 Words: Transformers for Image Recognition at S...
[DL輪読会]An Image is Worth 16x16 Words: Transformers for Image Recognition at S...[DL輪読会]An Image is Worth 16x16 Words: Transformers for Image Recognition at S...
[DL輪読会]An Image is Worth 16x16 Words: Transformers for Image Recognition at S...Deep Learning JP
 
グラフニューラルネットワーク入門
グラフニューラルネットワーク入門グラフニューラルネットワーク入門
グラフニューラルネットワーク入門ryosuke-kojima
 
渡辺澄夫著「ベイズ統計の理論と方法」5.1 マルコフ連鎖モンテカルロ法
渡辺澄夫著「ベイズ統計の理論と方法」5.1 マルコフ連鎖モンテカルロ法渡辺澄夫著「ベイズ統計の理論と方法」5.1 マルコフ連鎖モンテカルロ法
渡辺澄夫著「ベイズ統計の理論と方法」5.1 マルコフ連鎖モンテカルロ法Kenichi Hironaka
 
計算論的学習理論入門 -PAC学習とかVC次元とか-
計算論的学習理論入門 -PAC学習とかVC次元とか-計算論的学習理論入門 -PAC学習とかVC次元とか-
計算論的学習理論入門 -PAC学習とかVC次元とか-sleepy_yoshi
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 

What's hot (20)

Pythonのシグナル処理
Pythonのシグナル処理Pythonのシグナル処理
Pythonのシグナル処理
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
[DL輪読会]A Bayesian Perspective on Generalization and Stochastic Gradient Descent
 [DL輪読会]A Bayesian Perspective on Generalization and Stochastic Gradient Descent [DL輪読会]A Bayesian Perspective on Generalization and Stochastic Gradient Descent
[DL輪読会]A Bayesian Perspective on Generalization and Stochastic Gradient Descent
 
Performance Comparison of Mutex, RWLock and Atomic types in Rust
Performance Comparison of Mutex, RWLock and  Atomic types in RustPerformance Comparison of Mutex, RWLock and  Atomic types in Rust
Performance Comparison of Mutex, RWLock and Atomic types in Rust
 
Visualizing Data Using t-SNE
Visualizing Data Using t-SNEVisualizing Data Using t-SNE
Visualizing Data Using t-SNE
 
クラスタ数の決め方(Tokyo.r#60)
クラスタ数の決め方(Tokyo.r#60)クラスタ数の決め方(Tokyo.r#60)
クラスタ数の決め方(Tokyo.r#60)
 
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)
【DL輪読会】言語以外でのTransformerのまとめ (ViT, Perceiver, Frozen Pretrained Transformer etc)
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
NP完全問題の紹介
NP完全問題の紹介NP完全問題の紹介
NP完全問題の紹介
 
ウェーブレット変換の基礎と応用事例:連続ウェーブレット変換を中心に
ウェーブレット変換の基礎と応用事例:連続ウェーブレット変換を中心にウェーブレット変換の基礎と応用事例:連続ウェーブレット変換を中心に
ウェーブレット変換の基礎と応用事例:連続ウェーブレット変換を中心に
 
(文献紹介)デブラー手法の紹介
(文献紹介)デブラー手法の紹介(文献紹介)デブラー手法の紹介
(文献紹介)デブラー手法の紹介
 
20分でわかるgVisor入門
20分でわかるgVisor入門20分でわかるgVisor入門
20分でわかるgVisor入門
 
近年のHierarchical Vision Transformer
近年のHierarchical Vision Transformer近年のHierarchical Vision Transformer
近年のHierarchical Vision Transformer
 
帰納バイアスが成立する条件
帰納バイアスが成立する条件帰納バイアスが成立する条件
帰納バイアスが成立する条件
 
[DL輪読会]Glow: Generative Flow with Invertible 1×1 Convolutions
[DL輪読会]Glow: Generative Flow with Invertible 1×1 Convolutions[DL輪読会]Glow: Generative Flow with Invertible 1×1 Convolutions
[DL輪読会]Glow: Generative Flow with Invertible 1×1 Convolutions
 
[DL輪読会]An Image is Worth 16x16 Words: Transformers for Image Recognition at S...
[DL輪読会]An Image is Worth 16x16 Words: Transformers for Image Recognition at S...[DL輪読会]An Image is Worth 16x16 Words: Transformers for Image Recognition at S...
[DL輪読会]An Image is Worth 16x16 Words: Transformers for Image Recognition at S...
 
グラフニューラルネットワーク入門
グラフニューラルネットワーク入門グラフニューラルネットワーク入門
グラフニューラルネットワーク入門
 
渡辺澄夫著「ベイズ統計の理論と方法」5.1 マルコフ連鎖モンテカルロ法
渡辺澄夫著「ベイズ統計の理論と方法」5.1 マルコフ連鎖モンテカルロ法渡辺澄夫著「ベイズ統計の理論と方法」5.1 マルコフ連鎖モンテカルロ法
渡辺澄夫著「ベイズ統計の理論と方法」5.1 マルコフ連鎖モンテカルロ法
 
計算論的学習理論入門 -PAC学習とかVC次元とか-
計算論的学習理論入門 -PAC学習とかVC次元とか-計算論的学習理論入門 -PAC学習とかVC次元とか-
計算論的学習理論入門 -PAC学習とかVC次元とか-
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 

Similar to Emacs上のターミナルを最強に

いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門Tomoya Kawanishi
 
最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm晃 遠山
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプトbsdhack
 
ソースコードの共通化
ソースコードの共通化ソースコードの共通化
ソースコードの共通化Jun Hosokawa
 
鈴木:Net commonsでの中国語使用について
鈴木:Net commonsでの中国語使用について鈴木:Net commonsでの中国語使用について
鈴木:Net commonsでの中国語使用についてmichiosuzuki
 
鈴木:Net commonsでの中国語使用について
鈴木:Net commonsでの中国語使用について鈴木:Net commonsでの中国語使用について
鈴木:Net commonsでの中国語使用についてmichiosuzuki
 
卒研発表
卒研発表卒研発表
卒研発表yayugu
 
8F Emacs seminar 1st
8F Emacs seminar 1st8F Emacs seminar 1st
8F Emacs seminar 1sttoshi_pp
 
End-to-End音声認識ためのMulti-Head Decoderネットワーク
End-to-End音声認識ためのMulti-Head DecoderネットワークEnd-to-End音声認識ためのMulti-Head Decoderネットワーク
End-to-End音声認識ためのMulti-Head DecoderネットワークNU_I_TODALAB
 
最低限の開発環境を整えるには
最低限の開発環境を整えるには最低限の開発環境を整えるには
最低限の開発環境を整えるにはvi-iv
 
Erlangやってみた
ErlangやってみたErlangやってみた
Erlangやってみたina job
 
C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介yohhoy
 
DelphiでWin/Macクロスコンパイル
DelphiでWin/MacクロスコンパイルDelphiでWin/Macクロスコンパイル
DelphiでWin/MacクロスコンパイルTomonori Ohba
 
2017-12-04 Linuxの基本構造とBashでの扱い方
2017-12-04 Linuxの基本構造とBashでの扱い方2017-12-04 Linuxの基本構造とBashでの扱い方
2017-12-04 Linuxの基本構造とBashでの扱い方浩平 渡邉
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)Yoshifumi Yamaguchi
 
181106 02
181106 02181106 02
181106 02openrtm
 
Buffer overflow
Buffer overflowBuffer overflow
Buffer overflowionis111
 

Similar to Emacs上のターミナルを最強に (20)

Tmux
TmuxTmux
Tmux
 
Tmux
TmuxTmux
Tmux
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門
 
最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト
 
ソースコードの共通化
ソースコードの共通化ソースコードの共通化
ソースコードの共通化
 
鈴木:Net commonsでの中国語使用について
鈴木:Net commonsでの中国語使用について鈴木:Net commonsでの中国語使用について
鈴木:Net commonsでの中国語使用について
 
鈴木:Net commonsでの中国語使用について
鈴木:Net commonsでの中国語使用について鈴木:Net commonsでの中国語使用について
鈴木:Net commonsでの中国語使用について
 
卒研発表
卒研発表卒研発表
卒研発表
 
8F Emacs seminar 1st
8F Emacs seminar 1st8F Emacs seminar 1st
8F Emacs seminar 1st
 
End-to-End音声認識ためのMulti-Head Decoderネットワーク
End-to-End音声認識ためのMulti-Head DecoderネットワークEnd-to-End音声認識ためのMulti-Head Decoderネットワーク
End-to-End音声認識ためのMulti-Head Decoderネットワーク
 
最低限の開発環境を整えるには
最低限の開発環境を整えるには最低限の開発環境を整えるには
最低限の開発環境を整えるには
 
Erlangやってみた
ErlangやってみたErlangやってみた
Erlangやってみた
 
C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介
 
エコSmalltalk
エコSmalltalkエコSmalltalk
エコSmalltalk
 
DelphiでWin/Macクロスコンパイル
DelphiでWin/MacクロスコンパイルDelphiでWin/Macクロスコンパイル
DelphiでWin/Macクロスコンパイル
 
2017-12-04 Linuxの基本構造とBashでの扱い方
2017-12-04 Linuxの基本構造とBashでの扱い方2017-12-04 Linuxの基本構造とBashでの扱い方
2017-12-04 Linuxの基本構造とBashでの扱い方
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
 
181106 02
181106 02181106 02
181106 02
 
Buffer overflow
Buffer overflowBuffer overflow
Buffer overflow
 

More from Lintaro Ina

Gradual Typing for Generics
Gradual Typing for GenericsGradual Typing for Generics
Gradual Typing for GenericsLintaro Ina
 
論理と計算のしくみ 5.3 型付きλ計算 (前半)
論理と計算のしくみ 5.3 型付きλ計算 (前半)論理と計算のしくみ 5.3 型付きλ計算 (前半)
論理と計算のしくみ 5.3 型付きλ計算 (前半)Lintaro Ina
 
HTMLからの本文抽出
HTMLからの本文抽出HTMLからの本文抽出
HTMLからの本文抽出Lintaro Ina
 
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化Lintaro Ina
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in ScalaLintaro Ina
 
『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ 『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ Lintaro Ina
 
『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみLintaro Ina
 

More from Lintaro Ina (7)

Gradual Typing for Generics
Gradual Typing for GenericsGradual Typing for Generics
Gradual Typing for Generics
 
論理と計算のしくみ 5.3 型付きλ計算 (前半)
論理と計算のしくみ 5.3 型付きλ計算 (前半)論理と計算のしくみ 5.3 型付きλ計算 (前半)
論理と計算のしくみ 5.3 型付きλ計算 (前半)
 
HTMLからの本文抽出
HTMLからの本文抽出HTMLからの本文抽出
HTMLからの本文抽出
 
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in Scala
 
『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ 『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ
 
『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ
 

Emacs上のターミナルを最強に

  • 1. Emacs上のターミナルを最強に 伊奈 林太郎 2012-10-20 @ 関西 Emacs#x06 伊奈 林太郎 Emacs 上のターミナルを最強に 1
  • 2. ターミナル使ってますか? ◮ 素のターミナル ◮ 標準的なターミナルエミュレータ xterm, gnome-terminal, Terminal.app, ... ◮ マルチプレクサ screen, tmux, ... ◮ ssh といっしょになってるもの PuTTY, Tera Term, ... ◮ Emacs 上 term.el ◮ 使ってない eshell.el, ... ◮ その他 伊奈 林太郎 Emacs 上のターミナルを最強に 2
  • 3. ターミナル使ってますか? ◮ 素のターミナル ◮ 標準的なターミナルエミュレータ xterm, gnome-terminal, Terminal.app, ... ◮ マルチプレクサ screen, tmux, ... ◮ ssh といっしょになってるもの PuTTY, Tera Term, ... ◮ Emacs 上 term.el ◮ 使ってない eshell.el, ... ◮ その他 伊奈 林太郎 Emacs 上のターミナルを最強に 2
  • 4. ターミナルとEmacs ターミナルエミュレータを使う理由 ◮ ncurses アプリもちゃんと動いてほしい ◮ 素の端末を触るときにパニくらない Emacs との共存 ◮ Emacs は別窓で ◮ ウィンドウが増えてうざい ◮ 端末とのコピペが面倒 ◮ screenの中で Emacs ◮ キーボードだけでコピペ ◮ Emacs ごと detach 伊奈 林太郎 Emacs 上のターミナルを最強に 3
  • 5. screenのままならないところ ◮ 改造しにくい ◮ CJK ambiguous width ◮ 問題の切り分けが難しくなる ◮ (X などの) クリップボードとの連携 ◮ 面倒なハックが必要 ◮ 環境変数の引き渡し ◮ 外部からのコマンド発行で解決 (要開発版) # この辺は tmux でも同じですね 伊奈 林太郎 Emacs 上のターミナルを最強に 4
  • 6. すべてEmacsでやる ◮ CJK, クリップボード なども OK ◮ detach もできる (emacs --daemon) ◮ Emacs 本体と連携 ⊚ ◮ 操作性を一体に ◮ Lisp で改造しまくり 伊奈 林太郎 Emacs 上のターミナルを最強に 5
  • 7. Emacs内端末エミュレータterm.el 使い方 M-x term, M-x ansi-term 特徴 — 2 つのモード ◮ term-char-mode ◮ 打ったものがそのまま端末へ ◮ term-line-mode ◮ Emacs のバッファに近い編集 しくみ ◮ process-filterで制御シーケンスを解釈 ◮ バッファに put-text-propertyしながら表示 伊奈 林太郎 Emacs 上のターミナルを最強に 6
  • 8. term.elのいけてないところ ◮ キーがほぼすべて端末に持っていかれる ◮ M-x とかきかない ◮ でも ESC とかどっちで認識すべき? ◮ 端末が 1 つしか開けない (内部的には可能だけどインタフェースが無い) ◮ 色が 8 色しかない ◮ term-line-modeがちょっと貧弱 ◮ コードがレガシーで拡張しにくい ◮ 関数がでかい ◮ hook も少ない ◮ 遅い 伊奈 林太郎 Emacs 上のターミナルを最強に 7
  • 9. term+.el — term.elを強化する 主な機能 ◮ 256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 8
  • 10. term+.elをとりあえず使ってみる ダウンロード → 真っ新な状態でのお試し ° git clone git://github.com/tarao/term-plus-all.git ° cd term-plus-all ° git submodule update --init ° make emacs # or make term # or make EMACS=emacs-snapshot term 注意点 ◮ Emacs 24.1.50 で開発してます ◮ 22 はサポートしません ◮ 23 は細かいところが不安定かも ◮ 24.2 はおそらく OK ◮ 24.3 (24.2.50) の term.elの変更には未対応 伊奈 林太郎 Emacs 上のターミナルを最強に 9
  • 11. デモ 伊奈 林太郎 Emacs 上のターミナルを最強に 10
  • 12. term+.el — term.elを強化する 主な機能 ◮ 256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 11
  • 13. 256色対応 / xterm互換性 (require ³xterm-256color) 256 色対応 ◮ 256 色表示の制御シーケンスの解釈を実装 ◮ ついでに斜体 , 取り消し線等にも対応 ◮ 原理的には 24bit 色に対応可能 (cf. Konsole) (24bit 色表示しようとするアプリはあるのか?) xterm 互換性 (TERM=xterm-256color) ◮ TERM=eterm-256colorを定義すればよい? ◮ たいていのアプリは terminfo なんか見てない ◮ xterm を騙れば 256 色表示しようとしてくれる ◮ 騙るからには xterm 制御シーケンスを処理 (不完全) 伊奈 林太郎 Emacs 上のターミナルを最強に 12
  • 14. term+.el — term.elを強化する 主な機能 ◮ 256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 13
  • 15. キーバインド強化 [1/2] (require ³term+) 端末に奪わせないキーを定義 ◮ term+char-mapに  define-key 定義 するだけ (multi-term.elでもできますね) ◮ 定義済みのキー (M-x des-fun, term-char-mode) C-q 後続のキーをそのまま端末に渡す C-y 端末へ貼り付け M-RET 編集モード (term-line-mode)へスイッチ ESC 端末へ ESC を送る C-c 0.5 秒間何も入力がなければ端末へ C-c 直後に何か入力すればプレフィックスキー ◮ Emacs 本体で実行 (nil をマップ): M-x, M-:, C-x 伊奈 林太郎 Emacs 上のターミナルを最強に 14
  • 16. キーバインド強化 [2/2] (require ³key-intercept) 後続のキーがあるかどうかで意味が違う! ESC 端末へ ESC を送る M-x ふつうの M-x C-c 0.5 秒間何も入力がなければ端末へ C-c 直後に何か入力すればプレフィックスキー 実装: key-intercept.el ◮ https://github.com/tarao/key-intercept-el ◮ プレフィックスキーにもコマンドを割り当てる http://d.hatena.ne.jp/tarao/20120427/1335527960 伊奈 林太郎 Emacs 上のターミナルを最強に 15
  • 17. term+.el — term.elを強化する 主な機能 ◮ 256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 16
  • 18. 編集機能強化 [1/2] (require ³term+) 編集モード (term-line-mode)中は ◮ 入力フィールド外では読取専用 ◮ SPC で選択開始 もう一度 SPC で範囲コピー → 編集モード終了 ◮ RET, ESC で編集モード終了 ◮ 入力フィールド内ではふつうのバッファ ◮ ただし RET で端末に送信 ◮ ふつうの改行は C-j ◮ 別のメジャーモードにもできる e.g. シェルのプロンプトに sh-modeで入力 伊奈 林太郎 Emacs 上のターミナルを最強に 17
  • 19. 編集機能強化 [1/2] (require ³term+) 編集モード (term-line-mode)中は ◮ 入力フィールド外では読取専用 ◮ SPC で選択開始 もう一度 SPC で範囲コピー → 編集モード終了 ◮ RET, ESC で編集モード終了 ◮ 入力フィールド内ではふつうのバッファ ◮ ただし RET で端末に送信 ◮ ふつうの改行は C-j ◮ 別のメジャーモードにもできる e.g. シェルのプロンプトに sh-modeで入力 伊奈 林太郎 Emacs 上のターミナルを最強に 17
  • 20. 編集機能強化 [2/2] (require ³multi-mode-util) 入力フィールドだけ別モード ◮ あらかじめどのモードにするか指定 (後述) ◮ 編集モードに入ると  indirect buffer 間接バッファ を作成 ◮ multi-mode.el http://www.loveshack.ukfsn.org/emacs/multi-mode.el ◮ multi-mode-util.el https://github.com/tarao/multi-mode-util 伊奈 林太郎 Emacs 上のターミナルを最強に 18
  • 21. term+.el — term.elを強化する 主な機能 ◮ 256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 19
  • 22. ログ機能 (require ³term+) term-start-output-log ◮ term.elに元からある (ほぼデバッグ用) term+hardcopy (C-c h) ◮ 一画面だけテキスト保存 (追記可) ◮ screenの:hardcopy相当 term+start-buffer-log (C-c l) ◮ いままでの累積テキストを保存 ◮ 表示限界 (2048 行) を超えた分も保存 term+start-record (C-c r) ◮ 端末の制御シーケンスを時系列で保存 ◮ ttyrec互換 (ttyplayで再生可) 伊奈 林太郎 Emacs 上のターミナルを最強に 20
  • 23. term+.el — term.elを強化する 主な機能 ◮ 256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 21
  • 24. マルチプレクサ [1/3] (require ³term+mux) やりたいこと ◮ 複数の端末をタブ表示 (tabbar.el, emux.elでもできますね) ◮ 編集モード以外のときはモードラインをタブに ◮ セッション (ユーザ/ホストの別) ごとにグループ化 ◮ 同一セッションからは 1 つだけバッファ一覧に ◮ セッション内の選択中のタブが代表 ◮ 一覧中ではバッファ名ではなくセッション名 伊奈 林太郎 Emacs 上のターミナルを最強に 22
  • 25. マルチプレクサ [2/3] タブグループ (require ³term+mux) 実装: tab-group.el ◮ https://github.com/tarao/tab-group-el ◮ 車輪の再発明 ◮ tabbar.elでできることはだいたいできる ◮ モードラインにも表示できる ◮ バッファをひとまとめにできる ◮ かっこいいタブ選択 UI ◮ D&D でタブ移動 伊奈 林太郎 Emacs 上のターミナルを最強に 23
  • 26. マルチプレクサ [3/3] セッション管理 (require ³term+mux) M-x term+mux-new ◮ 現在のセッションで (or 選択して) 端末を開く M-x term+mux-new-command ◮ 現在のセッションで指定のコマンドを実行 M-x term+mux-remote-session ◮ ユーザ/ホストを指定してセッションを作成 ◮ シェル端末も 1 つ開く ◮ ローカルで root なら sudo する ◮ リモートなら ssh する 伊奈 林太郎 Emacs 上のターミナルを最強に 24
  • 27. term+.el — term.elを強化する 主な機能 ◮ 256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 25
  • 28. シェル連携 できること ◮ 編集モード ◮ 編集モードでのメジャーモード指定 ◮ バッファ内容を引き継いで編集モードへ ◮ ユーザ/ホスト/ディレクトリ通知 ◮ ファイル転送 (open / view / get / put) ◮ シェルコマンド履歴選択 ◮ マルチプレクサ ◮ タブタイトル設定 ◮ cdd (別タブの現在ディレクトリを取得) 方法 ◮ 端末内から特殊な制御コマンドを送る 伊奈 林太郎 Emacs 上のターミナルを最強に 26
  • 29. シェル連携 [1/6] 編集モード M-i で sh-modeの編集モードへ (zsh) function switch-to-line-mode-insert () {1 local buf="°BUFFER"2 zle kill-buffer3 zle -R # reset command line4 echo -ne "e]51;mode;sh-modee" > /dev/tty5 echo -ne "e]52;i;°bufe" > /dev/tty6 }7 zle -N switch-to-line-mode-insert8 bindkey ³^[i³ switch-to-line-mode-insert9 参照 https://raw.github.com/tarao/dotfiles/master/.zsh/eterm.zsh 伊奈 林太郎 Emacs 上のターミナルを最強に 27
  • 30. シェル連携 [2/6] セッション情報 ユーザ名/ホスト名を通知 host= hostname # ホスト名10 echo -ne "e]51;host;°hoste" > /dev/tty11 user= id -run # ユーザ名12 echo -ne "e]51;user;°usere" > /dev/tty13 ディレクトリ通知 (zsh) function precmd_eterm_cwd () {14 local dir; dir= pwd15 echo -ne "e]51;cd;°dire" > /dev/tty16 }17 typeset -Uga precmd_functions # これは一回だけ18 precmd_functions+=precmd_eterm_cwd19 ◮ Emacs 側の default-directoryが変更される ◮ TRAMP でリモートファイルも開ける 伊奈 林太郎 Emacs 上のターミナルを最強に 28
  • 31. シェル連携 [3/6] ファイル転送 function o() { # シェルで見えてるファイルを開く20 echo -ne "e]51;open;°1e" > /dev/tty }21 function v() { # シェルで見えてるファイルを view-mode で開く22 echo -ne "e]51;view;°1e" > /dev/tty }23 function get() { # シェルで見えてるファイルを手元にコピー24 echo -ne "e]51;get;°1e" > /dev/tty }25 function put() { # シェルで見えてる場所に26 # ファイルを選択してコピー27 echo -ne "e]51;put;e" > /dev/tty }28 ◮ セッション情報を通知しておく必要あり ◮ get/put は FTP と同じ向き ◮ put するとミニバッファでファイルを訊く ◮ dired インタフェースでの複数選択も可 伊奈 林太郎 Emacs 上のターミナルを最強に 29
  • 32. シェル連携 [4/6] 履歴選択 C-r で履歴選択 (zsh) echo -ne "e]51;histfile;°HISTFILEe" >/dev/tty #一回だけ29 30 function history-search-eterm () {31 local buf="°BUFFER"32 zle kill-buffer33 echo -ne "e]52;h;°bufe" > /dev/tty }34 zle -N history-search-eterm35 bindkey ³^R³ history-search-eterm36 ◮ 類似: zsh の履歴検索に anything.elを使う http://d.hatena.ne.jp/tarao/20100429/1272509893 伊奈 林太郎 Emacs 上のターミナルを最強に 30
  • 33. シェル連携 [5/6] マルチプレクサ タブタイトル変更 ◮ screen の ekSTR e 形式 ◮ tmux の e]2;STRe 形式 参考 https://raw.github.com/tarao/dotfiles/master/.zsh/screen-title.zsh cdd ◮ 他のタブの pwd に移動する ◮ オリジナルは id:secondlife さん (screen用) http://d.hatena.ne.jp/secondlife/20080218/1203303528 参照 https://raw.github.com/tarao/dotfiles/master/.zsh/eterm.zsh 伊奈 林太郎 Emacs 上のターミナルを最強に 31
  • 34. シェル連携 [6/6] カスタマイズ 定義済みの特殊制御コマンドを調べる ◮ M-x des-fun, term-emulate-terminal ◮ M-x term+control-command-list 新しい特殊制御コマンドを定義する (require ³term+vars)37 (defun my-control-command (text) ...)38 (term+new-control-command39 "START" "END " ³my-control-command)40 例 (defun term+open (files &optional find-file) ...)41 (term+new-control-command42 "033]51;open;" "033" ³term+open)43 伊奈 林太郎 Emacs 上のターミナルを最強に 32
  • 35. まとめ Emacs 上でだって端末機能をフルに使いたい! ◮ 256 色対応 ◮ xterm 互換性向上 ◮ キーバインド Emacs なのをいいことに魔改造 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサをまるごと実装 ◮ シェル連携しまくり 伊奈 林太郎 Emacs 上のターミナルを最強に 33
  • 36. 参考URL 伊奈林太郎. このスライド. http://up.orezdnu.org/papers/kansai-emacs/%23x06/slide/slide.pdf. INA Lintaro. term+.el のソースリポジトリ. https://github.com/tarao/term-plus-el. INA Lintaro. term+.el の emacs 側設定例. https://github.com/tarao/dotfiles/blob/master/.emacs.d/init/term.el https://github.com/tarao/dotfiles/blob/master/.emacs.d/init/tarao/term.el. INA Lintaro. term+.el のシェル側設定例. https://github.com/tarao/dotfiles/blob/master/.zsh/eterm.zsh. 伊奈 林太郎 Emacs 上のターミナルを最強に 34