Frage

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?

War es hilfreich?

Lösung

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.

Andere Tipps

I guess you can use "fasd_cd" which has an alias v which uses viminfo file to identifi files which you have opened at least once. In my environment it works like a charm.

Fast cd has other amazing stuff you will love! Don't forget to set this alias on vim to open the last edited file:

alias lvim="vim -c \"normal '0\""
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top