Com zsh
, um atalho prático para duplicar a palavra anterior (dependendo do seu modo zle) é Esc Ctrl _ , essa é a padrão no modo emacs . Você pode (re) definir isso sozinho. por exemplo. apenas Ctrl _ que é bom em um modo vi :
bindkey "^_" copy-prev-word
bindkey "^_" copy-prev-shell-word # respects shell quote/escape
Com as ligações padrão readlinebash
readline você pode "editar" corretamente e executar uma linha de comando com Meta- X Meta- E . Você pode querer definir as variáveis EDITOR
ou VISUAL
para o seu editor preferido, o que, esperamos, facilita a tarefa de duplicar uma palavra.
Você pode quase, mas não usa bem o zsh copy-prev-word
no bash, mas sua noção do que uma palavra é nem sempre o fará feliz (estritamente alfanumérico):
bind "\C-_: copy-backward-word"
então Ctrl _ Ctrl Y para invocar.
Versões mais recentes do bash (desde 4.0) suportam palavras shell, mas não para cópia, apenas para motion / delete, então um leve hack é:
bind "\C-_: shell-backward-kill-word"
Você pode cortar e depois colar (puxar) a palavra de volta duas vezes com o duplo Ctrl Y .
O Bash também permite ligar uma função shell, e nesse caso você pode fazer coisas criativas alterando as variáveis READLINE_LINE
e READLINE_POINT
, mas não tenho essa função para entregar agora . Aqui está uma função toy (bash-4.3 minimum) que duplica a última palavra shell, ou se a última palavra parece ser um comando sed
, aplica-a à segunda última palavra shell e se substitui.
function _dupl() {
[[ -z "${READLINE_LINE}" ]] && return # empty, no action
eval local -a aa=( "${READLINE_LINE}" ) 2>/dev/null # split into words
[[ ${#aa} -eq 0 ]] && return # parse problem
if [[ "${aa[-1]:0:2}" == "s/" ]]; then # sed
local _sed=$(sed -e "${aa[-1]}" <<< ${aa[-2]})
unset aa[-1] # remove last word
printf -v READLINE_LINE "%q " "${aa[@]}" # recreate line
printf -v READLINE_LINE "%s%q" "${READLINE_LINE}" "$_sed"
else
printf -v READLINE_LINE "%s %q" "${READLINE_LINE}" "${aa[-1]}"
fi
READLINE_POINT=${#READLINE_LINE} # move cursor to end
}
bind -x '"\C-_":"_dupl"'
Exemplo:
mv "some/path/File With A Long Name.txt" s/txt/bak/
Ctrl _
é então expandido na linha de entrada para:
mv some/path/File\ With\ A\ Long\ Name.txt some/path/File\ With\ A\ Long\ Name.bak
(você notará que as palavras citadas ficam com escape, pois printf %q
é usado para expansão segura)
Esta última opção é possivelmente esticar demais o que se poderia considerar "em uma casca". se você tiver vim
com o script netrw
, basta editar o diretório como um arquivo:
-
vim .
- usar recursos normais de pesquisa / navegação
- use R para renomear o arquivo / diretório no cursor
Veja também: link