Abrir no vim de zsh em 'filenamecr', talvez preexec hook?

2

BREVE HISTÓRICO:

os seguintes trabalhos ...

function default_open_in_vim () {
    filename=$(echo -e "$1" | tr -d '[:space:]')
    if [[ -f $filename ]]; then
        vim $filename
    fi
}

autoload -Uz  add-zsh-hook
add-zsh-hook preexec default_open_in_vim

... mas recebo o seguinte quando fecho o vim:

zsh: permission denied: src/findPathBFS.js

VERSÃO LONGA:

Eu me vejo fazendo a mesma coisa uma e outra vez:

Eu digito CTRL-t para o arquivo fzf find no diretório atual. Em seguida, pressiono enter e fzf insere este nome de arquivo na posição do cursor. Isso é ótimo. às vezes eu estou usando este arquivo, ou catting ou git-checkouting ou o que for. muitas vezes eu estou abrindo no vim e não comecei pelo vim CTRL-t. O que devo fazer agora é CTRL-a para ir para o início da linha no meu terminal e, em seguida, digite vim < cr >.

O problema é que muitas vezes eu nem percebo que eu já não digitei este vim antes do CTRL-t ... você pode ver o problema.

Meu zsh com AUTO_CD irá cd em um diretório se eu digitar um nome de diretório sem prefixar com cd, eu quero que ele faça algo similar: Se eu digitar um nome de arquivo sem prefixá-lo com nada, abra-o no vim.

O gancho do Preexec funciona, mas não gosta da mensagem de erro.

Seria legal se eu pudesse cancelar o comando, mas não parece que zsh me permite cancelar o comando do preexec hook (talvez funcione e eu não saiba sobre isso ou como fazer isso?)

Eu tentei usar command_not_found_handler documentado no man zshmisc, mas não ajuda quando "o comando" é um nome de arquivo válido.

    
por sudavid4 05.03.2018 / 20:56

1 resposta

1

Isso funciona:

command_not_found_handler () {
    if [[ $# -eq 1 && -f $1 ]]; then
      vim "$1"
    else
      exit 127
    fi
}

Acho bastante perigoso, é provável que você execute algo por engano. Por exemplo, se você tentar editar um arquivo no diretório atual que tenha o mesmo nome de um comando no caminho, o comando no caminho será executado. Isso não é um problema com command_not_found_handler , é um problema com sua exigência. Outro problema é se você digitar algo como foo/bar , isso significa editar o arquivo se o arquivo não for executável e executá-lo se for executável.

Se você quiser que os arquivos no diretório atual tenham precedência sobre os comandos do PATH, use o DEBUG trap ou sobrecarregue o comando accept-line editing . Isso não resolveria o segundo problema.

Eu recomendo uma interface de usuário diferente. Não mexa com a execução de comandos. Em vez de pressionar Retornar para editar, pressione uma tecla diferente e configure essa chave para inserir vim na frente da linha. Isso tem alguns bons bônus, incluindo a retenção da chamada para vim no histórico do shell.

zle -N edit-file
edit-file () {
  BUFFER="vim $BUFFER"
  zle accept-line "$@"
}
    
por 05.03.2018 / 22:28

Tags