トップ «前の日記(2007-02-09) 最新 次の日記(2007-02-11)» 編集

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2007-02-10 [長年日記]

% [Emacs][Mac] メタキーって結構悩ましい

Hiro さんからツッコミいただきました。どうもありがとう。

viのw,bに近いのはM-f, M-bかも。

C-M-f, C-M-bはviの%に似た動きもします。

なるほど。 でもなんだかこう…長年の Mac ユーザとしては (Carbon Emacs ではコマンドキーがメタに相当する) メタ+なんちゃらを使いまくるのは気持ち悪いよね(苦笑)。 M-x みたいに一発押せばオーケーな場合はまだ良いけど、カーソル移動のために M-f とか M-b を連打したり押しっぱなしにするクセが付いちゃったら、他のアプリでえらいことになりそう。 ちなみに OmniWeb では Command+B はブックマークウィンドウの On/Off なので押しっぱなしにすると、ちょっと何事か? という状態になる。 Command+F は普通検索機能だし、そうすると Windows の FireFox でついつい行編集中に Ctrl+F 押しちゃって検索窓が出てムキーっていう状態と同じことが起こりかねない。

一応設定でコマンドキーじゃなく別のキーに割り振ることもできるみたいだけど、それはそれで不便な気がするしなあ。 や、まあ、ちゃんと頭を切り替えれば大丈夫…だとは思うけど、Emacs いじってるつもりで他のアプリにフォーカス移ってたりすると鬱だよなー。 ……そこまで一生懸命 Emacs を使うようになるかっつーと、それはそれで微妙なんだが。

% [zsh] zsh におけるわしのキーバインド設定

昨日ちょっとネタにしたので、参考までに。

bindkey -v               # vi key bindings
bindkey '^P' up-line-or-history
bindkey '^N' down-line-or-history
bindkey '^A' beginning-of-line
bindkey '^E' end-of-line
bindkey '^F' forward-char
bindkey '^B' backward-char
bindkey '^D' delete-char-or-list
bindkey '^U' kill-whole-line
bindkey '^K' kill-line
bindkey '^_' history-incremental-search-backward
bindkey -a 'q' push-line

#bindkey -a '/' history-incremental-search-backward
#bindkey -a '?' history-incremental-search-forward

bindkey ' ' magic-space    # also do history expansion on space
bindkey '^I' complete-word # complete on tab, leave expansion to _expand

昨日書いたとおり、基本が vi キーバインドでカーソル移動に emacs キーバインドからパクってきた設定を追加してある。 実際のところ、vi キーの設定を上書きしてるところはほとんど無いはず。

bindkey -a というのは vi キーのコマンドモード時の設定で、'/' と '?' には通常 history-vi-search-* が定義されてるんだけど (コマンド名違うかも)、一瞬インクリメンタルサーチの方が便利かなーと思って設定してみたこともあった。 結局、検索後に n で同じ条件のものを遡って探せる通常の vi-search の方が便利だと気付いてやめちゃったけど。 magic-space と complete-word は設定ファイルの雛形に元からあった設定。

ちなみに push-line は今編集中の行を一旦よけといて、何かコマンド実行したあとにまた編集するためにスタックに積んどく動作。 emacs キーだとたしか ^Q あたりに入ってた気がするけど、vi キーだとどこにも設定されてないんで追加した。 たまーに便利。

あらためて設定を見直してみて、どうしてインクリメンタルサーチを ^_ に割り当ててるのか自分でも謎だったんだけど、たぶん Terminal.app に移行する前の設定だろうと思って mlterm を使ってみたら思い出した。 なぜか ^/ を押すと mlterm では (X では?) ^_ として入力されるからだ。 要するに、ほんとは ^/ に検索を割り当てるつもりだということ。 でも Terminal.app では ^/ は何もキーコードを発行してくれないので意味が無いのであった。 まあ、検索するときは Esc 叩いて / っていう流れができちゃってるから別に不便でも無いんだけど。

% [zsh] グローバルエイリアス

わしはいちおう zsh ユーザではあるけど、あんまりヘビーな使い方はしてないので微妙にもったいないと思うこともあったりする。 でもまあ、zsh というのは Emacs と並んで奥が深い症候群に陥りやすいアプリケーションの筆頭のような気がするので、適当なところでやめておくのが良いのであろう、などとも思う。

それでもまあ、ライトユーザであっても憶えておくと便利な事柄というのはいくつもあって、グローバルエイリアスなんかはそういう類じゃないかなーと。 ぶっちゃけ、わしも設定ファイルの雛形に書いてあったから知ってるだけで、詳しいことは何にも知らないんだが、ともあれこんな↓である。

# Global aliases -- These do not have to be
# at the beginning of the command line.
alias -g M='|more'
alias -g H='|head'
alias -g T='|tail'
alias -g L='|lv'
alias -g V='|vim -'
alias -g N='|nkf -We'

上三つが元からあったもので、残りはわしが追加したものだ。 こんな風に使う。

% cat /etc/passwd H -3
##
# User Database
# 

