How to setup languagetool in Emacs

I tried to setup languagetool in Emacs today but wasn’t successful.
How would I do this when my config is in a .org file and only gets symlinked by Nix?
I wasn’t able to find an example with Sourcegraph or else.

https://github.com/mhayashi1120/Emacs-langtool This one?

You’ll need languagetool installed at least. There is a nix package for that: https://search.nixos.org/packages?channel=21.11&show=languagetool&from=0&size=50&sort=relevance&type=packages&query=languagetool

You can still use your .org file the same as if you weren’t using nix. Just, if the config itself gets built into a nix package, you’d need to re-build that package each time you change the config.

(For iterating on an elisp config without having to re-build the nix package, I’d suggest loading/evaluating a config.local.el or whatever that’s not part of the Nix package; then move the good elisp into your nix package once you’re happy with it).

This package here:

https://search.nixos.org/packages?channel=22.05&show=emacs28Packages.languagetool&from=0&size=50&sort=relevance&type=packages&query=languagetool

Installation worked without a problem but doesn’t seem to be working.
I get the following message when I try to use it:

locate-file: Wrong type argument: stringp, nil

That error doesn’t help much, it just points at Locating Files (GNU Emacs Lisp Reference Manual) being misused. I’d guess it may be that some kind of binary the package expects to be installed isn’t, but that’s just a wild guess.

Have you tried turning on the debugger (M-x toggle-debug-on-error) before that function is called? That way you’ll get a traceback so we can figure out what’s actually wrong. Where is your exact configuration?

So managed to get the log.

Debugger entered--Lisp error: (wrong-type-argument stringp nil)
  locate-file-internal(nil ("/nix/store/xa7kqr8q1y4h1f6yzvir10w49ny3q002-emacs-..." "/nix/store/vzqny68wq33dcg4hkdala51n5vqhpnwc-python..." "/nix/store/ayv6knl9ifmymrmyy5qvl4svgbyml93j-python..." "/nix/store/9602rhcavm5nqih512szlqj6s44h80mx-cairo-..." "/nix/store/dh5j961clx7bbr8cb9df4s49qbxa1zx2-freety..." "/nix/store/wjf2554ffvap47vanabh9lk0dmj1q295-bzip2-..." "/nix/store/mk9p94cm6v3hm1hn89sqhb29bbkm37yp-libpng..." "/nix/store/xbny6j1qjg7425arm27gdjqc6jbsgvzl-fontco..." "/nix/store/g8w93fyx4gswdk1klb73xvkffkw8i0x2-expat-..." "/nix/store/i6i4h7xkygh0ylvn9jwdlji8q82xf907-glib-2..." "/nix/store/gqzplwy163p94sfy7l5sjgcml5fyshp0-gettex..." "/nix/store/h4mvv5jcqqjfcpdis8zzcg3j0s2l9kcn-glib-2..." "/nix/store/0yvf8n07x253q7v76ywpyadvyhn8g0ld-python..." "/run/wrappers/bin" "/home/andreas/.nix-profile/bin" "/etc/profiles/per-user/andreas/bin" "/nix/var/nix/profiles/default/bin" "/run/current-system/sw/bin" "/nix/store/z3z1ilyq7bmzphg42j83yfyx5gwh0iq0-python..." "/nix/store/k4lvc45h5adkg022jsgrdil2wckzn16a-emacs-...") ("") 1)
  locate-file(nil ("/nix/store/xa7kqr8q1y4h1f6yzvir10w49ny3q002-emacs-..." "/nix/store/vzqny68wq33dcg4hkdala51n5vqhpnwc-python..." "/nix/store/ayv6knl9ifmymrmyy5qvl4svgbyml93j-python..." "/nix/store/9602rhcavm5nqih512szlqj6s44h80mx-cairo-..." "/nix/store/dh5j961clx7bbr8cb9df4s49qbxa1zx2-freety..." "/nix/store/wjf2554ffvap47vanabh9lk0dmj1q295-bzip2-..." "/nix/store/mk9p94cm6v3hm1hn89sqhb29bbkm37yp-libpng..." "/nix/store/xbny6j1qjg7425arm27gdjqc6jbsgvzl-fontco..." "/nix/store/g8w93fyx4gswdk1klb73xvkffkw8i0x2-expat-..." "/nix/store/i6i4h7xkygh0ylvn9jwdlji8q82xf907-glib-2..." "/nix/store/gqzplwy163p94sfy7l5sjgcml5fyshp0-gettex..." "/nix/store/h4mvv5jcqqjfcpdis8zzcg3j0s2l9kcn-glib-2..." "/nix/store/0yvf8n07x253q7v76ywpyadvyhn8g0ld-python..." "/run/wrappers/bin" "/home/andreas/.nix-profile/bin" "/etc/profiles/per-user/andreas/bin" "/nix/var/nix/profiles/default/bin" "/run/current-system/sw/bin" "/nix/store/z3z1ilyq7bmzphg42j83yfyx5gwh0iq0-python..." "/nix/store/k4lvc45h5adkg022jsgrdil2wckzn16a-emacs-...") ("") 1)
  executable-find(nil)
  languagetool-console-invoke-command-region(1 990)
  languagetool-console-check(1 990)
  languagetool-check(1 990)
  funcall-interactively(languagetool-check 1 990)
  call-interactively(languagetool-check record nil)
  command-execute(languagetool-check record)
  counsel-M-x-action("languagetool-check")

Sorry my question was badly written.
What I meant was how can I get e.g. the Nix store path of a package into my .org config.
I don’t mind rebuilding the system after changing the Emacs config but since it’s in an org file I can’t use things like this:

  (setq languagetool-java-arguments '("-Dfile.encoding=UTF-8")
        languagetool-console-command "${pkgs.languagetool}/bin/languagetool-commandline"
        languagetool-server-command "${pkgs.languagetool}/bin/languagetool-server")

I decided to give the extracConfig parameter a try and specify the paths the Nix way.
I got now a new error:

Debugger entered--Lisp error: (error "There is no valid setting.")
  signal(error ("There is no valid setting."))
  error("There is no valid setting.")
  langtool--checker-mode()
  langtool--check-command()
  langtool-check()
  funcall-interactively(langtool-check)
  call-interactively(langtool-check record nil)
  command-execute(langtool-check record)
  counsel-M-x-action("langtool-check")
  ivy-call()
  ivy-read("M-x " ("langtool-check" "toggle-debug-on-error" "term" "eshell" "project-find-file" "ansi-term" "customize-mode" "mu4e" "woman" "eglot" "treemacs" "customize-group" "markdown-export" "eval-buffer" "markdown-preview" "set-face-background" "find-file" "sort-lines" "deft-refresh" "package-list-packages" "delete-duplicate-lines" "markdown-footnote-return" "markdown-footnote-goto-text" "cd" "5x5" "amx" "arp" "dbx" "dig" "erc" "ert" "eww" "ftp" "gdb" "irc" "jdb" "man" "mpc" "pdb" "pwd" "rsh" "sdb" "wos" "xdb" "calc" "deft" "diff" "dirs" "ffap" "gnus" ...) :predicate counsel--M-x-externs-predicate :require-match t :history counsel-M-x-history :action counsel-M-x-action :keymap (keymap (67108908 . counsel--info-lookup-symbol) (67108910 . counsel-find-symbol)) :initial-input nil :caller counsel-M-x)
  counsel-M-x()
  funcall-interactively(counsel-M-x)
  call-interactively(counsel-M-x nil nil)
  command-execute(counsel-M-x)

I got it working with the following commit.
However it feels a bit hacky and redundant to specify all those paths like that.