Для zsh
удобной комбинацией клавиш для дублирования предыдущего слова (в зависимости от режима zle) является Esc Ctrl _, это значение по умолчанию в режиме emacs . Вы можете (пере) определить это самостоятельно. например, просто Ctrl _, что хорошо в режиме vi :
bindkey "^_" copy-prev-word
bindkey "^_" copy-prev-shell-word # respects shell quote/escape
С креплениями bash
чтения строки по умолчанию вы можете правильно "редактировать" , а затем выполнить командную строку с Meta- X мета- E. Возможно, вы захотите установить EDITOR
или VISUAL
в предпочитаемый вами редактор, что, надеюсь, упростит задачу дублирования слова.
Вы можете почти, но не совсем использовать zsh copy-prev-word
в bash, но его представление о том, что такое слово, не всегда делает вас счастливым (строго буквенно-цифровым):
bind "\C-_: copy-backward-word"
затем Ctrl _ Ctrl Y, чтобы вызвать.
Более новые версии bash (начиная с 4.0) поддерживают слова оболочки, но не для копирования, только для движения / удаления, поэтому небольшой взлом:
bind "\C-_: shell-backward-kill-word"
Вы можете вырезать, а затем вставить (вернуть) слово назад дважды с двойным Ctrl Y.
Bash также позволяет вам связать функцию оболочки, и в этом случае вы можете делать творческие вещи, изменяя переменные READLINE_LINE
и READLINE_POINT
, но у меня пока нет такой функции для передачи. Вот игрушечная функция (минимум bash-4.3), которая либо дублирует последнее слово оболочки, либо, если последнее слово выглядит как команда sed
применяет ее ко второму последнему слову оболочки и заменяет себя.
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"'
Пример:
mv "some/path/File With A Long Name.txt" s/txt/bak/
Ctrl _
затем расширяется в строке ввода до:
mv some/path/File\ With\ A\ Long\ Name.txt some/path/File\ With\ A\ Long\ Name.bak
(вы заметите, что слова в кавычках становятся экранированными, поскольку printf %q
используется для безопасного расширения)
Этот последний вариант, возможно, чрезмерно растягивает то, что можно считать "в оболочке". если у вас есть vim
со netrw
, вы можете просто отредактировать каталог как файл:
vim .
- использовать обычные функции поиска / навигации
- используйте R, чтобы переименовать файл / каталог в курсоре
Смотрите также: https://unix.stackexchange.com/questions/132235/quickest-way-to-rename-files-without-retyping-directory-path