Tentando fazer aliases que abrem o último arquivo modificado

1

Uma coisa que costumo fazer é editar os arquivos modificados mais recentemente, então ao invés de digitar "ls -lr" e depois "vim lastfile", eu pensei em fazer alguns atalhos no meu arquivo ~ / .bash_profile:

alias via="vim 'ls -rt | tail -1'"
alias vib="vim 'ls -rt | tail -2 | head -1'"
alias vic="vim 'ls -rt | tail -3 | head -1'"
alias vid="vim 'ls -rt | tail -4 | head -1'"
alias vie="vim 'ls -rt | tail -5 | head -1'"

O problema é que, estranhamente, esses comandos não funcionam. Eles abrem algum arquivo que não é um dos últimos, ou até mesmo um arquivo foi excluído do diretório atual (eu me pergunto se há algum tipo de problema de atualização do cache de arquivos no diretório. Isso ocorre tanto na máquina local quanto no cluster I trabalho em).

No entanto, se eu digitar vim 'ls -rt | tail -1' diretamente, sem usar o alias, ele funcionará sempre.

    
por Nick 08.11.2014 / 20:10

2 respostas

4

O problema é que você precisa citar os backticks em sua definição de alias. Aspas duplas ( " ) não citam a substituição do comando. Você precisará de aspas simples ( ' ). Use

alias via='vim 'ls -rt | tail -1''

Embora você realmente queira:

alias via='vim -- "$(ls -t | head -n 1)"'

Isto é:

  • use a forma moderna de substituição de comando ( $(...) ) enquanto estivermos nisso.
  • faça uma citação para desabilitar o operador split + glob (caso contrário, não funcionaria corretamente se o nome do arquivo tivesse caracteres IFS ou curingas (ainda não funciona se tiver caracteres de nova linha)).
  • Use -- para marcar o final das opções para vim (caso contrário, não funcionaria para nomes de arquivos que começam com - ou + ).
  • Use ls -t | head em vez de ls -rt | tail para obter o resultado mais cedo.

Não use

alias via="vim 'ls -rt | tail -1'"

Se você fizer isso, a substituição do comando acontece quando você define o alias, não quando você o executa. Tente digitar alias via para ver que a saída não é realmente alias via='vim 'ls -rt | tail -1'' , mas sim alias via='vim <prematurely expanded output>' .

    
por 08.11.2014 / 20:17
1

Com zsh (também pré-instalado no OS / X) e supondo que você esteja usando o sistema de conclusão ( compinit e co), Ctrl + X m torna-se um complemento que se expande para o arquivo mais recente.

Então:

vi Ctrl+Xm

Faz com que você edite o arquivo mais recente (você também terá a chance de ver qual antes de pressionar Retornar ).

vi Alt+2Ctrl+Xm

Para o segundo arquivo mais recente.

vi *.cCtrl+Xm

para o mais novo arquivo c .

vi *(.)Ctrl+Xm

para o mais novo arquivo regular (não diretório, nem fifo / device ...), e assim por diante.

Você também define seu alias como:

alias via='vim -- *(.om[1])'

Para editar o arquivo regular mais recente (não oculto) no diretório atual sem os problemas envolvidos na análise da saída de ls .

Com bash e assumindo a implementação GNU de find e sort , você pode conseguir o mesmo com uma função como:

via() {
  local file
  IFS=/ read -rd '' file file < <(
    find . -maxdepth 1 -type f  ! -name '.*' -printf '%T@/%f
via() {
  local files
  readarray -d '' -t files < <(
    find . -maxdepth 1 -type f  ! -name '.*' -printf '%T@/%f
via 3
' | sort -rzn | cut -zd / -f 2 ) && ((${#files[@]} >= ${1-1} )) && vim -- "${files[${1-1}-1]}" }
' | sort -rzn ) && vim -- "$file" }

Que você poderia parametrizar para poder especificar o segundo, terceiro ... o mais novo arquivo com (assumindo o GNU Bash 4.4 ou mais novo e o GNU coreutils 8.25 ou mais recente):

vi Ctrl+Xm

Para usar como:

vi Alt+2Ctrl+Xm

por exemplo, para editar o terceiro arquivo mais recente.

    
por 17.08.2016 / 13:29