トップ 追記

活動日誌


2022-05-30

[Emacs] consult-buffer + recentf のプレビューで、特定ファイルのみ自動プレビューしない

consult-bufferではrecentfと組み合わせることで 「最近開いたファイル」を補完対象とすることができますが、このときこのファイルにカーソルを合わせると 自動プレビューがなされます。

これは便利なのですが、EasyPGを使って*.gpgファイルを開いていると、gpgファイルにカーソルが合わさった瞬間にパスフレーズ入力が要求され、操作を阻害されてしまいます。

gpgファイルは自動プレビュー対象としないようにするにはどうしたらよいか調べていたのですが、 以下のようにすることで解決できました。

(defun my/consult-preview-exclude-by-file-name (orig-fun name)
  (let ((excluded (and name
                       (string-match-p "\.gpg$"
                                       (abbreviate-file-name (expand-file-name name))))))
    (if excluded
        (progn
          (message "not previewed")
          nil)
      (apply orig-fun (list name)))))

(advice-add 'consult--find-file-temporarily :around #'my/consult-preview-exclude-by-file-name)

consult-preview-max-sizeの設定で自動プレビュー可否の判定がされることはわかっていたので、 同じように処理をするにはどうしたらよいかと考えた結果、adviceでconsult--find-file-temporarilyをスキップすればよさそう というところに行きつきました。


2014-01-15

RubyとtDiaryのアップグレード

この日記はさくらのレンタルサーバで動いています。

これまでRuby 1.9.3とtDiary 3系だったのですが、Ruby 2.1.0 / tDiary 4.0.2に移行しました。

rbenvによるRubyのインストール

何ヶ所か引っかかった点はあったのですが、Ruby 1.8.7 が終了するのでレンサバCGIで Ruby 2.0.0-p195 と tDiary を動かしたに全てまとめられていたので紹介します。

一応要点だけ書いておくと

  • gitを自前で入れる。--enable-pthreads=-pthreadを付けてビルドする。
  • 環境変数TMPDIRとMAKEを設定する。

といったあたりが必要です。

tDiaryのアップグレード

基本的には上書きで動くのですが、私はtDiaryのアーカイブをindex.rbと別の場所に展開しているので、 index.rbは以下のようにしています。

#!/home/ani/.rbenv/versions/2.1.0/bin/ruby
ENV['BUNDLE_GEMFILE'] = '/home/ani/{tdiaryの場所}/Gemfile'
require '/home/ani/{tdiaryの場所}/index'

あと、bundle install --gemfile=~/{tdiaryの場所}/Gemfile を実行する必要があります。


2014-01-08

[Emacs] 現在行をフリンジに表示するfringe-current-lineを作りました

2014-01-08-fringe-current-line.png

hi-line-modeを使うと、現在行をハイライトすることができます。 しかし、行全体がハイライトされるのはちょっと目立ちすぎて気が散ってしまうという気がしたので、 フリンジに控えめに表示を出すようなパッケージを作ってみました。

MELPAに登録していますので、M-x package-installからfringe-current-lineを入力すればインストールすることができます。 直接ダウンロードしたい方はgithubからどうぞ。

https://github.com/kyanagi/fringe-current-line


2014-01-05

[Emacs] smartrepによるコマンド実行中はキー入力をエコーしない

smartrepでコマンドを連続実行すると、 その間のキー入力が全てエコーされますが、キー入力が長くなると表示がひっかかります。

以下のadviceで、smartrepによるコマンド実行中はキー入力をエコーしないようになりました。

(defadvice smartrep-map-internal (around smartrep-silence-echo-keystrokes activate)
  (let ((echo-keystrokes 0))
    ad-do-it
    ))

2014-01-04

[Emacs] scratch-extをMELPAに登録しました

前々からやろうとは思いつつも手を付けていなかった、scratch-extMELPAへの登録が完了しました。

MELPAへの登録は初めてでしたが、recipeファイルを1行書いてpull requestを送るだけで大丈夫でした。


