단어를 인용 / 인용하는 데 사용할 수있는 Vim 명령은 무엇입니까?


204

내가 어떻게 빨리 인용 / 인용을 끝내 말과 변화 (예를 들어, 인용 '"빔에서)? Surround.vim 플러그인 에 대해 알고 있지만 Vim 만 사용하고 싶습니다.


해결책은 실제로 상황에 달려 있습니다. 단 한 줄 또는 전체 파일 또는 작은 따옴표로 묶은 문자열로 수행 하시겠습니까?
Lucas Oman

한 단어 또는 한 줄에있는 모든 단어 예를 들어 붙여 넣은 단어를 문자열 리터럴로 변환 할 때
Eugene Yarmash

답변:


251

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 -큰 따옴표로 모두 바꾸십시오.

1
이들은 나를 위해 잘 작동합니다. 삽입 모드에서 붙여 넣기가 Ctrl + op로 가능하다는 것을 Google에서 확인했습니다.
Eugene Yarmash

1
녹음 모드 (q)와 함께 사용하면 빠른 작업을위한 매력처럼 작동합니다.
감독

ciw뿐 아니라 cw? 첫 번째 혼란스럽고 두 번째는 잘 작동합니다.
Big McLargeHuge

18
@Koveras ciw는 커서가 단어의 위치에 관계없이 작동합니다. cw커서가 단어의 시작 부분에있는 경우에만 작동합니다. 참조하십시오 :help iw.
jamessan

10
작은 대답을 인용하기 위해 최고의 대답을 납치하십시오. 큰 따옴표로 묶는 작은 따옴표를 대체 할 단어가 여러 개인 경우 @jamessan의 첫 번째 솔루션이 .명령 과 작동하지 않을 수 있습니다 . 작동 시키려면을 사용하십시오 ciw' Ctrl+r Ctrl+p". 그러면 .다음 단어에 대해 원하는대로 작동합니다. 레지스터의 내용을 기억하는 대신 지금 레지스터에있는 모든 것을 원한다는 것을 기억할 것입니다 (설명하기는 어렵지만 둘 다 시도하면 분명해집니다) :-))
autra

182

작은 따옴표를 사용하여 단어를 인용하십시오.

ciw'Ctrl+r"'

이런 식으로하는 것이 더 쉬웠습니다

ciw '' Esc P

8
불행히도, 그것은 허용하지 않는 것 같습니다. (반복).
Wil Moore III

2
Ctrl + r은 일반적으로 역 히스토리 검색에 이미 사용되므로 vim 모드의 터미널 / 회신에서 사용할 수 있으므로 이것을 선호합니다.
krock

3
@wilmoore 위의 내용을 매크로로 기록한 다음 다시 재생하십시오.
Christopher

30

다음은 도움이 될 수있는 몇 가지 매핑입니다.

: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로 변환하는 동안 도움이되었습니다.
ILMostro_7

@Geoff, 작은 따옴표에 잘 작동합니다. 그러나 큰 따옴표의 경우` "" ""`단어
앞에 붙임

@RameshVel 매핑의 오른쪽에 영향을주는 자체 매크로가있을 수 있습니다. 다른 매핑이 확장되지 않도록 매핑 명령을 nnoremap으로 업데이트했습니다. 나는 또한 매핑을 향상시켰다. 커서가 줄의 첫 단어에있을 때 이전 항목에 문제가있었습니다.
Geoff Reedy

예를 들어 따옴표로 선택을 둘러싼 시각적 모드에 쉽게 적용 할 수 있습니다 :vnoremap <leader>q c""<esc>P.
도미니크

27

다른 명령 외에도 모든 단어를 큰 따옴표로 묶습니다 (댓글에 따라)

:s/\(\S\+\)/"\1"/

또는 백 슬래시 수를 줄이려면 \v패턴의 시작 부분에 (매우 마술적인) 수정자를 넣을 수 있습니다

:s/\v(\S+)/"\1"/

복사 한 텍스트에도 쉼표가 있었으므로 방금 이것으로 변경했습니다:s/\v([a-Z]+)/"\1"/g
tsukimi

22

매크로 방법!

  1. Enter 키를 눌러 qqQ 레지스터에 기록 (우리는 "따옴표"를 기억하는 바로 가기로 "q"를 사용한다).

  2. 를 눌러 shift+의 b현재 단어의 앞쪽으로 이동 커서

  3. 프레스 i타입 '(작은 따옴표)

  4. esc누른 후 e를 눌러 단어 끝으로 이동

  5. 단어를 따옴표로 묶으려면을 누른 a다음을 '다시 누르 십시오.

  6. 를 눌러 esc일반 모드로 들어갑니다.

  7. 마지막으로 눌러 qq 레지스터 에 기록됩니다 .

사용하는 방법

  1. 커서를 원하는 단어로 이동하십시오.
  2. 프레스 @q단어를 따옴표로 묶으려면 .
  3. 프레스 @@다른 단어로 반복하려면을 .

당신은 변경할 수 있습니다 step 4{줄, 문자를 찾을 때까지의 단어 등}과 같은 내용으로 .

기록 된 매크로를 영구적으로 유지

  1. .vimrc를여십시오
  2. 파일 끝으로 이동
  3. 삽입 모드로 변경하십시오. 이것을 영구적으로 만들려면 다음을 입력하십시오.
@ q = ' ctrl+ r ctrl+ rq' 하자
  1. 저장하고 종료

  2. 파일을 열고 몇 마디로 이동

  3. 지금 눌러 @q

당신이 올바르게하면 마법의 말이 당신의 말에 나타납니다.

좋아하는 다른 매크로에 대해이 단계를 수행 할 수 있습니다.


3
이 솔루션이 마음에 들었습니다. 매크로가 필요하지 않고 서라운드 .vim이 필요하지 않으며 쉽게 호출 및 생성 할 수 있습니다. 당신이 필요로하는 다른 것에도 쉽게 사용할 수 있습니다 (예를 들어, 줄 끝까지 현재 단어를 인용하고, 완벽에 적합합니다). "qp. 매크로를 저장하려면 .vimrc로 이동하여 다음을 수행하십시오 : let @q = 'macro contents'(완전성을 위해)
th3penguinwhisperer

나는 이것을 많이 좋아한다. 이 매크로를 중첩 할 수도 있습니다. 따라서 레지스터 j에 기록한 @q w다음 nwith를 사용하여 다음 단어를 따옴표로 묶을 수 있습니다 n@j.
hidden-username

1
매크로를 지속시키기 위해 몇 가지 단계를 추가했습니다.
Brain90

1
그러나 Vim에서는 단어와 단어가 다릅니다. Shift + b = B이므로 2 단계는 "... 현재 WORD 앞에"로 변경해야합니다. 그러나 단어의 시작을 의미한다면 Shift를 사용할 필요가 없습니다.
Ambareesh

그 점 감사합니다. 나는 단어를 다루기 위해 의도적으로 shift + b를 사용합니다. 매크로는 워드 또는 워드 [0]으로 실행되어야합니다. 실제로 3 단계는 shift + e로 변경되어야합니다. [0] stackoverflow.com/a/14390568/341959
Brain90

18

작은 따옴표로 묶는 것은 (예를 들어) ciw'<C-r>"'<esc>작동하지만 반복 은 작동하지 않습니다. 시험:

ciw'<C-r><C-o>"'<esc>

기본 레지스터의 내용을 "문자 그대로"넣습니다. 이제 .아무 단어 나 눌러 따옴표로 묶을 수 있습니다. , 자세한 내용 :h[elp] i_ctrl-r에서 텍스트 개체에 대한 더:h text-objects

출처 : http://vimcasts.org/episodes/pasting-from-insert-mode/


2
훌륭한 팁! 아무도 이것에서 매핑을 만들고 싶다면 적절한 표기법은 ciw'<C-R><C-O>"'<Esc>입니다.
glts

<Cr> "의 기능은 정확히 무엇입니까?
CodeCrack

@CodeCrack CTRL-R입니다. CTRL-R은 레지스터의 내용을 커서에 삽입하고 삽입 모드를 유지합니다.
Erwin Rooijakkers

언급 한대로 반복 할 수 있지만 매크로에 저장하면 매크로를 반복 .하면 마지막 실제 호출의 내용이 다시 작성됩니다.
Sbu

7

VSCodeVim 사용자는 다음을 수행 할 수 있습니다

vwS"

  • 교체 가능 "포장하고 싶은 .
  • w다른 선택 연산자로 바꿀 수 있습니다

2
이것은 MacVIM에서도 잘 작동했지만 viwS'단어를 작은 따옴표로 묶는 것을 사용해야했습니다 . 가장 쉬운 방법입니다.
Matt Grannary

이것은 당신이 단어의 시작 부분에있는 경우에만 작동합니다. 단어의 어느 곳에서나하고 싶다면 다음과 같이하십시오 :viwS"
geoyws

6

나는이에 대한 모든 내장 정력 명령을 알고 있지만, 사용하지 않는 r"f'r"' "와에에서 변화를 r'f"r''명령"나.의 변화에 '에'작품 첫 번째에 서 있다면 r', 어떤 특성을 대체와 함께 커서 아래 ' 그리고 f"이동 당신은 "다음에 전달합니다.


1
나에게 가장 직관적 인 "수동"솔루션. 대신 두 번째 교체 명령 (의 'r"r), 당신은 입력 할 수 있습니다 .그리고 당신은 더 따옴표를 변경하려는 경우 ;,그들이 마지막 반복으로 다음 또는 이전에 당신을 데려 갈 f/F/t/T각각 같은 방향 또는 반대 하나에서 검색합니다.
Endre Both

5

따옴표 추가

내 에서이 빠르고 더러운 기능을 사용하기 시작했습니다 .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.



4

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를 확인하십시오.


2

다음은 단어를 인용하고 인용을 해제하는 데 사용할 수있는 간단한 매핑입니다.

" '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>

1
답변을 구체화 할 수 있다면 모든 사람에게 도움이 될 것입니다. 매핑을 추가하는 방법, 호출하는 방법 등. 감사합니다.
Carles Alcolea

1
나는 인용, 큰 따옴표 및 인용을 qw qd wq
취소

어떤 이유로, 큰 따옴표는 "word" "와 같은 끝에 여분의 따옴표를 반환합니다.
janicebaratheon

@ShuaiWang 아마도 자동 쌍이나 비슷한 확장 기능이 설치되어 있습니까? 그 버그를 제거하면 그 버그가 해결되었습니다.
Nephilim

2

vscode 용 VIM은 끔찍하게 수행합니다. vscode를 사용하지 않으면 하나의 vim-surround를 기반으로 합니다.

몇 가지 예 :

따옴표 안에 커서가있는 "test"유형 cs " '는'test '로 끝납니다.

test로 끝나는 인용 부호 ds 안에 커서가있는 "test"

따옴표 안에 커서가있는 "test"는 cs "t를 입력하고 123>을 입력하여 <123> test로 끝납니다.

단어 테스트 유형 ysaw에서 커서로 테스트하여 (테스트)로 끝납니다.


1

내 .vimrc에서 nnoremap을 사용하고 있습니다.

단어를 작은 따옴표로 묶으려면 :

nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl

따옴표를 제거하려면 (큰 따옴표에도 적용) :

nnoremap qs :silent! normal mpeld bhd `ph<CR>

기억해야 할 규칙 : 'sq'= 작은 따옴표.


0

이건 어때요?

 :%s/\'/"/g

2
이 명령은 전체 파일에서 작동합니다. 한 단어 만 바꾸면됩니다.
Eugene Yarmash

4
이 없으면 %전체 파일을 선택하지 않은 한 현재 행에서만 작동합니다.
Emily

0

나는 이것을하는 스크립트를 썼다 :

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은 이것보다 더 많은 것을 할 수 있지만 이것은 나의 필요에 충분했습니다.


-1

선택한 텍스트 블록 주위에 작은 따옴표를 추가하는 비주얼 모드 맵 예제 :

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