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.
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.
Respostas:
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.
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.
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.
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.ciw
e não apenas cw
? Acho o primeiro confuso e o segundo funciona bem.
ciw
funciona independentemente de onde seu cursor estiver na palavra. cw
só funciona se o cursor estiver no início da palavra. Veja :help iw
.
.
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 :-))
Cite uma palavra usando aspas simples
ciw'Ctrl+r"'
Foi mais fácil para mim fazê-lo desta maneira
ciw '' Esc P
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.
map <Leader>' gewi'<Esc>A'<Esc>
ao meu .vimrc
arquivo 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.
:vnoremap <leader>q c""<esc>P
.
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 \v
modificador (muito mágico) no início do padrão
:s/\v(\S+)/"\1"/
:s/\v([a-Z]+)/"\1"/g
As maneiras macro!
pressione qe qpara gravar no registro q (usamos "q" como um atalho para lembrar "aspas").
pressione shift+ bmover o cursor para frente da palavra atual
itipo de imprensa '(aspas simples)
pressione esce pressione epara ir para o final da palavra
pressione ae pressione 'novamente para colocar a palavra entre aspas.
pressione escpara entrar no modo normal.
finalmente pressione qpara registrá-lo no q
registro.
Como usar
Você pode alterar step 4
com o que quiser {uma linha, uma palavra até encontrar algum caractere, etc.}.
Tornar a macro gravada persistente
let @ q = ' ctrl+ r ctrl+ rq'
salvar e sair
abra seus arquivos, vá para algumas palavras
@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.
@q w
e, em seguida, envolver as próximas n
palavras com aspas, usando with n@j
.
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-r
e saiba mais sobre objetos de texto em:h text-objects
Fonte: http://vimcasts.org/episodes/pasting-from-insert-mode/
ciw'<C-R><C-O>"'<Esc>
.
.
reescreverá o conteúdo da última chamada real.
Para usuários do VSCodeVim, você pode fazer
vwS"
"
com o que você gostaria de incluir.w
por qualquer outro operador de seleçãoviwS'
que envolve a palavra entre aspas simples. De longe o mais fácil.
viwS"
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 ".
'r
e "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/T
pesquisa na mesma direção ou na oposta, respectivamente.
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 viw
visualmente 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 s
para 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
.
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
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>
qw
qd
wq
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)
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.
que tal agora?
:%s/\'/"/g
%
, ele funcionará apenas na linha atual, a menos que você tenha selecionado o arquivo inteiro
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.