Use Netrw ou Nerdtree em Zsh / Bash para selecionar um arquivo POR BROWSING?

3

Muitas vezes eu me encontro no shell, querendo inserir um nome de arquivo em um longo comando.

Gostaria de encontrar um atalho e usar o Netrw ou o Nerdtree para navegar por um arquivo ou diretório, e colá-lo no comando que estou criando.

Então, se eu estivesse em uma pasta e quisesse comparar dois arquivos:

  • eu digitaria diff
  • , em seguida, gostaria de acessar meu atalho e navegar visualmente usando Netrw ou Nerdtree e selecionar um arquivo.
  • Esse nome de arquivo agora é adicionado ao meu comando diff ... por exemplo %código%
  • Eu acertei o atalho novamente e procurei o segundo arquivo, %código%
  • isso adiciona o segundo arquivo ao meu comando diff /tmp/file1.txt , então agora tenho:

    diff /tmp/file1.txt /super/ez/another/file/somewhere/else/compare.txt
    

Isso é possível usando qualquer ferramenta ? Eu gosto de Netrw no Vim, mas estou disposto a tentar coisas novas!

Note que não estou interessado na conclusão de Tab de nomes de arquivos usando globbing. Isso funciona às vezes, mas não o tempo todo. Eu gosto de Netrw e adoraria descobrir como usá-lo para selecionar um nome de arquivo navegando.

    
por Brad Parks 07.12.2014 / 03:28

2 respostas

2

Você basicamente já sabe a resposta de aqui . É muito fácil colocar tudo isso assim:

function insert_files() {
    vifm -f < /dev/tty > /dev/tty

    while read l; do
        LBUFFER+="'$l' "
    done < ~/.vifm/vimfiles

    zle reset-prompt
}
zle -N insert_files
bindkey '^t' insert_files

Eu não sou um usuário zsh, então eu roubei a estrutura do código da resposta do Lucas. Quanto ao bash, eu estava procurando uma maneira de processar a saída do comando externo dentro do atalho, mas não encontrei um.

P.S. Meu código contém escape bastante primitivo, você pode querer melhorar isso e talvez mudar a maneira como o espaçamento é adicionado entre os argumentos.

    
por 11.12.2014 / 09:03
4

O Zsh permite que você ligue uma função do shell a uma chave e também tenha um builtin para colocar texto em sua linha de comando. Então você pode fazer algo assim (em zsh):

# define a function that does the work
function my_browser_function () {
  local result
  result=$( some command that returns the filename )
  # print -z $result (see comments)
  LBUFFER+=$result
}
# turn the function into a widget
zle -N my_browser_function
# bind it to some key ("CTRL-X I" for example)
bindkey '\Cxi' my_browser_function

Agora, você só precisa obter um comando que permita navegar pelo sistema de arquivos da maneira que deseja e imprimir o resultado no stdout.

EDITAR: Aqui está uma versão muito básica da função acima que usa o vim:

function my_browser_function () {
  local file=$(mktemp)
  vim -c "map <C-A> :cal system('echo '.expand('%').'/'.getline('.').'>$file')<bar>q<cr>" .
  LBUFFER+=$(<$file)
  rm $file
}

Você pode navegar no vim / netrw como de costume e usar < C-A > (Ctrl-A) para A ccepta o nome do arquivo / diretório.

Obviamente, esta é apenas uma função muito básica. Se você quiser mais funcionalidade, você também pode escrever uma função de carregamento automático vim e chamá-la da linha de comando vim com -c.

    
por 07.12.2014 / 13:10

Tags