macOS のターミナルエミュレーター環境放浪記
ぶっちゃけ vim の :terminal から色々起動したりしてるのでターミナルエミュレーターに求めるものはあんまりないのだけど、
- タブが使えること (いちおう)
- (2019/9/19 15:20 追記) Alacritty はタブ使えません
- 速いこと
ということでおそらく最速らしい Alacritty をインストールしてみた。
ちなみに日本語は現在使えません。
Full unicode support · Issue #306 · jwilm/alacritty · GitHub
できる人もいるみたいですが、自分の環境 (macOS デフォルトの日本語 IM) だと全く日本語を入力できませんでした。
Cannot input japanese characters · Issue #1101 · jwilm/alacritty · GitHub
あと変換中もキーを処理しちゃうので↑とか↓のキーを押すと bash に渡って直前の履歴を表示したりします。
こんな感じで日本語を使うにはなかなかつらそうですが、ちょっと試した限り描画には特に問題なさそうな感じだったので、しばらく vim + eskk と併用してしのぐことにしました。 (vim 以外で日本語を入力したかったら vim のバッファで入力してからコピペすることにする) もともとターミナルで日本語をそんな入力することもないのでおそらく大丈夫なはず。
インストール
$ brew cask install alacritty
セットアップ
Ctrl + [ が Esc として認識されない
設定しない限りは自動で認識はしないっぽい。 自由度は高いとはいえ通常のターミナルエミュレーターっぽい動きをするオプションとかないんでしょうか (あったら教えてください)。
という訳で
Keyboard mappings · jwilm/alacritty Wiki · GitHub
を参考に
/Applications/Alacritty.app/Contents/MacOS/alacritty --print-events | grep KeyboardInput
してキーコードのイベントを見て、 [
がどういう名前で呼ばれているか見る。
(grep しているのは大量にイベントが出力されるので)
見るべきは Some(...)
で囲まれている中身。
[2019-08-12 05:25] [INFO] glutin event: WindowEvent { window_id: WindowId(Id(140290951381856)), event: KeyboardInput { device_id: DeviceId(DeviceId), input: KeyboardInput { scancode: 59, state: Pressed, virtual_keycode: Some(LControl), modifiers: ModifiersState { shift: false, ctrl: true, alt: false, logo: false } } } } [2019-08-12 05:25] [INFO] glutin event: WindowEvent { window_id: WindowId(Id(140290951381856)), event: KeyboardInput { device_id: DeviceId(DeviceId), input: KeyboardInput { scancode: 30, state: Pressed, virtual_keycode: Some(LBracket), modifiers: ModifiersState { shift: false, ctrl: true, alt: false, logo: false } } } }
Ctrl + [
を押すと、Control キーが押されたというイベントに加えて LBracket
が押されたと書いてあるのでそれを Esc にマッピングする。
設定ファイル (自分は $HOME/.config/alacritty/alacritty.yml
に追加した) の key_bindings
に以下を追加。
- { key: LBracket, mods: Control, chars: "\e" }
ベンチマーク (雑)
雑すぎるベンチマークなので参考にしないでください。 ただ個人的に乗り換えるきっかけにはなりました。
bash で
$ time yes | head -1000000
# iTerm real 0m2.701s user 0m0.280s sys 0m0.433s # macOS 標準の「ターミナル」 real 0m1.009s user 0m0.254s sys 0m0.424s # Alacritty real 0m0.759s user 0m0.249s sys 0m0.494s
ベンチマークと言いつつ環境についての記載がないってどういうこと?って言われそうですが上記の通りです許して… (単なる比較として見てください。ちゃんとやるなら出力 (描画) のみじゃなくキー入力についてとかも必要そう) 自己満足かもしれないけど自分もデフォルト以外のナウいターミナルエミュレータ使いたかった () っていうのもある。 まぁ個人のブログなので… (それを言ったら終わり)
Vim の :terminal で動かしているシェルで cd したら Vim のカレントディレクトリも変えるプラグイン
Vim の :terminal
で動かしているシェルで cd
したら、
Vim のカレントディレクトリも同じパスに :cd
するプラグインを作りました。
セットアップ
.bashrc / .zshrc に以下を追加してください。
source (sync-term-cwd.vim のリポジトリ)/macros/synctermcwd.sh
仕組み
実質これだけです。
plugin/synctermcwd.vim
function! Tapi_SyncTermCwd(_, cwd) abort let cd = get(g:, 'synctermcwd_cd_command', 'cd') execute cd a:cwd endfunction
macros/synctermcwd.sh
cd() { builtin cd "$@" || return $? if [ "$VIM_TERMINAL" ]; then printf '\e]51;["call","Tapi_SyncTermCwd","%s"]\x07' "$PWD" fi }
追記 (2019-12-28 02:30): cd
コマンドを書き換えると他の cd
コマンドを書き換えるスクリプトとバッティングするので PS1
に追加するようにしました。
if [ "$VIM_TERMINAL" ]; then _synctermcwd_ps1() { printf '\e]51;["call","Tapi_SyncTermCwd","%s"]\x07' "$PWD" } PS1="\$(_synctermcwd_ps1)$PS1" fi
便利な設定
デフォルトだと :cd {path}
を実行しますが、現在タブページのみカレントディレクトリを変えたければ以下を .vimrc
に追加すればできます。
let g:synctermcwd_cd_command = 'tcd'
追記 (2019-12-28 02:30): 追加した SyncTermCwdConditionalCd
を指定する方が大体の場合便利です。
let g:synctermcwd_cd_command = 'SyncTermCwdConditionalCd'
詳しくは
追記: :tcd
について
:tcd
は Vim 8.1.1218 からあるコマンドです。
現在タブページ固有のカレントディレクトリを設定する事ができます。
プラグインを作った当初は
let g:synctermcwd_cd_command = 'windo lcd'
と README にも書いていたのですが、 :windo
は現在のウィンドウから移動してしまう事に気付き、
:SyncTermCwdTabLcd
という Ex コマンドを実装したのですが*1
k-takata さんに :tcd があるよと教えてもらい、revert しました。
よって結局記事冒頭のシンプルな仕組みのままです。
素晴らしい… :tcd
便利すぎる…
あわせて読みたい
ちなみに sync-term-cwd.vim では :help terminal-api
という機能を使っていますが、
過去も Terminal API を使った類似のプラグインとして以下があります。
macOS Mojave で Vim のソースコード (C 言語) のデバッグをする (clang, lldb)
もし lldb でも良いならそっちを使ったほうが良いです.leak detector は LLVM の msan とか使ってるのが最近は多い気がします
— ドッグ (@Linda_pp) July 3, 2019
- src/Makefile の
CC
,CFLAGS
を変更
diff --git a/src/Makefile b/src/Makefile index 9c4a42893..d62c21b59 100644 --- a/src/Makefile +++ b/src/Makefile @@ -586,14 +586,14 @@ CClink = $(CC) # again. #CC = cc #CC = gcc -#CC = clang +CC = clang # COMPILER FLAGS - change as you please. Either before running {{{1 # configure or afterwards. For examples see below. # When using -g with some older versions of Linux you might get a # statically linked executable. # When not defined, configure will try to use -O2 -g for gcc and -O for cc. -#CFLAGS = -g +CFLAGS = -g #CFLAGS = -O # Optimization limits - depends on the compiler. Automatic check in configure
2. make clean distclean all
で再度ビルド
3. lldb ./vim
して r --clean
で実行
$ lldb ./vim (lldb) target create "./vim" Current executable set to './vim' (x86_64). (lldb) r --clean
TODO: leak detector 試す