2012-03-06

[zsh] GitやMercurialのワークツリーのルートに下線を引く

2012-03-06-vcs-info.gif

今使っている zsh の右プロンプトにはカレントディレクトリを表示しているのですが、 Git や Mercurial のワークツリー(ワーキングディレクトリ)の中にいるときは、そのルートディレクトリに下線を引くようにしています。

これがなかなか気に入っているので紹介します。

以下では主要な部分だけ抜き出して解説しています。 zsh 設定ファイルの全体は github にアップしています。https://github.com/kyanagi/dot.zsh.d

まず、vcs_info の設定で formats に %r を設定しておき、リポジトリ名を取得できるようにします。 次の例だと、$vcs_info_msg_2_ で取得できるようになります。 http://zsh.sourceforge.net/Doc/Release/User-Contributions.html#Configuration

zstyle ':vcs_info:*' formats '%F{white}%c%u%s%f%F{white}:%f%F{green}__branch-name__%f' '%b' '%r'

次に、RPROMPT の設定です。

local rprompt
rprompt=(
  "%F{$prompt_color}["
  "\${vcs_info_msg_0_:+\${vcs_info_msg_0_} }%f" # VCS の情報があれば表示
  "%F{$prompt_color}"
  # $PWD は ~ が展開されているので ~ に戻し、リポジトリ名の部分に下線を付ける。
  # リポジトリ名は $vcs_info_msg_2_ に入っている。
  "\${\${PWD/#\$HOME/~}/\${vcs_info_msg_2_}/%U\${vcs_info_msg_2_}%u}"
  " %*]%f"
)
RPROMPT=${(j..)rprompt}

rprompt に配列を作ってから連結しているのはコメントを書くためです。 (j.. については http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags を参照)

いろいろと書いていますが、今回の記事に関係するのは

"\${\${PWD/#\$HOME/~}/\${vcs_info_msg_2_}/%U\${vcs_info_msg_2_}%u}"

の部分です。

以下ではこの内容をもう少し詳しく説明します。

プロンプトに変数の内容を表示する

右プロンプトに $PWD の値を出したいとします。

RPROMPT="$PWD"

とすると、(このコマンドを入力したときのカレントディレクトリが /var/tmp として)実際には

RPROMPT=/var/tmp

と展開されて実行されるので、その後ディレクトリを移動しても表示は常に /var/tmp のままになります。

右プロンプトの表示ごとにその瞬間の $PWD を表示するには、RPROMPT に「$PWD」という文字列を設定する必要があるので

RPROMPT="\$PWD"

としなくてはいけません。

設定解説

以上をふまえた上で、実際に右プロンプトの設定内容を見てみます。

~/tmp に tdiary-core をチェックアウトし、tdiary-core/spec/core に移動した状況を考えます。

各変数の内容は以下のような感じです。

変数 内容
$PWD /Users/ani/tmp/tdiary-core/spec/core
$HOME /Users/ani
$vcs_info_msg_2_ tdiary-core

まず、$PWD は ~ が展開されているので ~ に戻します。

