Pergunta

Como posso citar/desmarcar palavras e mudar rapidamente (por exemplo, de ' para ") em vim? Eu sei sobre o Surround.vim plug -in, mas eu gostaria de usar apenas vim.

Foi útil?

Solução

Surround.Vim será a sua resposta mais fácil. Se você está realmente definido contra usá -lo, aqui estão alguns exemplos para o que você pode fazer. Não é necessariamente o mais eficiente, mas é por isso que Surround.Vim foi escrito.

  • Citar uma palavra, usando citações únicas
    ciw'Ctrl+r"'
    • ciw - Exclua a palavra em que o cursor está ativado e acaba no modo de inserção.
    • ' - Adicione a primeira citação.
    • Ctrl+r" - Insira o conteúdo do " Registre -se, também conhecido como o último Yank/Excluir.
    • ' - Adicione a cotação de fechamento.

  • Desmonte uma palavra que está fechada em citações únicas
    di'hPl2x
    • di' - Exclua a palavra anexada por citações únicas.
    • hP - Mova o cursor que deixou um lugar (no topo da citação de abertura) e coloque o texto recém -excluído antes da citação.
    • l - Mova o cursor para o lado um lugar (no topo da citação de abertura).
    • 2x - Exclua as duas citações.

  • Alterar citações únicas para citações duplas
    va':s/\%V'\%V/"/g
    • va' - Selecione visualmente a palavra citada e as cotações.
    • :s/ - Inicie uma substituição.
    • \%V'\%V - Combine apenas citações únicas que estão dentro da região visualmente selecionada.
    • /"/g - Substitua todos por cotações duplas.

Outras dicas

Citar uma palavra, usando citações únicas

ciw'Ctrl+r"'

Foi mais fácil para mim fazer dessa maneira

ciw '' Esc P

Aqui está algum 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 mudou a variável MapLeader, ative o mapeamento com \q" \q' ou \qd. Eles adicionam uma cotação dupla em torno da palavra sob o cursor, citação única em torno da palavra sob o cursor, exclua quaisquer citações em torno da palavra sob o cursor, respectivamente.

Além dos outros comandos, isso envolverá todas as palavras em uma linha em citações duplas (conforme seu comentário)

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

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

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

Para envolver citações únicas (por exemplo) ciw'<C-r>"'<esc> funciona, mas repetir não vai funcionar. Tentar:

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

Isso coloca o conteúdo do registro padrão "literalmente". Agora você pode pressionar . Em qualquer palavra para envolvê -lo em citações. Para saber mais ver :h[elp] i_ctrl-r e mais sobre objetos de texto em :h text-objects

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

O caminho das macros

  1. pressione q e q Para gravar no registro Q (usamos "Q" como um atalho para lembrar "citações").

  2. pressione mudança + b Mova o cursor para a frente da palavra atual

  3. pressione eu modelo ' (uma única cita)

  4. pressione Esc então aperte e Para se mudar para o fim da palavra

  5. pressione uma então aperte ' Novamente para cercar a palavra com citações.

  6. finalmente pressione q para gravar em q registro.

Como usá-lo :

  1. Mova o cursor para uma palavra desejada.
  2. Imprensa @q para cercar uma palavra com citações.
  3. Imprensa @@ Se você quiser repeti -lo em outra palavra.

Você pode alterar step 4 com o que você quiser {uma linha, uma palavra até encontrar algum personagem, etc.}. Coloque dentro vim variables e .vimrc para repetir sua felicidade.

Não conheço nenhum comando vim incorporado para isso, mas usando r"f'r" mudar de 'para "e r'f"r' mudar de "para 'obras se você estiver no primeiro' ou". O comando r' substitui qualquer personagem que esteja sob o seu cursor por 'e f" Avance você para o próximo ".

Para usuários do vscodevim, você pode fazer

vwS"

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

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

Então agora, eu seleciono visualmente o que eu quiser (normalmente via viw - Selecione visualmente Palavra interna) em citações e imprensa Q Para citações duplas ou pressione q Para citações únicas.

Removendo cotações

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

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

eu uso vim-textobj-cotes para que o vim trate as citações como um texto de texto. Isso significa que eu posso fazer vaq (selecione visualmente em torno das citações. Isso encontra as citações mais próximas e as seleciona visualmente. (Isso é opcional, você pode fazer algo como f"vww). Então eu pressiono s para faixa as citações da seleção.

Mudando aspas

BEIJO. EU Remova as cotações então Adicionar cotações. Por exemplo, para substituir citações únicas por citações duplas, eu executaria as etapas: 1. Remova as cotações únicas: vaqs, 2. Adicione novas citações: vwQ.


O nome interno do campo é publicado.Tente alterar sua consulta para usar esse nome e espero que isso resolva o problema.

Estou usando nnoremap no meu .vimrc

Para uma citação única uma palavra:

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

Para remover cotações (também funciona com citações duplas):

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

Regra para lembrar: 'sq' = citação única.

Vim para vscode faz isso de forma alguma. É baseado em um vim-sunurround Se você não usar o vscode.

Alguns exemplos:

"Teste" com cursor Inside Quotes Type CS "'para acabar com' teste '

"Teste" com cursor Inside Quotes Type DS "para acabar com o teste

"Teste" com cursor Inside Quotes Type CS "t e digite 123> Para acabar com <123> Teste

teste com cursor no tipo de teste do tipo ysaw) para acabar com (teste)

que tal agora?

 :%s/\'/"/g

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, basta destacar algo, acertar Control L e, em seguida, digite um caractere. Se for um dos caracteres que a função conhece, ela fornecerá o caractere terminante correto. Caso contrário, ele usará o mesmo personagem para inserir em ambos os lados.

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

Exemplo de mapa do modo visual para adicionar citações únicas em torno de um bloco selecionado de texto:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top