주문을 선택하시겠습니까?

5257 단어 BashPeco
cd 커맨드 개조 기사 제4회입니다.
마지막 기사 : 주문은 상위 디렉토리로 돌아가는가?

또한 cd 명령에 손을 넣습니다.

이번에는 Simplistic interactive filtering tool의 Peco을 사용합니다.

제4마리 「peco를 하는 이야기」



몇 번 달인지 모르겠지만, peco라는 선택 도구를 도입하여 사용해 나가려고 생각합니다.
fzf라도 있기 때문에, 쉘 변수라든지 환경 변수로 해 여러가지 툴을 선택할 수 있도록 범용적으로 해 가면 좋네요. (그 예정은 없지만)

peco 도입



리포지토리 거리 에 넣어 주세요.
보통, 출시 페이지 로부터 바이너리 떨어뜨려 PATH에 넣는 것 뿐입니다.

무엇을 peco하는가?



우선, 샘플로서 제일 기사가 많은 커멘드 이력을 peco 해 봅시다.

사양은 텍토인 느낌으로 좋지요.
- 새로운 역사가 위로 올 것
- 같은 이력은 최근의 물건만으로 좋다(중복해서 표시하지 않는다)

bashrc
peco_history()
{
  local descending_order
  if which sort &> /dev/null; then
    descending_order='sort -r'
  elif which tac &> /dev/null; then
    descending_order='tac'
  else
    descending_order='tail -r'
  fi
  local trim_line_number='sed -re "s/^\s+[0-9]+\s+//"'
  local trim_duplication='awk '\''!dictionaty[$0]++'\'''
  local CMD=$(\history \
              | eval $descending_order \
              | eval $trim_line_number \
              | eval $trim_duplication \
              | peco --query "${READLINE_LINE}")
  READLINE_LINE="${CMD}"  # Input to terminal's readline
  READLINE_POINT=${#CMD}  # Set cursor
}

bind -x '"\C-r": peco_history'

스크립트 해설



우선, 이 스크립트는 처리하고 싶은 것을 커멘드로 나타내, 그것을 로컬 변수에 격납하는 스타일을 취하고 있습니다.

그렇지 않으면, 바보의 나는 토일요일을 지나면 "이 명령은 무엇을 실현하고 싶어……?"이 되어 버리기 때문입니다.

  • descending_order
    새로운 이력을 위로 가져오는 사양을 충족하기 위해 내림차순으로 정렬하는 처리를 담당하고 있습니다.
    아무도 이것도 bash의 내장이 아니었기 때문에 가지고 있는지를 조사하고 있습니다.
    우선 3 개를 조사하면 어느 것이 있겠지 (´・_・`)tac은 Mac에서는 안 된다든가

  • trim_line_number
    이번에는 이력 취득에 history 명령을 내장 실행하고 있습니다만, 이력 번호를 부여해 버리므로 그것을 제거합니다.

  • trim_duplication
    히스토리 표시는 중복하지 않는 사양을 채우기 위해, 사전식 배열을 만드는 것으로 실현하고 있습니다.
    awk에서 이런 생각한 사람 천재군요

  • 이들은 변수에 저장되므로 주어진 순서대로 eval 명령으로 실행하여 마지막으로 peco로 파이프합니다.
  • --query 옵션
    peco의 query 옵션은 초기 QUERY로 문자열을 전달하는 것 같습니다.
    이미 입력되어 있는 문자열을 건네주는 것으로, 입력 도중에 실행하면 처음부터 그 문자열로 좁혀 둘 수 있습니다.

  • 마지막으로 terminal에 반영하기 위해 변수에 결과를 저장합니다.

  • READLINE_LINE
    terminal에 입력된 문자열을 peco에서 선택한 결과로 바꿉니다.
    peco로 복수 선택했을 경우의 케어? 알려주세요

  • READLINE_POINT
    terminal 의 커서의 위치를 ​​캐릭터 라인의 마지막으로 하고 있습니다.
    변수에 #을 붙이면 변수 확장이 이루어져 문자열을 얻을 수 있습니다.
    참고 : 【쉘 연예인에의 길】 Bash의 변수 전개와 진지하게 마주한다

  • 마지막은 이것을 기본적으로 히스토리 검색을 담당하는 바로 가기 키를 bind 명령으로 덮어 쓰면 끝입니다.

    마지막



    이런 느낌으로 사용할 수 있습니다.
    상당히 편리하네요.



    git log를 파스하거나 여러가지로 두면 편리할지도 모르겠네요.
    좀 더이 peco를 사용하고 싶습니다.

    또는 명령 이름을 입력 할 때,
    그 잘못된 명령을 기록에 쓰지 않는 방법이 있습니까? (´・_・`)다레카

    좋은 웹페이지 즐겨찾기