Quais comandos do Vim podem ser usados ​​para citar / citar palavras?


204

Como posso citar / citar rapidamente palavras e alterar as aspas (por exemplo, de 'para ") no Vim? Conheço o plugin surround.vim , mas gostaria de usar apenas o Vim.


Uma solução realmente depende do contexto. Deseja fazê-lo em apenas uma linha, no arquivo inteiro ou apenas em uma única string entre aspas?
— Lucas Oman

Para uma única palavra ou todas as palavras em uma linha. Por exemplo, ao converter palavras coladas em literais de string.
— Eugene Yarmash

Respostas:


252

O surround.vim será a sua resposta mais fácil. Se você realmente está contra o uso, aqui estão alguns exemplos do que você pode fazer. Não é necessariamente o mais eficiente, mas é por isso que o surround.vim foi escrito.

  • Cite uma palavra usando aspas simples
    ciw'Ctrl+r"'
    • ciw - Exclua a palavra em que o cursor está ativado e termine no modo de inserção.
    • ' - adicione a primeira cotação.
    • Ctrl+r"- Insira o conteúdo do "registro, também conhecido como o último arranque / exclusão.
    • ' - adicione a cotação de fechamento.

  • Entre aspas uma palavra entre aspas simples
    di'hPl2x
    • di' - Exclua a palavra entre aspas simples.
    • hP - Mova o cursor para a esquerda um lugar (em cima da citação de abertura) e coloque o texto excluído antes da citação.
    • l - Mova o cursor para a direita um lugar (em cima da citação de abertura).
    • 2x - Exclua as duas aspas.

  • Alterar aspas simples para aspas duplas
    va':s/\%V'\%V/"/g
    • va' - Selecione visualmente a palavra citada e as aspas.
    • :s/ - Inicie uma substituição.
    • \%V'\%V - Corresponde apenas aspas simples que estão dentro da região visualmente selecionada.
    • /"/g - Substitua todos por aspas duplas.

1
Estes funcionam bem para mim. Pesquisei no Google que colar no modo de inserção também é possível com Ctrl + op.
— Eugene Yarmash

1
Utilizado em combinação com o Modo de Gravação (q), funciona como um encanto para trabalhos rápidos.
— bispo

Por que ciwe não apenas cw? Acho o primeiro confuso e o segundo funciona bem.
— Big McLargeHuge

18
@Koveras ciwfunciona independentemente de onde seu cursor estiver na palavra. cwsó funciona se o cursor estiver no início da palavra. Veja :help iw.
— jamessan

10
Seqüestrar a resposta principal para dar um pequeno truque: se você tiver várias palavras para substituir aspas simples entre aspas duplas, poderá notar que a primeira solução do @jamessan não funciona com o .comando Para fazê-lo funcionar, use ciw' Ctrl+r Ctrl+p". Então, .ele se comportará como você deseja para a seguinte palavra: em vez de lembrar o conteúdo do registro, ele lembrará que você quer o que está no registro agora (meio difícil de explicar, mas se você tentar os dois, ficará óbvio :-))
— autra

182

Cite uma palavra usando aspas simples

ciw'Ctrl+r"'

Foi mais fácil para mim fazê-lo desta maneira

ciw '' Esc P

8
Infelizmente, isso não parece permitir. (repetir).
— Wil Moore III

2
Eu prefiro isso, pois posso usá-lo em terminais / substituições com o modo vim, pois Ctrl + r geralmente já é usado para pesquisa de histórico reverso.
— krock

3
@ wilmoore Grave o acima como uma macro e depois reproduza.
— Christopher

30

Aqui está um mapeamento que pode ajudar:

:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P

Se você não alterou a variável mapleader, ative o mapeamento com \q" \q'ou \qd. Eles adicionam aspas duplas ao redor da palavra sob o cursor, aspas simples ao redor da palavra sob o cursor, excluem quaisquer aspas ao redor da palavra sob o cursor, respectivamente.


Excelente ideia! Acabei adicionando map <Leader>' gewi'<Esc>A'<Esc>ao meu .vimrcarquivo para inserir comentários de aspas simples da posição atual até o final da linha; o que me ajudou a converter alguns scripts do MSDOS para o bash.
— ILMostro_7 26/03

@ Geoff, funciona bem para aspas simples. mas, para aspas duplas, insere `" "" "` na frente da palavra
— RameshVel

@RameshVel É possível que você tenha algumas de suas próprias macros que afetaram o lado direito do mapeamento. Atualizei o comando mapping para nnoremap, para que outros mapeamentos não sejam expandidos. Eu também melhorei os mapeamentos. Os anteriores tiveram problemas quando o cursor está na primeira palavra de uma linha.
— Geoff Reedy

Isso também pode ser facilmente adaptado ao modo visual para envolver uma seleção com aspas, por exemplo :vnoremap <leader>q c""<esc>P.
— Dominik

27

Além dos outros comandos, isso incluirá todas as palavras em uma linha entre aspas duplas (conforme seu comentário)

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

ou se você deseja reduzir o número de barras invertidas, pode colocar um \vmodificador (muito mágico) no início do padrão

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

Meu texto copiado também tinha vírgulas em, então eu só mudou a esta:s/\v([a-Z]+)/"\1"/g
— tsukimi

22

As maneiras macro!

  1. pressione qe qpara gravar no registro q (usamos "q" como um atalho para lembrar "aspas").

  2. pressione shift+ bmover o cursor para frente da palavra atual

  3. itipo de imprensa '(aspas simples)

  4. pressione esce pressione epara ir para o final da palavra

  5. pressione ae pressione 'novamente para colocar a palavra entre aspas.

  6. pressione escpara entrar no modo normal.

  7. finalmente pressione qpara registrá-lo no qregistro.

Como usar

  1. Mova o cursor para a palavra desejada.
  2. Pressione @qpara colocar uma palavra entre aspas.
  3. Pressione @@se desejar repeti-lo em outra palavra.

Você pode alterar step 4com o que quiser {uma linha, uma palavra até encontrar algum caractere, etc.}.

Tornar a macro gravada persistente

  1. abrir .vimrc
  2. ir para o final do arquivo
  3. mude para o modo de inserção. digite isto para torná-lo persistente:
let @ q = ' ctrl+ r ctrl+ rq'
  1. salvar e sair

  2. abra seus arquivos, vá para algumas palavras

  3. agora pressione @q

se você fizer isso corretamente, coisas mágicas devem aparecer em suas palavras.

Você pode executar estas etapas para outras macros que você amou.


3
Tenho que dizer que gosto desta solução. Nenhuma surround.vim é necessária e fácil invocação e criação das macros. Também é facilmente utilizável para qualquer outra coisa que você precise (por exemplo, cite a palavra atual até o final da linha, perfeita para a aplicação). Para mostrar a fazer macro: "qp Para salvá-lo ir para .vimrc e fazer: deixar @q = 'conteúdo macro' (apenas para a completude).
— th3penguinwhisperer

Eu gosto muito disso. Você pode aninhar essas macros também. Assim, você pode registrar no registro j @q we, em seguida, envolver as próximas npalavras com aspas, usando with n@j.
— hidden-username

1
Eu adicionei algumas etapas para tornar a macro persistente.
— Brain90

1
Pedante, mas palavra e PALAVRA são diferentes no Vim. Shift + b = B, portanto a etapa 2 deve ser idealmente alterada para "... frente da PALAVRA atual". Se você quis dizer o início da palavra, no entanto, não precisa usar Shift.
— Ambareesh

Obrigado por apontar isso. Uso shift + b propositadamente para lidar com a PALAVRA. A macro deve ser executada em word ou WORD [0]. Na verdade, a etapa 3 também deve mudar para shift + e. [0] stackoverflow.com/a/14390568/341959
— Brain90

18

Quebrar aspas simples (por exemplo) ciw'<C-r>"'<esc>funciona, mas a repetição não funciona. Experimentar:

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

Isso coloca o conteúdo do registro padrão "literalmente". Agora você pode pressionar .qualquer palavra para colocá-la entre aspas. Para saber mais, veja :h[elp] i_ctrl-re saiba mais sobre objetos de texto em:h text-objects

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


2
Excelente dica! Se alguém quiser fazer um mapeamento disso, a notação adequada é ciw'<C-R><C-O>"'<Esc>.
— precisa

O que <CR>" exatamente?
— CodeCrack

@CodeCrack É CTRL-R. CTRL-R insere o conteúdo do registro no cursor e permanece no modo de inserção.
— Erwin Rooijakkers

Isso pode ser repetido como você mencionou, mas, quando armazenado em uma macro, a repetição da macro com .reescreverá o conteúdo da última chamada real.
— Sbu

7

Para usuários do VSCodeVim, você pode fazer

vwS"

  • Você pode substituir "com o que você gostaria de incluir.
  • Você pode substituir wpor qualquer outro operador de seleção

2
Isso também funcionou bem para mim no MacVIM, mas eu tive que usar o viwS'que envolve a palavra entre aspas simples. De longe o mais fácil.
— Matt Grannary

isso só funciona se você estiver no início da palavra. Se você quiser fazê-lo de qualquer lugar dentro da palavra, você pode fazer:viwS"
— geoyws

6

Eu não conheço nenhum comando interno do vim para isso, mas usar r"f'r"a opção de mudar de 'para' e r'f"r'de 'para' funciona se você permanecer no primeiro 'ou'. O comando r'substitui qualquer caractere que esteja sob seu cursor por ', e f"avança para a próxima ".


1
A solução "manual" mais intuitiva para mim. Em vez do segundo comando de substituição ( 're "r), você pode apenas digitar .E se quiser alterar mais aspas ;e ,levá-lo para o próximo ou o anterior, pois eles repetem a última f/F/t/Tpesquisa na mesma direção ou na oposta, respectivamente.
— Endre Both

6

Adicionando cotações

Comecei a usar esta função rápida e suja no meu .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

Portanto, agora, seleciono visualmente o que eu quero (normalmente via viwvisualmente dentro da palavra ) entre aspas e pressiono Qpara aspas duplas ou pressiono qpara aspas simples.

Removendo Cotações

vnoremap s <esc>:call StripWrap()<cr>

function! StripWrap()
  normal `>x`<x
endfunction

Uso vim-textobj-quotes para que o vim trate aspas como um objeto de texto. Isso significa que eu posso fazer vaq(selecionar visualmente as aspas . Encontre as aspas mais próximas e selecioná-las visualmente. (Isso é opcional, você pode fazer algo assim f"vww). Em seguida, pressiono spara retirar as aspas da seleção.

Alterar cotações

BEIJO. Eu removo aspas e depois adiciono aspas . Por exemplo, para substituir aspas simples com aspas duplas, gostaria de executar as etapas: aspas simples 1. Remover: vaqs, 2. adicionar novas citações: vwQ.



4

Se você usar o plugin vim https://github.com/tpope/vim-surround (ou usar o plugin VSCode Vim, que vem com o vim-surround pré-instalado), é bastante conveniente!

adicionar

ysiw' // surround in word `'`

solta

ds' // drop surround `'`

mudança

cs'" // change surround from `'` to `"`

Até funciona para tags html!

cst<em> // change surround from current tag to `<em>`

confira o leia-me no github para obter melhores exemplos


2

Aqui estão alguns mapeamentos simples que podem ser usados ​​para citar e citar uma palavra:

" '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
Seria ótimo para todos se você pudesse elaborar sua resposta: como adicionar mapeamentos, como chamá-los etc. Obrigado.
— Carles Alcolea

1
Eu diria que a citar, aspas duplas e unquote você deve fazerqw qd wq
— nilon

por algum motivo, o aspas duplas retornar citação extra no final como "palavra"."
— janicebaratheon

@ShuaiWang, talvez você tenha autopairs ou alguma extensão semelhante instalada? Remover isso corrigiu esse bug para mim.
— Nephilim

2

O VIM para vscode é impressionante. É baseado em um vim-surround se você não usar o vscode.

Alguns exemplos:

"test" com o cursor entre aspas digite cs "'para terminar com' test '

"test" com o cursor entre aspas digite ds "para terminar com test

"test" com o cursor entre aspas, digite cs "te digite 123> para terminar com <123> test

teste com o cursor na palavra teste tipo ysaw) para terminar com (test)


1

Estou usando o nnoremap no meu .vimrc

Para citar uma palavra com uma única frase:

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

Para remover aspas (também funciona com aspas duplas):

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

Regra para lembrar: 'sq' = aspas simples.


0

que tal agora?

 :%s/\'/"/g

2
Este comando opera em todo o arquivo. Eu só preciso mudar palavras únicas.
— Eugene Yarmash

4
Sem o %, ele funcionará apenas na linha atual, a menos que você tenha selecionado o arquivo inteiro
— Emily

0

Eu escrevi um script que faz isso:

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>

Para usar, apenas destaque alguma coisa, pressione o controle le digite um caractere. Se for um dos caracteres que a função conhece, ele fornecerá o caractere final correto. Caso contrário, usará o mesmo caractere para inserir nos dois lados.

O Surround.vim pode fazer mais do que apenas isso, mas isso foi suficiente para minhas necessidades.


-1

Exemplo de mapa do modo visual para adicionar aspas simples ao redor de um bloco de texto selecionado:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.