3

ディレクトリ名が「/sites/ all/modules」の文字列があるとします。そして、その最後のコンポーネントを削除して、「/ sites/all」を生成します。関数を作成してみましたが、「/ sites / all/modules」が返されます。

(defun remove-last-dir (dir)
      (replace-regexp-in-string "(.*)/.+" "\1" dir))

(print (remove-last-dir "/sites/all/modules"))
4

4 に答える 4

7
ELISP> (directory-file-name (file-name-directory "/sites/all/modules"))
"/sites/all"

file-name-directory指定されたパスのディレクトリコンポーネントを取得します。Emacsは/末尾がディレクトリであると見なすため、戻り値の末尾は/

directory-file-name/パスの非ディレクトリバージョンを返します(つまり、値がある場合は、値から末尾を削除します)。

元の引数がだった(またはそうなる可能性がある)場合は、最初にそれ/sites/all/modules/を呼び出す必要があることに注意してください(そうでない場合は、ディレクトリパスの「ディレクトリコンポーネント」自体が元の値を返すため)。directory-file-namefile-name-directory

于 2013-02-23T21:49:23.310 に答える
2

私はあなたにトリックをするべきELispでいくつかのコードを書きました:

(defun remove-last-dir (dir)
  (let* ((splits (cdr (split-string dir "/")))
         (res (mapconcat 'identity (butlast splits) "/")))
     (concat "/" res)))

お役に立てれば!

于 2013-02-23T20:05:41.827 に答える
1

効率的な解決策を書きました:

(defun remove-last-dir (dir)
      (string-match "\\(.*\\)/" dir)
      (match-string 1 dir))

(print (remove-last-dir "/sites/all/modules"))

プリント:

"/ sites / all"

于 2013-02-23T20:27:37.767 に答える
1

@philsの答えは正しく、サードパーティのライブラリを持たないEmacsには慣用的ですが、Elispでファイルやファイルパスを頻繁に操作する場合は、f.elライブラリをインストールすることをお勧めします。これにより、ファイルやディレクトリに関連する大量の機能が導入されます。f-dirname必要なものです:

(f-dirname "path/to/file.ext") ;; => "path/to"
(f-dirname "path/to/directory") ;; => "path/to"
(f-dirname "/") ;; => nil

パスをさらに制御する必要がある場合は、他の機能も確認してください。

于 2014-04-22T11:26:39.713 に答える