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.

Eugene Yarmash
fonte
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.
jamessan
fonte
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
installero
fonte
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.

Geoff Reedy
fonte
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"/
Matteo Riva
fonte
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.

Brain90
fonte
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/

James Scriven
fonte
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
Janac Meena
fonte
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 ".

Håvard S
fonte
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.


James Lawson
fonte
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

Ulad Kasach
fonte
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>
falcucci
fonte
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)

Lev
fonte
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.

Niko Riitala
fonte
0

que tal agora?

 :%s/\'/"/g
ghostdog74
fonte
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.

jeremysprofile
fonte
-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>
mrded
fonte