Zsh는 현재 인수 목록의 마지막 요소를 참조하고 확장합니다.

Zsh는 현재 인수 목록의 마지막 요소를 참조하고 확장합니다.

내가 다음과 같은 작업을 한다고 가정해 보겠습니다.

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

이것은 재미있는 코드 골프 도전처럼 들립니다. 다음은 한 가지 옵션입니다.

  1. 파일 이름을 사용하여 무해한 명령을 실행합니다. TAB 완료를 허용할 만큼 충분한 파일 이름을 입력합니다.

    : a_file<TAB>
    
  2. !!$이전 명령의 마지막 인수를 참조하는 데 사용됩니다 .

    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-wordZLE 함수, ​​위젯, zshcontrib(1)

관련 정보