this post was submitted on 12 Nov 2023
2 points (100.0% liked)

Emacs

314 readers
2 users here now

A community for the timeless and infinitely powerful editor. Want to see what Emacs is capable of?!

Get Emacs

Rules

  1. Posts should be emacs related
  2. Be kind please
  3. Yes, we already know: Google results for "emacs" and "vi" link to each other. We good.

Emacs Resources

Emacs Tutorials

Useful Emacs configuration files and distributions

Quick pain-saver tip

founded 1 year ago
MODERATORS
 

I have this type of code in my init.el each loads the features in a directly and it turns out that because the file names contained the - character they were not being loaded, as the regex checks for only alphanumeric filenames which are not hidden.

(let ((default-directory (expand-file-name "wsi/lisp" user-emacs-directory)))
  (normal-top-level-add-to-load-path (directory-files default-directory nil "[^\\.][a-z0-9]*")))

By the way I copied this from someone's init.el and I've suffered from it for ages, an object lesson on how one should not copy init.el files and other Emacs lisp code without fully understanding the code in them.

I'm not sure but it looks like the regex will not even match file names with capitals in them.

I guess the question I want to ask is how to add arbitrary non-alphabetical characters to a regex matching alphanumeric characters, with the proviso that they are acceptable in file names..

top 3 comments
sorted by: hot top controversial new old
[–] trollhard9000@alien.top 1 points 1 year ago

The second bracket part of your regex just needs some additions: [a-zA-Z0-9-._] Basically add any additional characters at the end after the ranges.

[–] 0xMii@alien.top 1 points 1 year ago

Elisp regular expressions are case insensitive by default, so they should match uppercase letters too.

To just add a dash, you could simply put that into the second group. So [a-z0-9-], you don’t have to escape it because it can’t be a range operator if it’s at the end of the group. The same goes for any other character you want to match.

You could also use [\\w. _-] (notice the literal space between the dot and the underscore). The \w is a shorthand for A-Za-z0-9. This should match all valid filenames as long as they don’t contain letters with diacritics.

[–] xtifr@alien.top 1 points 1 year ago

On a POSIX filesystem (MacOS, Linux, BSD, etc.), any character except '/' can be part of a filename. So why are you limiting yourself to a couple of punctuation characters? The best regex to match filenames is: "[^/]+"

If you're using Windows, it gets a bit trickier, but for reading the filesystem, "[^/\\\\]+" seems like it should be adequate. If you want to make sure you can create a filename on Windows, you'd have to exclude a few more characters. Nevertheless, excluding invalid characters still seems like a better approach than trying to include all the valid ones.