パイプ記号ってわりと入力しにくいところにあるんで、地味に便利。 ちなみに N の設定は、わしが LANG=ja_JP.eucJP な環境で生活してるので、ls が文字化けすることに対処するためのもの。 ls の出力を UTF-8 -> EUC-JP で変換してやって、とりあえず読めるようにする。 まあ、日本語のファイル名なんてめったに使わないんで、あんまり必要無いんだけど。

濫用しすぎると大変なことになりそうだけど、それなりに使うなら便利な機能だと思う。

% [Emacs] 何かするときは全部 M-x で、というのが正しい vi ユーザの姿ではないかと思った

あたかも、何かするときは全部 ex コマンドで…と言わんばかりに。

正直 C-x とか C-c からのコマンドは憶えられる気がしないのである。 でもさ、要するにあれでしょ、それらのコマンドってのは vi/vim で言うところの map なわけでしょ。 他人が設定した map なんて憶えられるわけないよ。 っていうか、わしは自分で設定しても憶えられないから、map なんてほとんど使ってないよ(苦笑

本来のコマンド (関数) が元々あって、キーコンビネーションにそれらの機能をマッピングしてるだけで、憶えれば便利ではあるけど、憶えないとその機能が使えないわけではない……んだよね? 多分。

長い名前のコマンドで憶えてしまえば、忘れかけても何となく想像が付くし、どうせ補完もしてくれるしね。 ところで補完のとき Ctrl+D で候補一覧の表示をしてくれないのは tcsh や zsh や vim に慣れ親しんでるわしとしてはうざったい。 なんでいちいち TAB 二回押さなならんのだ。 だから Bash も嫌いなんだよ。

% [Emacs] M-x help-with-tutorial

こういうのは初めに教えてくれるべきです (誰が?)。 ちなみに Vim ならシェルから vimtutor コマンドを実行しませう。

んでまあ、チュートリアルだが。 最初のうちはまあ良かったんだけど、やっぱり C-x が絡んでくるあたりから脳が拒否反応を起こし始めたのであった。 なので、やっぱりこれ以降はさらっと読み流して終わりにしとく。 何とか憶えられた分を vi との対応でメモ。

                 vi/vim                  emacs
一画面移動       C-f, C-b                C-v, M-v
半画面移動       C-d, C-u                (欲しいんだけどあるのか?)
キャンセル       Esc                     C-g
数値指定         コマンドの頭に数値      C-u 数値 コマンド
アンドゥ         u                       C-x u もしくは C-_ (Ctrl+/)
切り取り         d*                      C-w
貼り付け         p                       C-y
コピー           y*                      (わからん)

vi/vim だとコピーが「ヤンク (yank)」なのに Emacs だと貼り付けがヤンクなのがややこしい。 C-v とか C-w も語源がわからんので憶えにくい。 コマンドを途中でキャンセルしたいときに C-g というのがわかったのは収穫 (この操作は skk のおかげで実は慣れてる)。 今まではついつい Esc 連打して、beep 音連発されてたよ(苦笑

ともあれ、少しは扱いやすくなってくれた気がする。

% [vim] 今日の言語 Vim

……え、えーと、なんと言うか Emacs の中身は腐っても LISP なわけで、なんともそのパワフルと言うか……つまり何かこう悔しくなったのね。 そんでまあ、あれよ、vim スクリプトの勉強とかしてみようかと思ってさ。

そんなわけでちょろっといじり始めてみたんだけど、あー泥くさい。 なんか 7.0 になってだいぶスクリプト環境が良くなったらしいけど、じゃあ 6.0 以前はどうしてたんだろなあ。 いやあ、機能拡張作ってる人には頭が下がる。 いちおう :help eval をざっと眺めた感じではリストや辞書もあるし、それをいじる map とかの手続き (vi 用語の map と非常にややこしいんだが。それ系の map なんちゃらって関数もあったりするし) なんかもあるみたいだし、それなりにちゃんとした言語にはなってるみたいではある。 でもなんか泥くささを感じてしまうのはナゼだろう。

とりあえず練習として、日付によってディレクトリを作って、バックアップファイルをそこに突っ込むというのをやってみた。 :set backupdir=hoge でバックアップファイルを一箇所にまとめられるので、それを利用する寸法。 つーか、たかがそれだけなのに、えらく時間を食ってしまってぐったり。 全ては expand() の呪いなのだ。くそぅ。

set nobackup
let backupdir_base = expand("~/tmp/.vim_backup/")
let today = system('echo -n `date "+%Y-%m-%d"`')
let backupdir = backupdir_base . today
if ! isdirectory(backupdir)
   call mkdir(backupdir, "p")
endif
let &backupdir = backupdir
set backup

こんな感じ。 日付文字列を取得する方法がわからなくて system 関数に逃げている時点ですでにショボい。 そして、let &backupdir = backupdir としているところは set backupdir= しているのと同じことなのだが ('&' が頭に付いてるのはオプション変数)、実は厳密には同じでなくてそこで猛烈にハマってしまったのであった。 というか、ハマってる原因に気付くまでは mkdir のところも system 使ってたりしたのだ。 それに isdirectory で条件分岐とかもしてなかったし。

勘の良い人は気付いたかもしれないけど、要するにそれぞれ組み込み関数 (isdirectory とか mkdir とか) に渡すパス文字列は expand 関数で特殊文字を展開した表記に直してやらないとダメなのだね。 そして、オプション変数に代入する文字列も。 いや、まあそりゃわからんでもないんだけど、他のところでは (ex コマンド全般ね) 何もしなくてもチルダを展開してくれてるから、てっきりどこでもそうだと思うじゃないか。 あー、ほんと無駄に疲れた。

ともあれ、今回苦しんだおかげで、だいたいクセも掴めてきた気がするんで、いずれもう少し規模の大きな何かをやってみたいな。 まあ、キリが無いからやめておけ…っていうささやきが聞こえる気もするんだけど(苦笑

% [Emacs] C-x がとっさに押せない病

つーか A の隣りに Ctrl があるキーボードだと C-z とか C-x とか C-s とか押しづらくない?

わしの場合、Ctrl を押す場合でも人差し指は f から離れないんだが、そうすると C-x のときに x に近いのは中指になるんだよね。 でも通常は x って薬指で押すもんだから、C-x を押そうと思ってもまず薬指が動いちゃう。 で、「あ、違うぞ、えーと……」と一瞬考えてから中指を動かすって感じ。 無理に薬指で押そうとして指つりそうになったこともある(笑

そもそも今まで C-x を押す習慣てのがまったくと言って良いほど無かったからなあ。 Windows だとカットが Ctrl-X だけど、大抵カットなんかしないで Delete で消しちゃうし (Ctrl+C や Ctrl+V はよく使うけど)。 まあ、そういう意味では Mac でも Command+X ってあんまし使わないんだけど、x キーは Command キーのすぐ上だから間違えにくい。

とまあ、そんなこともあるし、C-x の次に何を押せば良いのかしばし考えないと思い出せないので、結局ファイル開くときは M-x find-file の方が早いし、バッファを消すときは M-x kill-buffer の方が早いという(苦笑

でも、わしはこれで良いような気がするよ。十分だ。 M-x find-file ってやると、毎回「C-x C-f で同じことできるよ」って教えてくれるけど、そんなもんすぐ忘れるんだよ。 C-x なんてくそくらえだい。

% [Mac][Emacs] M-q とか M-w の呪いはおそろしいねぇ

いやあ、くわばらくわばら。(呪いについてはツッコミ欄参照)

とりあえず soutaro さんは OmniWeb とか Opera みたいに、終了時に開いてたタブを憶えておいてくれるブラウザに乗り換えるべきだと思った。 つーか Firefox にも探せばそういうアドオンとかありそうな気がするけど。

あと向井さんは Terminal.app のターミナルインスペクタ (Command-I) のプロセスタブで『以下を除くプロセスが実行中の場合』のとこから ssh を取り除くべき。早急に。

いやほんと Emacs 使いの人は苦労しますね。 わしは Vim 使いで良かったなあ。 まあ、Vim 以外のあらゆるテキスト入力のシチュエーションでストレスが溜まるという弊害はあるんだけど……

本日のツッコミ(全6件) [ツッコミを入れる]
% soutaro (2007-02-10 13:24)

ちょっと違いますけど、「Emacsでテキストを整形しようと思ってCommand-Qを入れたら実はFirefoxにフォーカスがありました」みたいなことがあると悲しい気分になりますね。いろんな環境の混在は難しいっす。

% jijixi (2007-02-10 13:27)

それはせつない。

% Hiro (2007-02-10 19:58)

コピーはM-wですね。たぶんC-wのC-をM-にしたってことで。<br>C-wの語源はwipeだと思います。C-vはわかりません。<br>半画面移動は標準ではないと思います。

% jijixi (2007-02-10 20:08)

情報どうもです。<br>しかし M-w か……Command+W はウィンドウを閉じるのに頻繁に使うから気持ち悪いなあ(苦笑

% 向井 (2007-02-11 00:38)

carbon emacs は Command をメタキーとして使えるので Command-w でいいんだけど、 Terminal のなかの(リモートログイン先の)Emacsでカットしようとしてうっかり M-w してターミナルごと消えたことがありますというかよくやります orz<br><br>zshのグローバルエイリアスは、<br>G='| grep'<br>が重宝しています。 A=awkとS=sedもやるけど、パイプで繋ぐときにはけっきょくコマンド名を書くことの方が多いですね。<br>知合いには R で ruby を呼出すという人も。<br>あとこんな話もありますね。<br>http://d.akinori.org/?date=20070117#p02<br>これはわたしはやってないけれど。

% jijixi (2007-02-11 01:05)

これはなかなかアグレッシブな使い方ですね。<br>わしはこの手の使い方は誤操作が怖くてできないタイプです(苦笑

お名前:
E-mail:
コメント:

トップ «前の日記(2007-02-09) 最新 次の日記(2007-02-11)» 編集

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com