Search code examples
zshzshrc

ZSH auto_vim (like auto_cd)


zsh has a feature (auto_cd) where just typing the directory name will automatically go to (cd) that directory. I'm curious if there would be a way to configure zsh to do something similar with file names, automatically open files with vim if I type only a file name?


Solution

  • There are three possibilities I can think of. First is suffix aliases which may automatically translate

    % *.ps
    

    to

    % screen -d -m okular *.ps
    

    after you do

    alias -s ps='screen -d -m okular'
    

    . But you need to define this alias for every file suffix. It is also processed before most expansions so if

    % *.p?
    

    matches same files as *.ps it won’t open anything.

    Second is command_not_found handler:

    function command_not_found_handler()
    {
        emulate -L zsh
        for file in $@ ; do test -e $file && xdg-open $file:A ; done
    }
    

    . But this does not work for absolute or relative paths, only for something that does not contain forward slashes.

    Third is a hack overriding accept-line widget:

    function xdg-open()
    {
        emulate -L zsh
        for arg in $@ ; do
            command xdg-open $arg
        endfor
    }
    function _-accept-line()
    {
        emulate -L zsh
        FILE="${(z)BUFFER[1]}"
        whence $FILE &>/dev/null || BUFFER="xdg-open $BUFFER"
        zle .accept-line
    }
    zle -N accept-line _-accept-line
    

    . The above alters the history (I can show how to avoid this) and is rather hackish. Good it does not disable suffix aliases (whence '*.ps' returns the value of the alias), I used to think it does. It does disable autocd though. I can avoid this (just || test -d $FILE after whence test), but who knows how many other things are getting corrupt as well. If you are fine with the first and second solutions better to use them.