Zsh refere-se ao último elemento da lista de argumentos atual e expande-o

3

Suponha que eu faça algo como:

ln a_file_with_a_long_filename.pdf ~/path/to/a/new/hardlink/a_file_with_a_long_filename_slightly_modified.pdf

Existe uma maneira de se referir e expandir a_file_with_a_long_filename.pdf se meu cursor estiver no final da string ln a_file_with_a_long_filename.pdf ~/path/to/a/new/hardlink/ em zsh?

Se não, o que você sugere para reduzir o trabalho de digitação?

    
por student 19.11.2018 / 20:23

4 respostas

3

Com as ligações padrão do Emacs, são apenas dois keychords: ESC-2 ESC-^_ (ou seja, Esc 2 Esc Ctrl _ ou Alt + 2 Ctrl + Alt + ). Esse é o comando copy-prev-word com o argumento numérico 2 (o padrão o argumento 1 copia ~/path/to/a/new/hardlink/ ). Se o nome do arquivo contiver espaços (citados), você precisará de ESC-2 ESC-x copy-prev-shell-word RET . Você pode querer ligar este comando a uma tecla mais conveniente, especialmente se o layout do seu teclado exigir Shift para _ . Você também pode usar esses comandos no modo vi, mas nenhum deles está vinculado a uma chave por padrão.

Se você errar o argumento numérico, pressione Ctrl + _ para desfazer e tente novamente.

    
por 19.11.2018 / 21:32
1

Isso soa como um desafio de golfe de código divertido. Aqui está uma opção:

  1. Execute um comando inócuo com o nome do arquivo; insira o suficiente do nome do arquivo para permitir a conclusão da tabulação.

    : a_file<TAB>
    
  2. Use !!$ para se referir ao último argumento do comando anterior:

    ln !!$ ~/path/to/a/new/hardlink/!!$
    

Graças à citação útil do zsh, isso é seguro, mesmo em face dos nomes de arquivos que contêm o IFS. Você notará que, assim que atingir o espaço após o primeiro !!$ , o zsh expande o nome do arquivo; idem se você adicionar um espaço gratuito no final do comando.

O número de caracteres requeridos é:

  • 3 x 2 = 6 para os dois !!$
  • 2 para o :<SPACE>

8 + mais para completar a tabulação inicial.

    
por 19.11.2018 / 20:53
0

No modo vi , isso seria <esc>0wyt $p , que vai para o modo de comando, 0 início da linha, w para a próxima palavra (avançar para o nome do arquivo) yt yank para o espaço o nome do arquivo longo, assumindo que não há espaços no nome do arquivo) e, em seguida, $p para colocar o que acabou de ser arrancado no final da linha. Isso é muito mais rápido do que descrevê-lo depois de memorizar os movimentos vi .

Você também pode configurar um bindkey para colocar o segundo argumento embora seja um código bastante específico para tal caso de uso, aqui ligado a control + t , mas pode ser o que você quiser.

function yank-put {
  local -a words
  words=(${(z)LBUFFER})
  if (( $#words > 1 )); then
    BUFFER+=$words[2]
    CURSOR+=${#words[2]}
  fi
}
zle -N yank-put
autoload -U yank-put compinit
compinit
set -o vi
bindkey -M viins "^t" yank-put
    
por 19.11.2018 / 21:55
0

Existe copy-earlier-word , você pode vinculá-lo ao seu favorito keybinding antes de usá-lo com o acréscimo dessas linhas a ~/.zshrc :

autoload -Uz copy-earlier-word
zle -N copy-earlier-word
bindkey "^[," copy-earlier-word

Então, você poderia usar assim na linha de comando:

% ln a_file_with_a_long_filename.pdf ~/path/to/a/new/hardlink/<Esc-,><Esc-,>

(O primeiro pressionamento de tecla de Esc - , (ou Alt + , ) produz "~ / caminho / para / novo / hardlink / "como copy-prev-shell-word e a segunda vez que substitui a palavra recém-inserida por "a_arquivo_com_a_long_nome_de_arquivo.pdf").

Aqui está uma cópia do documento copy-earlier-word para referência.

This widget works like a combination of insert-last-word and copy-prev-shell-word. Repeated invocations of the widget retrieve earlier words on the relevant history line. With a numeric argument N, insert the N th word from the history line; N may be negative to count from the end of the line.

If insert-last-word has been used to retrieve the last word on a previous history line, repeated invocations will replace that word with earlier words from the same line.

Otherwise, the widget applies to words on the line currently being edited. The widget style can be set to the name of another widget that should be called to retrieve words. This widget must accept the same three arguments as insert-last-word.

-- copy-earlier-word ZLE Function, widgets, zshcontrib(1)

    
por 20.11.2018 / 00:36