${PWD/#$HOME/~} ~/tmp/tdiary-core/spec/core

(${name/pattern/repl} は name の pattern を repl に置換して展開するという意味です。# で始まるパターンは文字列の先頭を意味します。 http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion

次に、リポジトリ名 tdiary-core を下線付きにします。 リポジトリ名は $vcs_info_msg_2_ に入っています。 プロンプトで下線を引くには %U ... %u で囲います。

よって、$vcs_info_msg_2_ を %U${vcs_info_msg_2_}%u で置換します。

${${PWD/#$HOME/~}/${vcs_info_msg_2_}/%U${vcs_info_msg_2_}%u} ~/tmp/%Utdiary-core%u/spec/core

最後に、これを右プロンプトの表示ごとに解釈するため、$ をエスケープします。

\${\${PWD/#\$HOME/~}/\${vcs_info_msg_2_}/%U\${vcs_info_msg_2_}%u}

これで当初の設定どおりとなります。

なお、リポジトリ名と同じ名前のディレクトリがワークツリーより上にあった場合、そちらの方に下線が引かれてしまいます。 しかしこれはレアケースだと思いましたので、簡単のため特に対応していません。 (真面目にやるなら vcs_info formats の %R でフルパスが取れるので、それを使えば対処できると思います)

追記

RPROMPT の内容は以下のように修正しました。

"${${${PWD/#\$HOME/~}/\/${vcs_info_msg_2_}\///%U${vcs_info_msg_2_}%u/}/%\/${vcs_info_msg_2_}//%U\${vcs_info_msg_2_}%u}"

リポジトリ名が foo であるとき、カレントディレクトリが /foobar/foo だと foobar の foo に下線が引かれていたので、 下線はディレクトリ全体に対して置換するように修正しました。

読みづらいですが、リポジトリ名を foo とすると、まず /foo/ を /%Ufoo%u/ に置換し、 次に文字列末尾の /foo を /%Ufoo%u に置換しています。


2012-03-03

[Emacs] マウスでウィンドウの大きさを調整する

最近気付いたのですが、1つのフレームが上下に分割されているとき、 モードラインをドラッグしてウィンドウの大きさを調節することができます。 モードラインの要素にはクリックイベントが設定されているものがあるので、 空いているところをドラッグする必要があります。

2012-03-03-emacs.jpg

コマンドで調整するには enlarge-window を使います。

左右分割では、どうやらスクロールバーを表示しているときはドラッグで調節できないっぽいです。


2012-03-02

[Emacs] anything-minibuffer-history でのアクションは、ミニバッファの置き換えにする

anything-minibuffer-history(ミニバッファで C-r)はアクションが insert になっています。 しかしこれはミニバッファの現在の入力を置き換えた方が便利だと思います。

次のようにすると、現在のミニバッファへの入力にかかわらず、ヒストリの内容で置換されるようになります。


2012-03-01

[zsh] ^ で上のディレクトリに移動するのは、入力がないときだけにする

zsh を使っている方には、次のような設定を入れている方も多いと思います。

function cdup() {
  echo
  cd ..
  zle reset-prompt
}
zle -N cdup
bindkey '\^' cdup

これは ^ で上のディレクトリに移動できるようにする設定です。

普通に ^ を入力したいときは C-v ^ と入力するのですが、 テキストをコピペでターミナルに貼り付けたとき、テキストに ^ が混ざっていて意図しない結果になることが何度かありました。

この問題を改善するため、次のように変更しました。

function cdup-or-insert-circumflex() {
  if [[ -z "$BUFFER" ]]; then
    echo
    cd ..
    zle reset-prompt
  else
    zle self-insert '^'
  fi
}
zle -N cdup-or-insert-circumflex
bindkey '\^' cdup-or-insert-circumflex

これで、入力がないときは上のディレクトリに移動し、それ以外の場合は ^ が入力されるようになります。


2012-02-17

[Emacs] scratch バッファの便利な設定をまとめた scratch-ext.el を作りました

scratch バッファの便利な設定をまとめた scratch-ext.el を作りました。

このファイルを読み込むと

  • scratch バッファの kill は単にバッファの中身を消すだけにする。
  • scratch バッファをファイルに保存すると、新たに scratch バッファを作る。
  • scratch バッファを kill するか Emacs が終了する時点で、scratch バッファの内容を自動的にファイルに保存する。
  • 一番新しいログをバッファに読み込む

といったことができるようになります。

github で公開していますので、どうぞご利用ください。

https://github.com/kyanagi/scratch-ext-el

参考

*scratch* バッファを消さないようにする:長年利用していた設定です。バッファの自動保存を仕込むのを機に、同様の機能を再実装することにしました。


2005|02|03|04|05|06|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|03|04|05|06|10|
2008|04|10|
2009|10|
2010|05|08|
2012|01|02|03|
2014|01|
2022|05|
トップ