vim이 %를 파일 이름으로 바꾸는 것을 방지

vim이 %를 파일 이름으로 바꾸는 것을 방지

저는 .vimrc를 가지고 놀고 있는데 다음과 같은 아이디어가 생겼습니다. 다음과 같은 기능이 있습니다:

function Fill_line ()
       execute "! printf '=%.0s' {1..10}"
endfunction

내 결과는 다음과 같습니다

Hello =test.cpp.0s

나는 그것이되기를 원합니다 :

==========

나는 또한 이것을 시도했습니다 :

function Fill_line ()
       execute "! printf '=\%.0s' {1..10}"
endfunction

%내 질문은 문자를 파일 이름으로 바꾸지 않도록 문자를 이스케이프 처리하는 방법입니다 . 이는 다른 복잡한 기능을 단순화한 예라는 점을 명심하세요.

답변1

두 개의 백슬래시를 사용하거나 작은따옴표를 사용해야 합니다.

execute "! printf '=\\%.0s' {1..10}"

execute '! printf "=\%.0s" {1..10}'

큰따옴표로 묶인 문자열( )을 구문 분석할 때 vim이 알고 있는 이스케이프 문자(예: 또는 ) "..."를 시작하지 않는 모든 백슬래시를 제거하므로 명령에 전달된 문자열은 결국 가 되고 다음이 되기 때문에 이것이 필요합니다. 현재 파일 이름으로 대체됩니다.\n\x0aexecute! printf '=%.0s' {1..10}%

답변2

대안으로 지도를 고려해보세요. 현재 행을 강조 표시하는 지도가 있습니다.

map <Leader>= "ayy"ap:s/./=/g<CR>:nohlsearch<CR>

내 지도 리더는 =일반 모드에서 현재 행에 밑줄을 긋기 위한 것 입니다 ==.

답변3

무엇을 하려는지 명확하지 않기 때문에:

  1. 현재 행을 =80열에 채웁니다.

    map _= :execute 'normal A' . repeat("=", (80-col("$")+1))<cr>
    
  2. 현재 줄에 밑줄을 긋습니다.

    map _= :co.<cr>Vr=
    
  3. 구분 기호 추가(80자)

    map _= :call append(line('.'), repeat("=", 80))<cr>
    

답변4

다른 사람들이 이미 정답을 맞췄으므로 %Vim이 현재 파일 이름으로 바꾸지 않도록 이스케이프 처리해야 합니다.:help cmdline-special), 큰따옴표로 묶인 문자열 내부에서는 백슬래시를 두 배로 늘려야 합니다.

그러나 Vim은 다음을 제공합니다.:help shellescape()당신을 위해 작업을 수행하는 기능 (그리고 고려모두특수 문자! ):

execute "! printf " . shellescape("=%.0s",1) . " {1..10}"

여기 당신이 필요합니다각 매개변수를 개별적으로 이스케이프 처리하세요.; printf이는 베어 메탈에는 필요하지 않으며 {1..10}확장을 위해 셸에서 인용해서는 안 됩니다.

printf특별히 비용을 지불 할 필요는 없습니다 . Vim은printf()내장.

관련 정보