탭 완성 기능을 사용하여 명령줄에서 상대 경로를 확장하려면 어떻게 해야 합니까?

탭 완성 기능을 사용하여 명령줄에서 상대 경로를 확장하려면 어떻게 해야 합니까?

bash탭 완성 기능을 사용하여 상대 경로를 절대 경로로 확장할 수 있는 방법이 있습니까 ?

가끔 파일을 검색해서 찾은 다음 다음과 같이 하기 때문에 묻습니다 vim.

cd /etc
cd apache2
cd sites-available
vim 000-default

그런 다음 다른 작업을 수행하고 디렉토리를 변경하겠습니다.

cd /tmp
ls
cd ~
ls

그런 다음 동일한 파일을 다시 편집해야 하지만 history파일 경로가 상대적이기 때문에 ,(또는 기록 검색)을 사용할 수 없다는 것을 알게 됩니다.

현재 해결 방법

파일을 많이 재사용할 것이라는 것을 안다면 파일을 찾은 후 다음과 같은 방법을 사용하여 전체 경로를 가져옵니다 realpath.

$ realpath 000-default
/etc/apache2/sites-available/000-default
(copy and paste path into next command:)
$ vi /etc/apache2/sites-available/000-default

주의사항

여전히 복사하여 붙여넣기가 필요합니다. 내 기록에 파일의 전체 경로를 가져오는 더 쉬운 방법이 있어야 한다고 생각합니다. 어떤 옵션이 있나요?

나는 상대 경로를 전체 경로로 확장하기 전에 (우연히) 일부 키 조합을 눌렀다고 생각합니다. Bash에서는 다음을 입력할 수 있다는 것을 알고 있습니다.

cd /etc
ls bash_*(control+x *)

그리고 얻다:

ls bash.bashrc bash_completion bash_completion.d

그러면 상대 경로를 절대 경로로 확장하여 해당 파일의 전체 경로를 사용하여 내 기록의 파일에 대한 작업을 저장할 수 있는 방법이 있습니까?

답변1

나는 그것을 할 좋은 방법을 찾을 수 없습니다.

내가 하는 일은 $PWD파일 이름 앞에 입력한 다음 눌러서 Tab확장하는 것입니다. 에서 대신 ++ 를 bash눌러야 할 수도 있습니다 .CtrlAlteTab

예를 들어

vi $PWD/000-default

그 다음에

Ctrl+ Alt+e

그 다음에

Enter

답변2

이를 위해 bash 내에서 프로그래밍 가능한 탭 완성을 사용할 수 있습니다.

function _vim_complete_file() {
    IFS=$'\n' read -d '' -a FILES <<< "$( compgen -A file "${COMP_WORDS[$COMP_CWORD]}" )"
    IFS=$'\n' read -d '' -a COMPREPLY <<< "$( realpath "${FILES[@]}" )"
}

complete -F _vim_complete_file vim

이제 를 입력하면 로 vim 000TAB대체됩니다 .000/path/to/000-default

설명
이것이 작동하는 방식은 에 대한 인수를 누를 때마다 complete -F _vim_complete_file vimbash에게 함수를 사용하도록 지시하는 것 입니다 . 그런 다음 TAB을 누를 때 커서가 있던 현재 단어에서 함수 가 실행됩니다 . 그러면 일치하는 파일 목록이 반환됩니다. 그런 다음 해당 파일 목록이 전달되어 정규화된 경로를 생성합니다. 이 목록은 쉘이 사용 가능한 완성 항목을 찾는 배열로 저장됩니다 ._vim_complete_fileTABvim
compgen -A file
realpathCOMPREPLY

답변3

이전 디렉터리로 돌아가는 것이 더 쉽도록 pushd 및 popd 사용을 시작할 수 있습니다.http://gnu.org/software/bash/manual/bashref.html#The-Directory-Stack

귀하의 의견을 보았습니다 cdargs(제 생각에는이것). 자주 사용하는 디렉터리에는 별칭이나 함수를 사용합니다. 예를 들어

alias cgi='pushd /path/to/apache/cgi-bin'

또는

docs() { pushd /path/to/apache/docroot/"$1"; }

두 번째 형식은 다음과 같은 경우에 유용합니다.부모의하위 디렉토리가 자주 있는 디렉토리를 docs foo선택하면 /path/to/apache/docroot/foo. 단점은 탭 완성 기능을 잃게 된다는 점인데, 나에게는 그렇게 힘들지는 않았다.

답변4

Vim에서 다시 편집하는 경우 :browse oldfiles및 를 확인하세요 :help oldfiles.

관련 정보