
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 000
TAB대체됩니다 .000
/path/to/000-default
설명하다
작동 방식은 인수를 누를 때 bash에게 complete -F _vim_complete_file vim
함수를 사용하도록 지시하는 것입니다. 그러면 TAB을 눌렀을 때 커서가 있던 현재 단어에서 함수가 실행됩니다. 그러면 일치하는 파일 목록이 반환됩니다. 그런 다음 이 파일 목록이 전달되어 정규화된 경로를 생성합니다. 목록은 쉘이 사용 가능한 완성을 찾는 배열로 저장됩니다._vim_complete_file
TABvim
compgen -A file
realpath
COMPREPLY
답변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
.