¿Qué comando (s) de Vim se pueden usar para citar / no citar palabras?

204

¿Cómo puedo citar / citar palabras rápidamente y cambiar las citas (por ejemplo, de 'a ") en Vim? Sé sobre el complemento surround.vim , pero me gustaría usar solo Vim.

Eugene Yarmash
fuente
Una solución realmente depende del contexto. ¿Desea hacerlo en una sola línea, o en todo el archivo, o solo para una sola cadena entre comillas?
Lucas Omán el
Para una sola palabra o todas las palabras en una línea. Por ejemplo, al convertir palabras pegadas en literales de cadena.
Eugene Yarmash

Respuestas:

253

surround.vim será tu respuesta más fácil. Si realmente está dispuesto a usarlo, aquí hay algunos ejemplos de lo que puede hacer. No necesariamente el más eficiente, pero es por eso que se escribió surround.vim.

  • Cita una palabra, usando comillas simples
    ciw'Ctrl+r"'
    • ciw - Elimine la palabra en la que está el cursor y termine en modo de inserción.
    • ' - agregue la primera cita.
    • Ctrl+r"- Inserte el contenido del "registro, también conocido como el último tirón / eliminación.
    • ' - Añadir la cita de cierre.

  • Entrecomilla una palabra entre comillas simples
    di'hPl2x
    • di' - Eliminar la palabra entre comillas simples.
    • hP - Mueva el cursor hacia la izquierda un lugar (en la parte superior de la cita de apertura) y coloque el texto recién eliminado antes de la cita.
    • l - Mueva el cursor hacia la derecha un lugar (en la parte superior de la cita de apertura).
    • 2x - Eliminar las dos citas.

  • Cambiar comillas simples a comillas dobles
    va':s/\%V'\%V/"/g
    • va' - Seleccione visualmente la palabra entre comillas y las comillas.
    • :s/ - Comience un reemplazo.
    • \%V'\%V - Solo coincide con comillas simples que están dentro de la región seleccionada visualmente.
    • /"/g - Reemplácelos con comillas dobles.
jamessan
fuente
1
Estos funcionan bien para mí. Simplemente busqué en Google que pegar en modo insertar también es posible con Ctrl + op.
Eugene Yarmash
1
Utilizado en combinación con el modo de grabación (q), funciona de maravilla para trabajos rápidos.
obispo
¿Por qué ciwy no solo cw? El primero me parece confuso y el segundo funciona bien.
Big McLargeHuge
18
@Koveras ciwfunciona independientemente de dónde esté el cursor en la palabra. cwsolo funciona si el cursor está al comienzo de la palabra. Ver :help iw.
jamessan
10
Secuestrando la respuesta principal para dar un pequeño y agradable truco: si tiene varias palabras para reemplazar la comilla simple encerrada en comillas dobles, puede notar que la primera solución de @jamessan no funciona con el .comando. Para que funcione, use ciw' Ctrl+r Ctrl+p". Luego .se comportará como lo desee para la siguiente palabra: en lugar de recordar el contenido del registro, recordará que desea lo que está en el registro en este momento (algo difícil de explicar, pero si intenta ambos, será obvio :-))
autra
182

Cita una palabra, usando comillas simples

ciw'Ctrl+r"'

Fue más fácil para mí hacerlo de esta manera

ciw '' Esc P
installero
fuente
8
Desafortunadamente, eso no parece permitir. (repetir).
Wil Moore III
2
Prefiero esto, ya que puedo usarlo en terminales / respuestas con el modo vim, ya que Ctrl + r generalmente ya se usa para la búsqueda de historial inverso.
krock
3
@wilmoore Registre lo anterior como una macro, luego repita.
Christopher
30

Aquí hay algunos mapas que podrían ayudar:

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

Si no ha cambiado la variable mapleader, active la asignación con \q" \q'o \qd. Agregan comillas dobles alrededor de la palabra debajo del cursor, comillas simples alrededor de la palabra debajo del cursor, eliminan las comillas alrededor de la palabra debajo del cursor respectivamente.

Geoff Reedy
fuente
¡Idea increíble! Terminé agregando map <Leader>' gewi'<Esc>A'<Esc>a mi .vimrcarchivo para insertar comentarios de comillas simples desde la posición actual hasta el final de la línea; lo que me ayudó al convertir algunos scripts de MSDOS a bash.
ILMostro_7
@ Geoff, funciona bien para comillas simples. pero para comillas dobles, insiste `" "" "` delante de la palabra
RameshVel
@RameshVel Es posible que tenga algunas de sus macros que afectaron el lado derecho de la asignación. Actualicé el comando de asignación a nnoremap para que otras asignaciones no se expandan. También mejoré las asignaciones. Los anteriores tuvieron problemas cuando el cursor está en la primera palabra de una línea.
Geoff Reedy
Esto también se puede adaptar fácilmente al modo visual para rodear una selección con comillas, por ejemplo :vnoremap <leader>q c""<esc>P.
Dominik
27

Además de los otros comandos, esto incluirá todas las palabras en una línea entre comillas dobles (según su comentario)

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

o si desea reducir la cantidad de barras invertidas, puede colocar un \vmodificador (muy mágico) al comienzo del patrón

:s/\v(\S+)/"\1"/
Matteo Riva
fuente
Mi texto copiado también tenía comas, así que simplemente cambié a esto:s/\v([a-Z]+)/"\1"/g
tsukimi
22

Las formas macro!

  1. presione qy qpara grabar en el registro q (usamos "q" como acceso directo para recordar "comillas").

  2. presione shift+ bmueva el cursor al frente de la palabra actual

  3. itipo de prensa '(comillas simples)

  4. presione escluego presione epara moverse al final de la palabra

  5. presione y aluego presione 'nuevamente para rodear la palabra con comillas.

  6. presione escpara ingresar al modo normal.

  7. finalmente presione qpara grabarlo en el qregistro.

Cómo utilizar

  1. Mueve el cursor a la palabra deseada.
  2. Presione @qpara rodear una palabra con comillas.
  3. Presione @@si desea repetirlo en otra palabra.

Puedes alterarlo step 4con lo que quieras {una línea, una palabra hasta que encuentres algún carácter, etc.}.

Hacer que la macro grabada sea persistente

  1. abrir .vimrc
  2. ir al final del archivo
  3. cambiar al modo de inserción. escriba esto para hacerlo persistente:
let @ q = ' ctrl+ r ctrl+ rq'
  1. guardar y Salir

  2. abre tus archivos, ve a algunas palabras

  3. ahora presiona @q

si lo haces correctamente, deberían aparecer cosas mágicas en tus palabras.

Puedes seguir estos pasos para otras macros que te encantó.

Brain90
fuente
3
Tengo que decir que me gusta esta solución. No se necesita surround.vim para invocar y crear fácilmente las macros. También se puede usar fácilmente para cualquier otra cosa que necesite (para mí, por ejemplo, cite la palabra actual hasta el final de la línea, perfecto para ansible). Para mostrar la macro do: "qp. Para guardarla, vaya a .vimrc y do: let @q = 'macro contents' (solo para completar)
th3penguinwhisperer
Me gusta esto muchisimo. Puede anidar estas macros también. Por lo tanto, podría grabar en el registro j @q wy luego podría ajustar las siguientes npalabras con comillas usando n@j.
nombre de usuario oculto
1
Agregué algunos pasos para hacer que la macro sea persistente.
Brain90
1
Pedantic, pero, word y WORD son diferentes en Vim. Shift + b = B, por lo que el paso 2 idealmente debería cambiarse a "... delante de la PALABRA actual". Sin embargo, si se refería al comienzo de la palabra, no necesita usar Shift.
Ambareesh
Gracias por señalar eso. Uso shift + b a propósito para tratar con WORD. La macro debe ejecutarse en word o WORD [0]. En realidad, el paso 3 también debería cambiar a shift + e. [0] stackoverflow.com/a/14390568/341959
Brain90
18

ciw'<C-r>"'<esc>Funcionar entre comillas simples (por ejemplo) funciona, pero repetir no funcionará. Tratar:

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

Esto pone el contenido del registro predeterminado "literalmente". Ahora puede presionar .cualquier palabra para ponerla entre comillas. Para obtener más información, vea :h[elp] i_ctrl-ry más sobre objetos de texto en:h text-objects

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

James Scriven
fuente
2
Excelente consejo! Si alguien quiere hacer un mapeo de esto, la notación adecuada es ciw'<C-R><C-O>"'<Esc>.
glts
¿Qué hace exactamente <Cr> "?
CodeCrack
@CodeCrack Es CTRL-R. CTRL-R inserta el contenido del registro en el cursor y permanece en modo de inserción.
Erwin Rooijakkers
Esto es repetible como mencionó, pero cuando se almacena en una macro, repetir la macro con .reescribirá el contenido de la última llamada real.
Sbu
7

Para los usuarios de VSCodeVim puedes hacer

vwS"

  • Puedes reemplazarlo "con lo que quieras envolver.
  • Puede reemplazar wcon cualquier otro operador de selección
Janac Meena
fuente
2
Esto también funcionó bien para mí en MacVIM, pero tuve que usarlo para envolver viwS'la palabra entre comillas simples. De lejos, el más fácil.
Matt Grannary
esto solo funciona si estás al principio de la palabra. Si desea hacerlo desde cualquier lugar dentro de la palabra, puede hacerlo:viwS"
geoyws
6

No conozco ningún comando vim incorporado para esto, pero usar r"f'r"para cambiar de 'a "y r'f"r'cambiar de" a' funciona si te paras en la primera 'o ". El comando r'reemplaza cualquier carácter que esté debajo de tu cursor con', y f"te lleva al siguiente ".

Håvard S
fuente
1
La solución "manual" más intuitiva para mí. En lugar del segundo comando de reemplazo ( 'ry "r), puede simplemente escribir .Y si desea cambiar más comillas, ;y ,llevarlo al siguiente o al anterior, ya que repiten la última f/F/t/Tbúsqueda en la misma dirección o en la opuesta, respectivamente.
Endre Ambos
6

Agregar cotizaciones

Empecé a usar esta función rápida y sucia en mi .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

Así que ahora, selecciono visualmente lo que quiero (típicamente a través de viw- seleccionar visualmente dentro de la palabra ) entre comillas y presiono Qpara comillas dobles, o presiono qpara comillas simples.

Eliminar cotizaciones

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

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

Uso vim-textobj-quotes para que vim trate las citas como objetos de texto. Esto significa que puedo hacer vaq(seleccionar visualmente entre comillas . Esto encuentra las comillas más cercanas y las selecciona visualmente. (Esto es opcional, puede hacer algo como f"vww). Luego presiono spara quitar las comillas de la selección.

Cotizaciones cambiantes

BESO. Me quito las citas a continuación, agregan cotizaciones . Por ejemplo, para reemplazar comillas simples por comillas dobles, me gustaría realizar los pasos: comillas simples 1. Extraer: vaqs, 2. añadir nuevas citas: vwQ.


James Lawson
fuente
4

Si usa el complemento vim https://github.com/tpope/vim-surround (o usa el complemento VSCode Vim, que viene con vim-surround preinstalado), ¡es bastante conveniente!

añadir

ysiw' // surround in word `'`

soltar

ds' // drop surround `'`

cambio

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

¡Incluso funciona para etiquetas html!

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

echa un vistazo al readme en github para obtener mejores ejemplos

Ulad Kasach
fuente
2

Aquí hay algunas asignaciones simples que pueden usarse para citar y descomponer una palabra:

" '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
fuente
1
Sería genial para todos si pudieras elaborar tu respuesta: cómo agregar asignaciones, cómo llamarlas, etc. Gracias.
Carles Alcolea
1
Yo diría que para citar, comillas dobles y comillas que debería hacerqw qd wq
nilon
por alguna razón, la cita doble devuelve una cita extra al final como "palabra" ".
Janicebaratheon
@ShuaiWang, ¿tal vez tienes autopairs o alguna extensión similar instalada? Eliminar eso solucionó ese error para mí.
Nephilim
2

VIM para vscode lo hace increíblemente. Está basado en un vim-surround si no usa vscode.

Algunos ejemplos:

"prueba" con el cursor entre comillas, escriba cs "'para terminar con' prueba '

"prueba" con el cursor entre comillas, escriba ds "para terminar con la prueba

"prueba" con el cursor dentro de las comillas, escriba cs "t e ingrese 123> para terminar con <123> prueba

prueba con cursor en palabra prueba tipo ysaw) para terminar con (prueba)

Lev
fuente
1

Estoy usando nnoremap en mi .vimrc

Para comillas simples una palabra:

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

Para eliminar comillas (también funciona en comillas dobles):

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

Regla para recordar: 'sq' = comilla simple.

Niko Riitala
fuente
0

¿Qué tal esto?

 :%s/\'/"/g
ghostdog74
fuente
2
Este comando opera en todo el archivo. Solo necesito cambiar palabras sueltas.
Eugene Yarmash
44
Sin el %, funcionará solo en la línea actual a menos que haya seleccionado el archivo completo
Emily
0

Escribí un guión que hace esto:

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, solo resalta algo, presiona control l y luego escribe un carácter. Si es uno de los caracteres que la función conoce, proporcionará el carácter de terminación correcto. Si no es así, usará el mismo carácter para insertar en ambos lados.

Surround.vim puede hacer más que esto, pero esto fue suficiente para mis necesidades.

jeremysprofile
fuente
-1

Ejemplo de mapa en modo visual para agregar comillas simples alrededor de un bloque de texto seleccionado:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
mrded
fuente