73

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))
       )
    )
  )
4

3 に答える 3

105

試すfile-exists-p

「ファイルファイル名が存在する場合(読み取れるかどうかに関係なく)、tを返します。」

これはファイルに固有のものではなく、ディレクトリでも機能することに注意してください。

于 2009-06-03T09:08:46.870 に答える
17
  • 必要なものによっては、file-readable-p代わりにfile-exists-p.

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

于 2011-09-05T01:14:47.753 に答える
8

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

于 2014-03-14T15:24:46.797 に答える