Estoy haciendo el esfuerzo de aprender Vim.
Cuando pego el código en mi documento desde el portapapeles, obtengo espacios adicionales al comienzo de cada nueva línea:
line
line
line
Sé que puede desactivar la sangría automática, pero no puedo hacer que funcione porque tengo otras configuraciones en conflicto o algo así (que parece bastante obvio en mi .vimrc pero no parece importar cuando las elimino).
¿Cómo desactivo la sangría automática cuando pego el código pero aún tengo la sangría automática vim cuando escribo el código? Aquí está mi .vimrc
archivo:
set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set bg=dark
set nowrap
cat > mynewfile.txt
presionar Enter , pegar su texto, presionar Enter nuevamente, y luego Ctr + D para guardar. El archivo ya está creado y puede editarlo convim mynewfile.txt
.Respuestas:
Actualización: Mejor respuesta aquí: https://stackoverflow.com/a/38258720/62202
Para desactivar el autoindent cuando pega el código, hay un modo especial de "pegar".
Tipo
Luego pegue su código. Tenga en cuenta que el texto en la información sobre herramientas ahora dice
-- INSERT (paste) --
.Después de pegar su código, desactive el modo de pegado, para que la sangría automática cuando escriba funcione de nuevo correctamente.
Sin embargo, siempre me pareció engorroso. ¡Es por eso que mapeo de
<F3>
modo que pueda cambiar entre los modos de pegar y no pegar mientras edito el texto! Agrego esto a.vimrc
fuente
:set noai
seguido:set ai
. La sugerencia de:r! cat
es más corta.set paste
es más fácil, definitivamente. Es mucho más semántico quenoai
o inclusonoautoindent
, lo cual es más importante cuando se escribe "noai" y "pegar" toma aproximadamente la misma cantidad de tiempo insignificante cuando eres lo suficientemente competente como mecanógrafo.:set noai
no siempre funciona, dependiendo de cómo se configuren las otras configuraciones relacionadas con sangría según el OP.:set paste
parece ser una abreviatura de varias configuraciones a la vez.set copyindent
se encargará de esto sin problemas.:set paste
también deshabilita otras características como la finalización de llaves, que tampoco se desea al pegar código.Para evitar efectos no deseados al pegar, hay una opción que debe configurarse:
Un comando útil para tener en su .vimrc es
set pastetoggle=<F10>
o algún otro botón, para alternar fácilmente entre pegar y no pegar.fuente
nmap <silent> <leader>p :set paste<CR>"*p:set nopaste<CR>
Usualmente uso
:r! cat
y luego pego( shift + insert )
el contenido, yCTRL+D
.No es necesario habilitar y deshabilitar, uso directo.
fuente
:r! cat
funciona.:r
inserta el contenido de un archivo en el documento actual.!cat
dice, ejecute cat que esencialmente abre stdin (* nix shells)(shift + insert)
o para algunos terminales, el clic derecho del mouse pegará el contenido del portapapeles en el terminal alCTRL+D
final del archivo, por lo que cerrará la:r !cat
sesión.paste
hecha únicamente para este propósito? @jvriesem Esta no es una opción 'directa', si lo que supongo de su comprensión de esa palabra es correcto.:r! cat
luegoCTRL+SHIFT+V
para pegar en el terminal (entoncesCTRL+D
).Si está trabajando localmente, puede pegar desde el portapapeles del sistema con la secuencia de teclas:
"+p
Este es un comando vim adecuado, por lo que no debe preocuparse por ingresar al modo de inserción o desactivar primero el autoindent.
Por supuesto, si está trabajando de forma remota (consola sobre SSH, por ejemplo), entonces esto no funcionará y debe ir al
:set noai
modo de inserción, pegar en la consola, dejar el modo de inserción,:set ai
enrutar como se describe en otro lugar.fuente
:set paste
y, en:set nopaste
cambio, porque a pesar de ser más largo, ¡es más fácil de recordar y no tengo que buscarlo siempre!:set paste
no está implementado, por lo que:set noai
debe usarse en su lugar.<leader>p
... ¡muy útil!Si bien configurar el modo pegar con
paste/nopaste/pastetoggle
está perfectamente bien, aún debe habilitar manualmente el modo pegar antes de pegar y deshabilitar el modo pegar después de pegar. Siendo la persona perezosa que soy, a continuación es la mejor solución que he encontrado hasta ahora, que alterna automáticamente el modo de pegar cuando pegas.Fuente: Coderwall
Nota: Esta solución no funciona en WSL (Windows 10 Subsystem for Linux). Si alguien tiene una solución para WSL, actualice esta respuesta o agréguela en los comentarios.
Tmux Si se usa tmux, entonces las declaraciones deben tener doble escape. El código para esto también está en Coderwall
fuente
t_SI
yt_EI
están habilitando el horquillado de pegado y deshabilitándolo. Cuando el horquillado de pegado está activado, el texto pegado tiene el prefijoesc[200~
seguido deesc[201~
.Los usuarios de Mac pueden evitar el formateo automático leyendo directamente desde el tablero con:
fuente
:.!pbpaste
, esto debería funcionar reemplazando la línea actual con la salida del búfer de pegado. En general, vim le permite canalizar datos que están en su archivo actual a otro programa y reemplazar el texto con la salida del comando. Por lo tanto,:1,3!pbpaste
reemplaza las primeras tres líneas de su archivo con el búfer de pegado. Solía:.!ppjson
tomar una cadena JSON muy larga (sin formato JSON) y formatearla y reemplazar la cadena larga con el equivalente formateado. ppjson es solo un script bash que se ejecutapython -m json.tool
.Aquí hay una publicación de alguien que descubrió cómo reasignar el evento de pegado para activar y desactivar automáticamente el modo de pegado. Funciona para mí en tmux / iTerm en MacOSX.
fuente
Agregue esto a su
~/.vimrc
y solo tendrá que presionar F2 antes y después de pegar:fuente
Acabo de poner
set clipboard=unnamed
mi .vimrc. Eso hace que el búfer de pegado predeterminado se asigne al portapapeles de X.Entonces, si marco un poco de texto en un terminal, simplemente puedo presionar
p
para pegarlo en vim. Del mismo modo, puedo tirar cosas en vim (por ejemplo,YY
para tirar la línea actual en el búfer) y hacer clic con el botón central en cualquier ventana para pegarla.No sé. Me parece muy conveniente.
fuente
Al trabajar dentro de una terminal, la pasta vim-bracketed complemento vim manejará automáticamente las pastas sin necesidad de pulsar ninguna tecla antes o después de pegar.
Funciona detectando el modo de pegado entre paréntesis, que es una secuencia de escape enviada por terminales "modernas" compatibles con términos x como iTerm2, gnome-terminal y otros terminales que usan libvte. Como beneficio adicional, también funciona para sesiones tmux. Lo estoy usando con éxito con iTerm2 en una Mac que se conecta a un servidor Linux y estoy usando tmux.
fuente
Pegue esto en su ~ / .vimrc y sea feliz:
Editar: en reflexión,
:r !cat
es un enfoque mucho mejor ya que es corto, semántico y no requiere vimrc personalizado. ¡Usa eso en su lugar!fuente
Aunque
:pastetoggle
o:paste
y:nopaste
deberían estar funcionando bien (si se implementan, no siempre son como podemos ver en la discusión) Recomiendo encarecidamente pegar usando el enfoque directo"+p
o"*p
y leer con"+r
o"*r
:Vim tiene acceso a diez tipos de registros (
:help registers
) y el interlocutor está interesado enquotestar
yquoteplus
desde la sección:help x11-selection
aclara aún más la diferencia de*
y+
:fuente
Esto funciona para mí (caso para + registro, lo que uso como buffer de intercambio entre aps):
fuente
Si está en una Mac, Macvim parece manejarlo bien sin tener que alternar pegar.
instalar brew macvim --override-system-vim
fuente
.vimrc
archivo?Lea este artículo: alternar la sangría automática para pegar código
fuente
La forma más rápida que conozco para ir rápidamente al modo de inserción de pegado para un pegado de una sola vez es el intacto de tpope , que presenta
yo
yyO
, presumiblemente, nemotécnicos para "abrir". Solo están documentados en su vimdoc, como:fuente
Otra forma de pegar es mediante
<CR>
y soltando el contenido del registro (aquí el registro global). Ver::h i_ctrl-r
yh i_CTRL-R_CTRL-O
.De la documentación de ayuda de vim:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}
Por lo tanto, para pegar contenido en vim sin sangría automática, úselo
<CR><CO>*
en la mayoría de los sistemas unix.Nota: esto solo funciona si se compila vim
clipboard
.fuente
De vim:
]p
Desde afuera:
"*]p
o"+]p
fuente
Otra respuesta que no vi hasta ahora:
fuente
La pasta nativa / pasta entre corchetes es la mejor y más simple desde
vim 8
(lanzada en 2016). ¡Incluso funciona sobre ssh! (La pasta entre corchetes funciona en Linux y Mac, pero no en Windows Git Bash)Asegúrese de tener vim 8+ (no necesita las opciones
+clipboard
u+xterm_clipboard
).vim --version | head -1
Simplemente use el comando de pegado nativo del sistema operativo (p. Ej.
ctrl+shift+V
Ocmd+V
) en modo normal. No presionei
para el Modo Insertar.Prueba
Copie (
ctrl+shift+C
ocmd+C
) el resultado de esto (2 líneas con una sangría de tabulación) en el portapapeles del sistema:echo -e '\ta\n\tb'
Inicie un vim 8+ limpio con autoindent:
vim -u NONE --noplugin -c 'set autoindent'
Pegue desde el portapapeles del sistema (
ctrl+shift+V
ocmd+V
) en modo normal. No presionei
para el Modo Insertar. Ela
yb
debe estar alineado con una sola sangría de pestaña. Incluso puede hacer esto mientras se transmite a una máquina remota (la máquina remota necesitará vim 8+).Ahora intente a la antigua usanza, que autoindentificará la segunda línea con una pestaña adicional: presione
i
para Insertar Modo. Luego pegue usandoctrl+shift+V
ocmd+V
. Losa
yb
están desalineados ahora.Instalar Vim 8
Ubuntu 18.04: viene con Vim 8 de forma predeterminada .
Ubuntu 16.04: instalar desde un PPA .
brew install vim
fuente
Featured snippet
para mi búsqueda 'pegar contenido sin pestañas vim', tal vez porque usé la palabra clave 'tab', solo en esta respuesta mencionada :)Lamentablemente, encontré que el complemento vim mencionado no funciona con iTerm2 3.0.15 (para ser justos, no sé si esto se rompió en versiones anteriores), pero encontré este truco.
Mapee el comando-p para pegar y usar las teclas iTerm2 vim. Obviamente, esto solo funciona para iTerm2.
Cómo funciona. Uso "jk" para ingresar al modo de escape, por lo que también necesitarás:
: inoremap jk
en tu .vimrc.
Luego solo invoca P para ingresar al modo pegar, "+ p para pegar desde el portapapeles y luego P para deshabilitar el modo pegar. Hth.
fuente