web-dev-qa-db-ja.com

Emacs Lispを使用してファイルが存在するかどうかを確認するにはどうすればよいですか?

Emacsで、開いたときに読み取り専用として生成されたファイルにマークを付けたいのですが。私が見逃しているパズルの部分は、ファイルが「存在する」かどうかを確認する方法です。私は現在次のものを持っています:

;;
;; get file extension
;;
(defun get-ext (file-name)
  (car (cdr (split-string file-name "\\."))))

;; 
;; get the base name of the file
;;
(defun base-name (file-name)
  (car (split-string file-name "\\.")))

;;
;; if an 'lzz' file exists for this header, mark it as read only
;;
(defun mark-read-only ()
  (if (string= (get-ext (cur-file)) "h")
      (if ( ??file-exists??? (concat (base-name (cur-file)) ".lzz") )
          (toggle-read-only))))

「??? file-exists ???」には何を使用できますか?

これを見つけたら、適切なフック(find-file-hookだと思う)に「mark-read-only」を追加します。

[〜#〜]背景[〜#〜]

C/C++開発プロセスを簡略化するために、コードジェネレーターとして lzz を使用します。簡単に言うと、lzzは単一の入力ファイル(C/C++に非常に似ている)を受け取り、必要に応じてヘッダーファイルとソースファイルを生成します。

デフォルトでは、lzzには#lineディレクティブが含まれているため、デバッガーは生成されたソースではなく元のソースをポイントしますが、コンパイルの依存関係を減らすために、通常ヘッダーファイルでこれらのディレクティブを無効にします。その結果、テンプレートまたはインライン関数をデバッグするとき、デバッガーは通常、元のソースファイルではなく、生成されたヘッダーファイルを指します。

これは大した問題ではありませんが、最近、デバッグ時に表示されたファイルにすばやく変更を加えてから再構築することがわかりました。もちろん、これは通常、編集したファイルが生成され、ライブラリの再構築中に変更が「吹き飛ばされる」ため、行った変更が消えることを意味します。

[〜#〜]ソリューション[〜#〜]

皆さんの助けとコメントに感謝します。使用する正しい関数を指摘してくれた cobbal に特に感謝します。

これが結果のコードです(ここの他のコメントにも基づいて更新されています):

(defun cur-file ()
  "Return the filename (without directory) of the current buffer"
  (file-name-nondirectory (buffer-file-name (current-buffer)))
  )

(defun mark-generated-as-read-only ()
  "Mark generated source files as read only.
Mark generated files (lzz or gz) read only to avoid accidental updates."
  (if
      (or (string= (file-name-extension (cur-file)) "h")
          (string= (file-name-extension (cur-file)) "cpp"))
      (cond
       (
        (file-exists-p (concat (file-name-sans-extension (cur-file)) ".lzz"))
        (toggle-read-only))
       (
        (file-exists-p (concat (file-name-sans-extension (cur-file)) ".gz") )
        (toggle-read-only))
       )
    )
  )
64
Richard Corden

file-exists-p

「ファイルfilenameが存在する場合(それを読み取ることができるかどうかにかかわらず)tを返します。」

89
cobbal
  • 必要に応じて、file-readable-p の代わりに file-exists-p

  • Aproposは今のところあなたを得るだけです。 Icicles適切な完了 と-を提供します プログレッシブ補完 サブパートと任意の順序で一致するコマンド、関数、変数などの名前のヘルプを簡単に見つけることができます(それはfile-exists-pまたはexists-file-p?)。

17
Drew

使用する - f.el 、ファイルおよびディレクトリ操作用の最新ライブラリ。 f-exists?f-file?f-directory?および他の多くの述語。ライブラリは、1つの名前空間で必要となるすべてのファイル関連関数であるため、標準関数よりも優れています。

8