client: Emacs doesn't like writing to KBFS

When I open foo.txt and editing it, I get the following on save:

Opening output file: input/output error, /keybase/public/timmc/foo.txt

The file does get saved, though. Another editor I tried worked fine. I don’t know enough about Emacs to say why this failed to go smoothly, but it might indicate a problem in the filesystem.

About this issue

  • Original URL
  • State: closed
  • Created 8 years ago
  • Comments: 27 (21 by maintainers)

Commits related to this issue

Most upvoted comments

Another hint for people experiencing problems with this. Projectile-mode causes significant pain with Keybase. It’s frequently looking for project files and that seems to slow Emacs down significantly. Here’s some sample strace output:

faccessat(AT_FDCWD, "/keybase/private/tonyarkles/rebar.config", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/project.clj", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/build.boot", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/SConstruct", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/pom.xml", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/build.sbt", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/gradlew", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/build.gradle", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/Gemfile", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/requirements.txt", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/setup.py", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/tox.ini", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/package.json", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/gulpfile.js", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/Gruntfile.js", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/bower.json", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/composer.json", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/Cargo.toml", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/mix.exs", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/stack.yaml", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/info.rkt", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/TAGS", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tonyarkles/GTAGS", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/rebar.config", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/project.clj", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/build.boot", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/SConstruct", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/pom.xml", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/build.sbt", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/gradlew", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/build.gradle", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/Gemfile", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/requirements.txt", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/setup.py", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/tox.ini", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/package.json", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/gulpfile.js", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/Gruntfile.js", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/bower.json", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/composer.json", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/Cargo.toml", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/mix.exs", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/stack.yaml", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/info.rkt", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/TAGS", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/private/GTAGS", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/rebar.config", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/project.clj", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/build.boot", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/SConstruct", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/pom.xml", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/build.sbt", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/gradlew", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/build.gradle", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/Gemfile", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/requirements.txt", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/setup.py", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/tox.ini", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/package.json", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/gulpfile.js", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/Gruntfile.js", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/bower.json", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/composer.json", F_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/keybase/Cargo.toml", F_OK) = -1 ENOENT (No such file or directory)

That seems to happen… maybe every time I move my cursor? It’s brutal. Turning off projectile for the single org-mode file I’ve got open on Keybase makes things buttery-smooth again.

@strib @tv42 Regarding this issue, it turned out it wasn’t Emacs’ auto-save, as I already had it setup to backup files in a specific local folder in my home.

The problem turned out to be Emacs’ lock files (which you cannot redirect to any other folder): here some Emacs documentation on File Locks.

So what I did was disable lock files entirely, as I am mostly working in machines alone, without danger of overwriting somebody else’s work. For that, I set (setq create-lockfiles nil) in my Emacs config.

With this config, I can safely open the org files individually (or via the agenda) -> /loose connectivity/ -> work on my files (without saving them) -> /regain connectivity/ -> save my work.

NOTE: Additionally, I had previously set EasyPg to skip autosave of (de)crypted files(setq epa-file-inhibit-auto-save t) Emacs documentation on EasyPG.

Many thanks for pointing me in the right direction. I hope for long life to the keybase project, I love it!