![vim이 %를 파일 이름으로 바꾸는 것을 방지](https://linux55.com/image/147042/vim%EC%9D%B4%20%25%EB%A5%BC%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EA%B2%83%EC%9D%84%20%EB%B0%A9%EC%A7%80.png)
저는 .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
\x0a
execute
! printf '=%.0s' {1..10}
%
답변2
대안으로 지도를 고려해보세요. 현재 행을 강조 표시하는 지도가 있습니다.
map <Leader>= "ayy"ap:s/./=/g<CR>:nohlsearch<CR>
내 지도 리더는 =
일반 모드에서 현재 행에 밑줄을 긋기 위한 것 입니다 ==.
답변3
무엇을 하려는지 명확하지 않기 때문에:
현재 행을
=
80열에 채웁니다.map _= :execute 'normal A' . repeat("=", (80-col("$")+1))<cr>
현재 줄에 밑줄을 긋습니다.
map _= :co.<cr>Vr=
구분 기호 추가(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()
내장.