: 명령에서 전체 문자열을 이스케이프 처리하는 방법은 무엇입니까?


13

보자 나는이 gvim존중, 실행하고 나는 파일을 열고 원하는 autocmd을 (를 배제한다--remote-tab ).

이제 나는 (기본적으로 약간의 조정으로) 할 수 있다는 것을 알고 있습니다.

gvim --remote-send ":tabe my_file<CR>" 

작동합니다. 그러나 파일에 공백이나 이상한 문자가 있으면 다음을 수행해야합니다.

gvim --remote-send ":tabe my\\ file<CR>"

(더블 \\은 쉘 중 하나가 먹기 때문에 수동으로 입력하는 것과 같습니다.

`:tabe my\ file` 

에서 vim) 그것은 작동합니다. 이제 쉘에서 문자열을 만드는 방법을 찾을 수 있지만 ": tabe"명령에서 문자열을 "전역 적으로 인용"할 수 있기를 바랍니다.

 gvim --remote-send ":tabe 'my file'<CR>"

또는

 gvim --remote-send ":tabe \"my file\"<CR>"

--- vim 명령 줄에 직접 쓰는 것과 같습니다 :tabe "my file". 작동하지 않는 것 같습니다. 쉘을 사용하여 문자열의 모든 공간을 명시 적으로 인용 할 수 있습니다.

# <ESC> because the gvim instance can be in a mode different from normal
# the double CR: do not ask. 
# the argument MUST be a full path
file="$(readlink -f "$@")"
fileq="$(echo "$file" |  awk '{gsub(/ /,"\\\ ")}1')" # quote spaces FIXME add other chars
exec gvim 2>/dev/null --servername $desktop --remote-send "<ESC>:tabe $fileq <CR><CR>"

그러나 공백과 탭과 같은 다른 특수 문자는 사용할 수 "없으며 (줄 바꿈도 없지만 파일 이름에 줄 바꿈이 있으면 자격이 있습니다!).

질문 :

특정 쉘에서 독립적으로 :-) 다음에 다룰 것입니다. "strange"문자를 하나씩 인용하지 않고 파일 이름을 전역 적으로 인용하기 위해 vim 줄에 직접 입력 하는 방법이 tabe:있습니까?


1
쉘에 크게 의존하는 것 같습니다. gvim --remote-send ':tabe foo\ bar.txt<CR>'bash와 zsh에서 나를 위해 일했습니다. 그리고 따옴표도 중요해 보입니다. "내부적으로 사용하면 작동 '하지 않았지만 다음과 같이했습니다.gvim --remote-send ":tabe 'foo bar.txt'<CR>"
muru

흠 ... gvim --remote-send ":tabe 'f s.txt'<CR>"나에게 도움이되지 않았고 :tabe 'f s.txt'vim에 글을 쓰지 못했습니다 E77: Too many files names.
Rmano 2019

1
gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"더 간단 하지 않습니까?
muru

1
shellescape기능이 도움이 되겠습니까?
EvergreenTree

1
있다는 사실을 양지해야합니다 :edit(및 그 변종)가 인용 파일 이름을 허용하지 않습니다. 모든 특수 문자는 개별적으로 이스케이프해야합니다. 따라서 :edit "foo bar.txt"작동하지 않습니다. 당신은 필요합니다 :edit foo\ bar.txt. 즉, :execute 'tabedit' escape('$file', ' ')올바른 길에있을 수 있습니다.
tommcdo

답변:


2

일반적인 정보와 모든 의견 덕분에이 스크립트는 "이 데스크탑에서 gvim의 탭에서 열기"스크립트를 작성하는 데 사용하는 스크립트입니다.

#!/bin/bash -x
#
# this is convoluted because it has to finish in an exec to keep the DM happy
# remember to set StartupNotify=false in the .desktop file
#
desktop=desktop_$(xprop -root -notype  _NET_CURRENT_DESKTOP | perl -pe 's/.*?= (\d+)/$1/')

if ! vim --serverlist | grep -iq $desktop; then #we need to start the server
    if [ $# != 0 ]; then 
        exec gvim 2>/dev/null --servername $desktop "$@"
    else
        exec gvim 2>/dev/null --servername $desktop  #no files 
    fi
fi
# the only case here is if we need to open a tab in an existing server
if [ $# != 0 ]; then  
        # Do not use --remote-tab, see http://vi.stackexchange.com/questions/2066/different-autocmd-behavior-when-using-remote-tab-silent
        # <ESC> because the gvim instance can be in a mode different from normal
        # the double CR: do not ask. 
        # the argument MUST be a full path
        file="$(readlink -f "$@")"
        #fileq="$(echo "$file" |  awk '{gsub(/ /,"\\\ ")}1')" # quote spaces FIXME add other chars
        fileq=${file// /\\ } # quote spaces FIXME add other chars
        exec gvim 2>/dev/null --servername $desktop --remote-send "<ESC>:tabe $fileq <CR><CR>"
fi

0

내가 Vim에 보낸 것은 '<C-\\><C-N>:1wincmd<C-q>x20w<CR>' 공간이 x20으로 정의되어 16 진수 $ 20을 의미합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.