내가 어떻게 빨리 인용 / 인용을 끝내 말과 변화 (예를 들어, 인용 '
에 "
빔에서)? Surround.vim 플러그인 에 대해 알고 있지만 Vim 만 사용하고 싶습니다.
내가 어떻게 빨리 인용 / 인용을 끝내 말과 변화 (예를 들어, 인용 '
에 "
빔에서)? Surround.vim 플러그인 에 대해 알고 있지만 Vim 만 사용하고 싶습니다.
답변:
Surround.vim이 가장 쉬운 해답이 될 것입니다. 실제로 사용하지 않으면 다음과 같이 할 수 있습니다. 반드시 가장 효율적인 것은 아니지만 서라운드 .vim이 작성된 이유입니다.
ciw'Ctrl+r"'
ciw
-커서가있는 단어를 삭제하고 삽입 모드로 끝납니다.'
-첫 번째 견적을 추가하십시오.Ctrl+r"
- "
마지막 yank / delete로 알려진 레지스터 내용을 삽입하십시오 .'
-닫는 따옴표를 추가하십시오.
di'hPl2x
di'
-작은 따옴표로 묶은 단어를 삭제하십시오.hP
-커서를 한 자리 (열기 따옴표 상단)로 이동하고 방금 삭제 한 텍스트를 따옴표 앞에 놓습니다.l
-커서를 한 자리 (오픈 시세 상단) 오른쪽으로 이동하십시오.2x
-두 따옴표를 삭제하십시오.
va':s/\%V'\%V/"/g
va'
-인용 된 단어와 따옴표를 시각적으로 선택하십시오.:s/
-교체를 시작하십시오.\%V'\%V
-시각적으로 선택된 영역 내에있는 작은 따옴표 만 일치시킵니다./"/g
-큰 따옴표로 모두 바꾸십시오.ciw
뿐 아니라 cw
? 첫 번째 혼란스럽고 두 번째는 잘 작동합니다.
ciw
는 커서가 단어의 위치에 관계없이 작동합니다. cw
커서가 단어의 시작 부분에있는 경우에만 작동합니다. 참조하십시오 :help iw
.
.
명령 과 작동하지 않을 수 있습니다 . 작동 시키려면을 사용하십시오 ciw' Ctrl+r Ctrl+p"
. 그러면 .
다음 단어에 대해 원하는대로 작동합니다. 레지스터의 내용을 기억하는 대신 지금 레지스터에있는 모든 것을 원한다는 것을 기억할 것입니다 (설명하기는 어렵지만 둘 다 시도하면 분명해집니다) :-))
작은 따옴표를 사용하여 단어를 인용하십시오.
ciw'Ctrl+r"'
이런 식으로하는 것이 더 쉬웠습니다
ciw '' Esc P
다음은 도움이 될 수있는 몇 가지 매핑입니다.
:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P
mapleader 변수를 변경하지 않은 경우 \q"
\q'
또는 을 사용하여 매핑을 활성화하십시오 \qd
. 커서 아래 단어 주위에 큰 따옴표를 추가하고 커서 아래 단어 주위에 작은 따옴표를 추가하고 커서 아래 단어 주위의 따옴표를 각각 삭제합니다.
map <Leader>' gewi'<Esc>A'<Esc>
하기 위해 .vimrc
파일에 추가 했습니다 . 일부 MSDOS 스크립트를 bash로 변환하는 동안 도움이되었습니다.
:vnoremap <leader>q c""<esc>P
.
매크로 방법!
Enter 키를 눌러 q및 qQ 레지스터에 기록 (우리는 "따옴표"를 기억하는 바로 가기로 "q"를 사용한다).
를 눌러 shift+의 b현재 단어의 앞쪽으로 이동 커서
프레스 i타입 '(작은 따옴표)
를 esc누른 후 e를 눌러 단어 끝으로 이동
단어를 따옴표로 묶으려면을 누른 a다음을 '다시 누르 십시오.
를 눌러 esc일반 모드로 들어갑니다.
마지막으로 눌러 qq
레지스터 에 기록됩니다 .
사용하는 방법
당신은 변경할 수 있습니다 step 4
{줄, 문자를 찾을 때까지의 단어 등}과 같은 내용으로 .
기록 된 매크로를 영구적으로 유지
@ q = ' ctrl+ r ctrl+ rq' 하자
저장하고 종료
파일을 열고 몇 마디로 이동
@q
당신이 올바르게하면 마법의 말이 당신의 말에 나타납니다.
좋아하는 다른 매크로에 대해이 단계를 수행 할 수 있습니다.
@q w
다음 n
with를 사용하여 다음 단어를 따옴표로 묶을 수 있습니다 n@j
.
작은 따옴표로 묶는 것은 (예를 들어) ciw'<C-r>"'<esc>
작동하지만 반복 은 작동하지 않습니다. 시험:
ciw'<C-r><C-o>"'<esc>
기본 레지스터의 내용을 "문자 그대로"넣습니다. 이제 .
아무 단어 나 눌러 따옴표로 묶을 수 있습니다. , 자세한 내용 :h[elp] i_ctrl-r
에서 텍스트 개체에 대한 더:h text-objects
ciw'<C-R><C-O>"'<Esc>
입니다.
.
하면 마지막 실제 호출의 내용이 다시 작성됩니다.
VSCodeVim 사용자는 다음을 수행 할 수 있습니다
vwS"
"
포장하고 싶은 .w
다른 선택 연산자로 바꿀 수 있습니다viwS'
단어를 작은 따옴표로 묶는 것을 사용해야했습니다 . 가장 쉬운 방법입니다.
viwS"
나는이에 대한 모든 내장 정력 명령을 알고 있지만, 사용하지 않는 r"f'r"
' "와에에서 변화를 r'f"r'
'명령"나.의 변화에 '에'작품 첫 번째에 서 있다면 r'
, 어떤 특성을 대체와 함께 커서 아래 ' 그리고 f"
이동 당신은 "다음에 전달합니다.
'r
과 "r
), 당신은 입력 할 수 있습니다 .
그리고 당신은 더 따옴표를 변경하려는 경우 ;
와 ,
그들이 마지막 반복으로 다음 또는 이전에 당신을 데려 갈 f/F/t/T
각각 같은 방향 또는 반대 하나에서 검색합니다.
따옴표 추가
내 에서이 빠르고 더러운 기능을 사용하기 시작했습니다 .vimrc
.
vnoremap q <esc>:call QuickWrap("'")<cr>
vnoremap Q <esc>:call QuickWrap('"')<cr>
function! QuickWrap(wrapper)
let l:w = a:wrapper
let l:inside_or_around = (&selection == 'exclusive') ? ('i') : ('a')
normal `>
execute "normal " . inside_or_around . escape(w, '\')
normal `<
execute "normal i" . escape(w, '\')
normal `<
endfunction
이제 따옴표에서 원하는 것을 시각적으로 선택하고 (일반적으로 단어 내부 를 통해 viw
시각적으로 선택 ) 큰 따옴표를 누르거나 작은 따옴표를 누르 십시오.Qq
따옴표 제거
vnoremap s <esc>:call StripWrap()<cr>
function! StripWrap()
normal `>x`<x
endfunction
vim이 따옴표를 텍스트 객체로 취급하도록 vim-textobj-quotes를 사용 합니다. 이것은 내가 할 수 있음을 의미합니다 vaq
(시각적으로 선택하십시오) 따옴표를 주변 이 발견 가장 가까운 따옴표.을 시각적으로 선택합니다. (이것은 선택 사항입니다, 당신은 뭔가를 할 수 있습니다 f"vww
). 그럼 난 누르 s
을 제거 선택에서 따옴표를.
따옴표 변경
키스. 나는 따옴표를 제거 후 따옴표를 추가합니다 . 예를 들어 작은 따옴표를 큰 따옴표로 바꾸려면 다음 단계를 수행하십시오. 1. 작은 따옴표를 제거하십시오.vaqs
, 2. 새 따옴표 추가 : vwQ
.
vim 플러그인 https://github.com/tpope/vim-surround 를 사용하는 경우 하거나 vim-surround가 사전 설치된 VSCode Vim 플러그인을 사용하면 매우 편리합니다!
더하다
ysiw' // surround in word `'`
하락
ds' // drop surround `'`
변화
cs'" // change surround from `'` to `"`
심지어 HTML 태그에서도 작동합니다!
cst<em> // change surround from current tag to `<em>`
더 나은 예제를 보려면 github의 readme를 확인하십시오.
다음은 단어를 인용하고 인용을 해제하는 데 사용할 수있는 간단한 매핑입니다.
" 'quote' a word
nnoremap qw :silent! normal mpea'<Esc>bi'<Esc>`pl
" double "quote" a word
nnoremap qd :silent! normal mpea"<Esc>bi"<Esc>`pl
" remove quotes from a word
nnoremap wq :silent! normal mpeld bhd `ph<CR>
qw
qd
wq
vscode 용 VIM은 끔찍하게 수행합니다. vscode를 사용하지 않으면 하나의 vim-surround를 기반으로 합니다.
몇 가지 예 :
따옴표 안에 커서가있는 "test"유형 cs " '는'test '로 끝납니다.
test로 끝나는 인용 부호 ds 안에 커서가있는 "test"
따옴표 안에 커서가있는 "test"는 cs "t를 입력하고 123>을 입력하여 <123> test로 끝납니다.
단어 테스트 유형 ysaw에서 커서로 테스트하여 (테스트)로 끝납니다.
이건 어때요?
:%s/\'/"/g
%
전체 파일을 선택하지 않은 한 현재 행에서만 작동합니다.
나는 이것을하는 스크립트를 썼다 :
function! WrapSelect (front)
"puts characters around the selected text.
let l:front = a:front
if (a:front == '[')
let l:back = ']'
elseif (a:front == '(')
let l:back = ')'
elseif (a:front == '{')
let l:back = '}'
elseif (a:front == '<')
let l:back = '>'
elseif (a:front =~ " ")
let l:split = split(a:front)
let l:back = l:split[1]
let l:front = l:split[0]
else
let l:back = a:front
endif
"execute: concat all these strings. '.' means "concat without spaces"
"norm means "run in normal mode and also be able to use \<C-x> characters"
"gv means "get the previous visual selection back up"
"c means "cut visual selection and go to insert mode"
"\<C-R> means "insert the contents of a register. in this case, the
"default register"
execute 'norm! gvc' . l:front. "\<C-R>\"" . l:back
endfunction
vnoremap <C-l> :<C-u>call WrapSelect(input('Wrapping? Give both (space separated) or just the first one: '))<cr>
사용하려면 무언가를 강조 표시하고 control l을 누른 다음 문자를 입력하십시오. 함수가 알고있는 문자 중 하나이면 올바른 종료 문자를 제공합니다. 그렇지 않으면 같은 문자를 사용하여 양쪽에 삽입합니다.
Surround.vim은 이것보다 더 많은 것을 할 수 있지만 이것은 나의 필요에 충분했습니다.