macos - oficial - Pegar el código en la ventana de terminal en vim en Mac OS X
vim vs macvim (6)
Cuando pego código en mi ventana de terminal de Mac OS X en vim, sangra cada línea. Para cada línea, agrega una sangría para que el texto se vea así ...
"ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
deserunt mollit anim id est laborum."
Mi solución actual es que pegue el texto primero en el editor de texto textmate que mantiene el formato correcto. Luego guardo ese archivo y lo abro en vim. Luego uso vim yank para pegarlo.
¿Hay alguna configuración en mi .vimrc que pueda cambiar este comportamiento? ¿O es esto un problema terminal?
A partir de Mac OS X Lion 10.7, el terminal es compatible con el "modo de pegado entre paréntesis", que permite al emulador de terminal indicarle al programa conectado al tty cuando el usuario pega texto, para que el programa no lo interprete como comandos de edición. Los programas que lo soportan envían al terminal una secuencia de escape para habilitar este modo, en el que el terminal rodea el texto pegado con un par de secuencias de escape que identifican el inicio y el final.
Para habilitar esto en Vim, coloque el siguiente código en su archivo ~ / .vimrc:
if &term =~ "xterm.*"
let &t_ti = &t_ti . "/e[?2004h"
let &t_te = "/e[?2004l" . &t_te
function! XTermPasteBegin(ret)
set pastetoggle=<Esc>[201~
set paste
return a:ret
endfunction
map <expr> <Esc>[200~ XTermPasteBegin("i")
imap <expr> <Esc>[200~ XTermPasteBegin("")
vmap <expr> <Esc>[200~ XTermPasteBegin("c")
cmap <Esc>[200~ <nop>
cmap <Esc>[201~ <nop>
endif
Esto hace que cuando Vim cambie el terminal a / desde la pantalla alternativa † (t_ti, t_te) habilite / deshabilite el modo de pegado entre corchetes (ESC [? 2004 h, ESC [? 2004 l)]. Cuando recibe la secuencia de escape que indica el inicio de un pegado (ESC [200 ~), habilita el modo Pegar (establecer pegar) y cambia al modo Insertar si es necesario ("i"). Cuando recibe el marcador de fin de pegado correspondiente (ESC [201 ~)] deshabilita el modo Pegar (pegar) y permanece en el modo Insertar. Los comandos de cmap
comandos de Vim ignore las secuencias de escape y acepte el texto pegado tal como está.
Tenga en cuenta que esto solo habilita el modo de pegado entre corchetes cuando el valor de $ TERM comienza con "xterm ..."; si está configurando $ TERM para otra cosa, es posible que desee revisar esa prueba para incluir su valor de $ TERM. O bien, podría omitir la prueba por completo, ya que no es estrictamente necesario; solo trata de tener cuidado de no hacer algo que pueda ser incompatible con algún otro tipo de terminal.
En Terminal, esto funciona con todos los diversos comandos Pegar, así como con arrastrar y soltar.
† El terminal tiene una pantalla principal y una pantalla "alternativa". Cada pantalla tiene su propio contenido y estado. El texto en la pantalla alternativa no se desplaza hacia arriba en el registro de desplazamiento. Suele ser utilizado por programas que toman el control de toda la pantalla y, por lo tanto, se los denomina programas de "pantalla completa". Esto incluye vim, emacs, less y top, por ejemplo.
Además de las otras respuestas, si desea una forma rápida de alternar el modo de pegar, agregue
set pastetoggle=<F2>
a tu .vimrc. Ahora puede alternar el modo de pegar presionando F2 (o la tecla que elija).
Al trabajar dentro de un terminal, el complemento github.com/ConradIrwin/vim-bracketed-paste vim manejará automáticamente las pastas sin necesidad de presionar ninguna tecla antes o después del pegado.
Esto funciona en Terminal, iTerm2 y cualquier terminal "moderno" compatible con X-term que soporte el modo de pegado entre corchetes. Como una ventaja adicional, también funciona para las sesiones de tmux. Lo estoy usando con éxito con iTerm2 en una Mac que se conecta a un servidor Linux y usa tmux.
El complemento es básicamente una versión empaquetada de la funcionalidad que @Chris Page enumeraba en su answer .
Dentro de vim:
:set paste
Ponga Vim en modo Pegar. Esto es útil si quiere cortar o copiar texto de una ventana y pegarlo en Vim. Esto evitará los efectos inesperados.
En vim
: establecer pegar
cuando quieras deshabilitarlo
: establecer nopaste
Otra forma de hacerlo, suponiendo que tiene configurado correctamente el portapapeles del sistema, es hacerlo
"+p
Esto pegará desde el portapapeles del sistema.