내가 다음과 같은 작업을 한다고 가정해 보겠습니다.
ln a_file_with_a_long_filename.pdf ~/path/to/a/new/hardlink/a_file_with_a_long_filename_slightly_modified.pdf
내 커서가 zsh의 문자열 끝에 있는 경우 a_file_with_a_long_filename.pdf
인용하고 확장할 수 있는 방법이 있습니까 ?ln a_file_with_a_long_filename.pdf ~/path/to/a/new/hardlink/
그렇지 않다면 타이핑 노력을 줄이는 방법을 어떻게 제안합니까?
답변1
ESC-2 ESC-^_
기본 Emacs 바인딩을 사용하면 단지 두 개의 키 코드( 예: Esc 2 Esc Ctrl+ _또는 Alt+ 2 Ctrl+ Alt+ ) 입니다 _. 이것이 순서다copy-prev-word
숫자 매개변수 2를 사용합니다(기본 매개변수 1이 복사됩니다 ~/path/to/a/new/hardlink/
). 파일 이름에 (따옴표로 묶인) 공백이 포함된 경우 필요합니다 . 특히 키보드 레이아웃에서 요구하는 ESC-2 ESC-x copy-prev-shell-word RET
경우 이 명령을 보다 편리한 키에 바인딩할 수 있습니다 . vi 모드에서도 이 명령을 사용할 수 있지만 기본 Cases는 키에 바인딩되지 않습니다. .Shift_
숫자 매개변수가 잘못된 경우 Ctrl+를 눌러 _실행 취소하고 다시 시도하세요.
답변2
이것은 재미있는 코드 골프 도전처럼 들립니다. 다음은 한 가지 옵션입니다.
파일 이름을 사용하여 무해한 명령을 실행합니다. TAB 완료를 허용할 만큼 충분한 파일 이름을 입력합니다.
: a_file<TAB>
!!$
이전 명령의 마지막 인수를 참조하는 데 사용됩니다 .ln !!$ ~/path/to/a/new/hardlink/!!$
zsh의 유용한 참조 덕분에 IFS가 포함된 파일 이름에도 안전합니다. !!$
명령 끝에 불필요한 공백을 추가하면 첫 번째 항목 다음에 공백을 누르자마자 zsh가 파일 이름을 확장한다는 것을 알 수 있습니다 .
필요한 문자 수는 다음과 같습니다.
- 3 x 2 = 6 2
!!$
- 2
:<SPACE>
8+이면 초기 탭을 완료하기에 충분합니다.
답변3
vi
모드 에서는 <esc>0wyt $p
명령 모드로 들어가 0
행의 시작으로 w
다음 단어로 이동하고(파일 이름 앞으로) yt
공백으로 당긴 다음(파일 이름에 공백이 없다고 가정하고 긴 파일 이름을 얻으려면) 그런 다음 $p
방금 당긴 것을 줄 끝에 넣으세요. 이는 동작과 설명을 암기하는 것보다 훨씬 빠릅니다 vi
.
bindkey
두 번째 매개변수를 가져오도록 설정할 수도 있습니다 . 이는 이 유형의 사용 사례에 대한 매우 구체적인 코드이지만 control+t원하는 것은 무엇이든 될 수 있습니다.
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
답변4
가지다copy-earlier-word
, 사용하기 전에 즐겨찾는 키 바인딩에 바인딩하고 다음 줄을 다음에 추가할 수 있습니다 ~/.zshrc
.
autoload -Uz copy-earlier-word
zle -N copy-earlier-word
bindkey "^[," copy-earlier-word
따라서 다음과 같이 명령줄에서 사용할 수 있습니다.
% ln a_file_with_a_long_filename.pdf ~/path/to/a/new/hardlink/<Esc-,><Esc-,>
Esc( - ,(또는 Alt+ ) 키 를 처음 누르면 ,"~/path/to/new/hardlink/"가 생성됩니다. 예:copy-prev-shell-word
, 두 번째로 새로 삽입된 단어를 "a_file_with_a_long_filename.pdf"로 바꿉니다.
이것은 사본이다copy-earlier-word
참조용 문서.
이 위젯은 다음과 같이 작동합니다
insert-last-word
그리고copy-prev-shell-word
. 위젯을 반복적으로 호출하면 관련 기록 줄에서 이전 단어를 검색합니다. 숫자 매개변수 포함질소,끼워 넣다질소히스토리 라인의 첫 번째 단어입니다.질소줄 끝에서부터 계산하면 음수일 수 있습니다.만약에
insert-last-word
이전 기록 줄의 마지막 단어를 검색하는 데 이미 사용되었으며, 반복 호출은 해당 단어를 같은 줄의 이전 단어로 대체합니다.그렇지 않으면 현재 편집 중인 줄의 단어에 위젯이 적용됩니다. 위젯 스타일은 단어를 검색하기 위해 호출되어야 하는 다른 위젯의 이름으로 설정될 수 있습니다. 위젯은 다음과 동일한 세 가지 매개변수를 허용해야 합니다.
insert-last-word
.--
copy-earlier-word
ZLE 함수, 위젯, zshcontrib(1)