Zsh/Bash에서 Netrw 또는 Nerdtree를 사용하여 검색하여 파일을 선택하시겠습니까?

Zsh/Bash에서 Netrw 또는 Nerdtree를 사용하여 검색하여 파일을 선택하시겠습니까?

나는 종종 쉘에 들어가 긴 명령에 파일 이름을 삽입하고 싶어합니다.

지름길을 택하고 Netrw 또는 Nerdtree를 사용하여검색파일이나 디렉토리를 찾아서 제가 작성 중인 명령에 붙여넣으세요.

따라서 폴더에 있고 두 파일을 비교하려면 다음을 수행하십시오.

  • 나는 들어갈 것이다diff

  • 그런 다음 바로가기를 클릭하고 Netrw 또는 Nerdtree를 사용하여 시각적으로 탐색하고 파일을 선택하고 싶습니다.

  • 이제 파일 이름이 내 diff 명령에 추가되었습니다...예:diff /tmp/file1.txt

  • 다시 바로가기를 클릭해서 두 번째 파일을 찾아보니, /super/ez/another/file/somewhere/else/compare.txt

  • 그런 다음 내 명령에 두 번째 파일을 추가하여 diff이제 다음을 갖게 되었습니다.

      diff /tmp/file1.txt /super/ez/another/file/somewhere/else/compare.txt
    

이거 사용할 수 있어?어떤 도구라도? 저는 Vim의 Netrw를 좋아하지만 새로운 것을 시도해 볼 의향이 있습니다!

Tab파일 이름을 완성하기 위해 와일드카드를 사용하는 데는 관심이 없습니다. 이것은 때때로 작동하지만 항상 그런 것은 아닙니다. 저는 Netrw를 좋아하며 이를 사용하여 탐색하여 파일 이름을 선택하는 방법을 알고 싶습니다.

답변1

Zsh를 사용하면 셸 기능을 키에 바인딩할 수 있으며, 명령줄에 텍스트를 입력하는 내장 기능도 있습니다. 따라서 다음과 같이 할 수 있습니다(zsh에서):

# define a function that does the work
function my_browser_function () {
  local result
  result=$( some command that returns the filename )
  # print -z $result (see comments)
  LBUFFER+=$result
}
# turn the function into a widget
zle -N my_browser_function
# bind it to some key ("CTRL-X I" for example)
bindkey '\Cxi' my_browser_function

이제 원하는 방식으로 파일 시스템을 검색하고 결과를 표준 출력으로 인쇄할 수 있는 명령을 실행하기만 하면 됩니다.

편집: vim을 사용하는 위 함수의 매우 기본적인 버전은 다음과 같습니다.

function my_browser_function () {
  local file=$(mktemp)
  vim -c "map <C-A> :cal system('echo '.expand('%').'/'.getline('.').'>$file')<bar>q<cr>" .
  LBUFFER+=$(<$file)
  rm $file
}

평소처럼 vim/netrw를 탐색하고 <CA>(Ctrl-A)를 사용하여 다음을 수행할 수 있습니다.파일/디렉토리 이름을 허용합니다.

분명히 이것은 아주 기본적인 기능일뿐입니다. 더 많은 기능을 원한다면 vim 자동 로드 기능을 작성하고 -c를 사용하여 vim 명령줄에서 호출할 수도 있습니다.

답변2

2022년 버전의 답변

Vifm v0.8 이상에서는 options 를 통해 이를 달성하는 더 나은 방법을 제공합니다 --choose-files. 이는 구성 디렉터리 위치와 독립적입니다.

zsh 버전

function insert_files() {
    local file
    while read file; do
        LBUFFER+="$(printf %q "$file") "
    done <<< "$(vifm --choose-files - < /dev/tty)"

    zle reset-prompt
}
zle -N insert_files
bindkey '^t' insert_files

배쉬 버전

function _insert_files() {
    local file
    local files
    while read -r file; do
        files="$files$(printf %q "$file") "
    done <<< "$(vifm --choose-files - < /dev/tty)"

    local prefix=${READLINE_LINE::READLINE_POINT}
    local suffix=${READLINE_LINE:READLINE_POINT}
    READLINE_LINE=${prefix}${files}${suffix}
    READLINE_POINT=$(( READLINE_POINT + ${#files} ))
}
bind -x '"\C-T": _insert_files'

원래 답변 (2014)

당신은 기본적으로 이미 답을 알고 있습니다여기. 아래 그림과 같이 이 모든 것을 하나로 묶는 것은 매우 쉽습니다.

function insert_files() {
    vifm -f < /dev/tty > /dev/tty

    while read l; do
        LBUFFER+="'$l' "
    done < ~/.vifm/vimfiles

    zle reset-prompt
}
zle -N insert_files
bindkey '^t' insert_files

저는 zsh 사용자가 아니기 때문에 Lucas의 답변에서 코드 구조를 훔쳤습니다. Bash의 경우 바로가기 내에서 외부 명령의 출력을 처리하는 방법을 찾았지만 찾을 수 없었습니다.

데모

PS 내 코드에는 매우 원시적인 이스케이프가 포함되어 있으므로 이를 개선하고 매개변수 사이에 공백을 추가하는 방식을 변경하고 싶을 수도 있습니다.

관련 정보