バッファがファイルを訪問しているかどうかを確認するにはどうすればよいですか?


9

一部の(たとえば、現在の)バッファがファイルを訪問しているかどうかを確認したいと思います。私は言うことができます:

(if (buffer-file-name) ...)

しかし、それはあまりエレガントではないようです-私が興味を持っているのはブール値だけであり、問題のバッファの実際の名前ではありません。buffer-file-name関数がElispで記述されている場合、そのソースを調べて、それが何を使用しているかを調べることができますが、Cで記述されているため、Emacsソースをインストールできましたが、elisp名が見つからないのではないかと心配しています。とにかくそこに私が何をしているかをチェックする機能のために。

私が必要なのは、現在のバッファのファイルの名前に基づいてディレクトリを作成したいということです。現在、これは多かれ少なかれこれを行っています:

(make-directory (if (buffer-file-name) (file-name-base) "default-dir"))

それでは、これを行うためのElispの慣用的な方法は何でしょうか?


2
なぜbuffer-file-name本当に使用することに反対するのかわからない、それはそれを行う正しい方法です(本当に本当にしたいならt、そうします(and (buffer-file-name) t)が、それは醜いIMOです)。その実装は、filenameとにかくElispから直接アクセスできないバッファC構造体のフィールドを読み取っています。結局のところ、それはnullかそうでないかの単なるポインタです。
シグマ

まあ、これが正しい方法であれば、私には問題ありません。私が言ったように-私はCの実装を知りませんでした、そして常識は私が冗長があるかもしれないかどうかだけを知りたいときにファイル名を尋ねることは冗長であるかもしれないと言います。
mbork 2014年

そして、私はそれ(and (buffer-file-name) t)が奇妙に見えることに同意します。
mbork 2014年

それ(if (buffer-file-name) ... )がエレガントだと思わなければ、elispで長い間コーディングをしていないことになります。ここから醜くなるだけです。
nispio 2014年

回答:


12

バッファの名前はそれ自体で完全に適切なブール値であるため、使用法慣用的なelispであると私は主張します。マニュアルからの引用:

if式の真理テストには重要な側面があります。これまでは、述語の値として「true」と「false」を、あたかも新しい種類のEmacs Lispオブジェクトであるかのように説明してきました。実際、「false」は単なる旧友nilです。それ以外のものは、何でも、「真実」です。

ポイントをさらに進めるには、のコードを確認してくださいclone-buffer。次のようになると思います。

(interactive
 (progn
   (if buffer-file-name
       (error "Cannot clone a file-visiting buffer"))
...

これは、buffer-file-name引数なしで関数を呼び出す代わりにの変数バインディングをテストしています(buffer-file-name)が、2つは常に同じように動作することに注意してください。


8

(buffer-file-name)(オプションのbuffer引数を指定して)またはbuffer-local buffer-file-name変数を使用できます。どちらも、指定されたバッファーに対して同じ値に評価されます。

それ Elispでこれを行う慣用的な方法なので、コードは問題ありません。必死にしたい場合は、常にbuffer-has-file-pラッパー関数を作成できます。


ありがとう。関数または変数を選択するのに大きな違いはありますか?
mbork 2014年

1
私はそうは思いません。バッファ引数を示す必要がある場合(buffer-file-name BUFFER)は確かによりも優れ(with-current-buffer BUFFER buffer-file-name)ていますが、それ以外の場合はどちらを使用するかは重要ではないと思います(関数がCで記述されているため、パフォーマンスに大きな違いがあるとは思えません)。
phils 2014年

3

だけを使用してくださいbuffer-file-name。Lispでは、私たちはしばしばtruenilを意味する非値を使用しています

これを回避する必要があるのは、関数が高価であるか、不要な副作用がある場合のみです。


そうですか。私は、非それは何も知っているnil事実であるが、私はちょうど私が唯一かどうかを知りたいときに名前をつかむと思った任意の一見、それはない-名前が存在することは、「コストがかかる」です。
mbork 2014年

1

「バッファ・リスト」の章ドキュメンテーションの:

buffer-listによって返されるリストは、具体的に作成されます。これは内部Emacsデータ構造ではなく、変更してもバッファーの順序には影響しません。

したがって、ライブバッファのリストを検索する方法を見つける必要があります。ここに一つあります:

  (if (string-match-p (regexp-quote "My buffer name") (format "%s" (buffer-list)))
      (message "Open")
    (message "Not open"))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.