Quais comando (s) vim (s) pode ser usado para citar/desmarcar palavras?
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.
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
pressione q e q Para gravar no registro Q (usamos "Q" como um atalho para lembrar "citações").
pressione mudança + b Mova o cursor para a frente da palavra atual
pressione eu modelo ' (uma única cita)
pressione Esc então aperte e Para se mudar para o fim da palavra
pressione uma então aperte ' Novamente para cercar a palavra com citações.
finalmente pressione q para gravar em
q
registro.
Como usá-lo :
- Mova o cursor para uma palavra desejada.
- Imprensa @q para cercar uma palavra com citações.
- 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
.
- http://vim.wikia.com/wiki/wrap_a_visual_selection_in_an_html_tag O código daqui foi modificado e usado como parte da minha resposta
- https://github.com/beloglazov/vim-textobj-quotes Vim-text-obj-actes
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>