..png)
나는 zsh를 처음 접했습니다 (어제 bash에서 이동했습니다)
나는 bash에 bash 기능을 가지고있었습니다.
vl() { cmd=`echo $1 | sed -r 's/(.+):([0-9]+).+/\1 +\2/g'`; vim $cmd }
이것은 기본적으로 다음과 같은 인수를 변환합니다.
vl ./manifests/production/test.pp:387:foobar # A output of $grep -iHn test
에게
vim ./manifests/production/test.pp +387 #Aim is to open file at line-number 387
zsh의 동일한 기능이 예상대로 작동하지 않습니다. 이름 이 추가된 ./manifests/production/test.pp +387
파일을 여는 대신 vim에서 이름 ./manifests/production/test.pp
이 붙은 파일을 엽니다 . +387
에 따옴표를 추가하는 것 같습니다 $cmd
.
누군가 여기서 무슨 일이 일어나고 있는지 설명하면 좋을 것입니다. 감사해요
답변1
Bourne 쉘, dash, ksh 및 bash와 같은 일반적인 Bourne 스타일 쉘에서 구문은 $variable
"변수의 값을 가져와서 문자가 IFS
나타나는 별도의 단어로 분할하고 각 단어를 파일 이름 와일드카드 패턴으로 처리하고 더 많은 파일 중 하나와 일치하면 확장하십시오.” 배열인 경우 variable
이는 배열의 첫 번째 요소에 발생하고 다른 요소는 무시됩니다.
zsh에서 구문은 $variable
"변수 값을 가져오고 비어 있으면 제거하는 것을 제외하고"를 의미합니다. 배열인 경우 variable
이는 배열의 모든 요소에 발생합니다. Zsh 애호가들은 zsh 방식이 더 우수하다고 생각합니다.
$=variable
zsh에서는 단어 분할을 수행하도록 작성할 수 있습니다 . 하지만 이것이 현재 하고 있는 일을 수행하는 최선의 방법은 아닙니다. 귀하의 bash 기능은 파일 이름의 공백을 처리하지 않으며 $=variable
zsh에서도 사용할 수 없습니다. 다음은 bash와 zsh 모두에서 작동하고 :
파일 이름을 제외한 모든 문자에 대처하는 인수를 구문 분석하는 다른 방법입니다 . 인수에 두 개의 콜론이 포함된 경우 첫 번째 콜론 뒤의 모든 내용은 제거되고 첫 번째 콜론과 두 번째 콜론 사이의 부분은 기호 앞에 별도의 인수로 추가됩니다 +
. 코드보다 약간 길지만 이해하기가 덜 어렵지 않으며 파일 이름에 공백이 있다는 첫 번째 힌트가 있어도 막히지 않습니다.
vl () {
local suffix
case $1 in
*:*:*) suffix=${1#*:};; set -- "${1%%:*}" "+${suffix%%:*}";;
esac
vim "$@"
}
답변2
까다로운 문제입니다 :) 한 가지 해결 방법은 다음과 같이 함수를 정의하는 것입니다.
vl() { cmd=$(echo $1 | sed -r 's/(.+):([0-9]+).+/\1 +\2/g'); eval "vim $cmd"; }
eval
해결 방법은 필요한 스택 교환 편집이 부족하기 때문에 수행해야 했던 다른 사소한 수정이 아니라 를 사용하는 것입니다. 8-)