Hi there! I have been lurking for a while here and thought it was about time to post a question.
I recently found the excellent tool direnv which sets environment variables in your shell based on which directory you are in.
I thought it would be great if there was a way to integrate this with connect.kak so that when you launch a terminal and cd into your project directory it would be as though you had launched the terminal from kakoune with connect.kak’s connect-terminal.
I have tried the following .envrc (which is just blindly copy and pasting bits of the env setup performed by connect.kak) with no success
If you then run kak -s dotfiles, launch a separate terminal, cd into dotfiles and run edit file no errors are produced but the file is not opened in kak.
I was wondering if anyone had tried anything similar or has any suggestions for how I might be able to get this working?
On your actual point, this is a really interesting sort of dir level environment sync idea… I haven’t done it but now I want to, I sort of invert it (launch all my tmux panes with terminals with connect). But if I accidentally close kak when having the shell open, I then have to manually go fix it, not fun. This sounds like a better approach.
I want to write a fish shell functions which opens a new kitty tab / OS window with a ‘project session’.
That would consist of Kak, one to two terminals (one maybe called kak_replto allow repl function) and nnn.
I looked at ‘conect’ and think it’s amazing but for my usecase I might not need it after all.
The Kak session will be called after the current project’s directory, the client will be named ‘master’.
All shells in the current tab will have a env variable with the project’s dir.
I will write another fish function (kakwrap') which opens files in the 'master' client if the env variable exists: echo “evaluate-commands -client master edit $filename” | kak -p $kakoune_session_name`
(https://github.com/mawww/kakoune/issues/3533)
I set $VISUAL=kakwrap and set nnn to open files with visual.
Please note that there are a few things that might bother you at first :
a default session named main must always be running (I use Systemd to ensure that)
if the editor is started outside a git directory and without arguments, then a change-directory to $PWD command is performed : I found it really upsetting that when you open the editor without arguments and connect the the default session you’re not in the directory your shell was in
Sorry if the code is unclear, this was not supposed to leave my messy $HOME…
I’ve written a function related to this in fish, you might be able to adapt it. You don’t need connect for it, it’s just pure fish script:
#!/usr/bin/env fish
function kc --wraps kak --description "Connect to existing kakoune session or create a new one"
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1
or ! git rev-parse --show-toplevel >/dev/null 2>&1
# If git toplevel can't be found, run a disconnected session
kak $argv
return
end
set -l dirname (git rev-parse --show-toplevel)
set -l projectname (basename $dirname | string replace . -)
set -l session (kak -l | grep $projectname)
if test -z "$session"
# Create a new session if there are none
kak -s $projectname $argv
else
# Otherwise connect to existing session
kak -c $projectname $argv
end
end
I’ve named it kc and put it in my fish functions folder to make it available everywhere. With that I can run “kc” anywhere in a git project and it will connect to a session for that project if there is one. If there is no existing session it will create one based on the folder name of the project root.
It forwards its arguments to kakoune, so you can just use the command in the same manner as the kak command, and you can still have command completions based on the completions for kak.