reemplazar que comando vim vi

comando - que es vim



Mueve toda la línea hacia arriba y hacia abajo en Vim (18)

: m. + 1 o: m.-2 haría si está moviendo una sola línea. Aquí está mi script para mover varias líneas. En el modo visual, Alt-arriba / Alt-abajo moverá las líneas que contienen la selección visual arriba / abajo en una línea. En el modo de inserción o en el modo normal, Alt-arriba / Alt-abajo moverá la línea actual si no se da un prefijo de conteo. Si hay un prefijo de conteo, Alt-arriba / Alt-abajo moverá esa cantidad de líneas que comienzan desde la línea actual hacia arriba / abajo en una línea.

function! MoveLines(offset) range let l:col = virtcol(''.'') let l:offset = str2nr(a:offset) exe ''silent! :'' . a:firstline . '','' . a:lastline . ''m'' / . (l:offset > 0 ? a:lastline + l:offset : a:firstline + l:offset) exe ''normal '' . l:col . ''|'' endf imap <silent> <M-up> <C-O>:call MoveLines(''-2'')<CR> imap <silent> <M-down> <C-O>:call MoveLines(''+1'')<CR> nmap <silent> <M-up> :call MoveLines(''-2'')<CR> nmap <silent> <M-down> :call MoveLines(''+1'')<CR> vmap <silent> <M-up> :call MoveLines(''-2'')<CR>gv vmap <silent> <M-down> :call MoveLines(''+1'')<CR>gv

En Notepad ++, puedo usar Ctrl + Shift + Arriba / Abajo para mover la línea actual hacia arriba y hacia abajo. ¿Hay un comando similar a esto en Vim? He mirado a través de guías sin fin, pero no he encontrado nada.

Si no hay, ¿cómo podría vincular la acción a esa combinación de teclas?

Edición: la respuesta de Mykola funciona para todas las líneas, aparte de las que se encuentran al principio y al final del búfer. Mover la primera línea hacia arriba o la línea inferior hacia abajo borra la línea, y al mover la línea inferior hacia arriba, salta dos espacios inicialmente, ¡como un peón! ¿Alguien puede ofrecer algún refinamiento?


Aquí hay una versión simplificada, para MacVim, utilizando los ejemplos del artículo de Wikia (véase el enlace del comentario de Gun).

" Move selection up/down (add =gv to reindent after move) :vmap <D-S-Up> :m-2<CR>gv :vmap <D-S-Down> :m''>+<CR>gv

Estoy usando solo la variante de selección de bloque, porque todo lo que necesita Shift-V para seleccionar la línea actual, y opcionalmente el cursor hacia arriba / abajo para seleccionar algunas líneas más.

De acuerdo con los atajos de arriba, al presionar Cmd-Shift-Up / Down se desplazará la selección de bloque arriba / abajo. "D" es la tecla Comando en MacVim, para Windows intente con "C" (Control), o "A" (Alt) (por ejemplo, <CAf> sería Control Alt f).

El artículo de Wikia agrega "= gv" a estos, lo que tiene el efecto de ajustar la sangría del bloque después del movimiento, basado en el texto circundante. Esto es confuso, así que lo eliminé y agregué accesos directos para sangrar rápidamente la selección.

" Indent selection left/right (Cmd Shift Left/Right is used for Tab switching) :vmap <D-A-Left> <gv :vmap <D-A-Right> >gv

Tenga en cuenta que se puede hacer lo mismo con << y >>, pero la selección se perdería, por lo que estos accesos directos de arriba permiten sangrar varias veces y aún así mover el bloque porque la selección se mantiene.

Mi MacVim está configurado para cambiar las pestañas con Cmd-Shift-Left / Right, así que usé Cmd-Alt-Left / Right.

Aquí está el cambio de pestaña para MacVim (poner en .gvimrc con el resto arriba):

:macm Window.Select/ Previous/ Tab key=<D-S-Left> :macm Window.Select/ Next/ Tab key=<D-S-Right>


Cuando presionas comando :help move en vim , aquí está el resultado:

:[range]m[ove] {address} *:m* *:mo* *:move* *E134* Move the lines given by [range] to below the line given by {address}.

Ej .: Mover la línea actual una línea hacia abajo => :m+1 .

Ej .: Mover la línea con el número 100 debajo de la línea con el número 80 => :100 m 80 .

Ej .: Mover la línea con el número 100 debajo de la línea con el número 200 => :100 m 200 .

Ej .: Mover líneas con número dentro de [100, 120] debajo de la línea con número 200 => :100,120 m 200 .


En caso de que quiera hacer esto en varias líneas que coincidan con una búsqueda específica:

  • Arriba:: :g/Your query/ normal ddp o :g/Your query/ m -1
  • Abajo :g/Your query/ normal ddp o :g/Your query/ m +1

En el modo de comando, coloque el cursor en la línea que desea mover hacia abajo y luego

ddp

Explicación: dd elimina la línea actual del búfer general p y la vuelve a poner DESPUÉS de la posición del cursor, o en el caso de líneas completas, una línea debajo.

Existe cierta confusión con respecto a los comandos p y P en muchos documentos. En realidad p pega el cursor AFTER, y el cursor P AT.


Esto funcionó para mí:

http://vim.wikia.com/wiki/Moving_lines_up_or_down_in_a_file

Por cierto, si desea utilizar ALT + some_key y su terminal (urxvt hace esto) se niega a cumplir, debe ingresar algo como esto en su .vimrc:

" For moving lines (^] is a special character; use <M-k> and <M-j> if it works) nnoremap ^]k mz:m-2<CR>`z== inoremap ^]j <Esc>:m+<CR>==gi inoremap ^]k <Esc>:m-2<CR>==gi vnoremap ^]j :m''>+<CR>gv=`<my`>mzgv`yo`z nnoremap ^]j mz:m+<CR>`z== vnoremap ^]k :m''<-2<CR>gv=`>my`<mzgv`yo`z

donde ^] es un solo carácter que representa la tecla ALT. Para ingresar ese carácter, use C + v, Esc en Vim ( C + q, Esc en Windows).


Mueve una línea hacia arriba: ddkP

Mueve una línea hacia abajo: ddp


Para mí, ddkkp hizo (en lugar de ddkP con una P mayúscula, que también funcionaría).


Ponga lo siguiente en su .vimrc para hacer el trabajo

noremap <c-s-up> :call feedkeys( line(''.'')==1 ? '''' : ''ddkP'' )<CR> noremap <c-s-down> ddp

La desaparición de la línea parece un error de Vim. Puse un hack para evitarlo. Probablemente hay alguna solución más precisa.

Actualizar

Hay muchas dificultades inexplicables con solo usar las combinaciones de Vim. Estas son líneas que faltan y líneas adicionales que saltan.

Así que aquí está la solución de secuencias de comandos que se puede colocar dentro de .vimrc o ~ / .vim / plugin / swap_lines.vim

function! s:swap_lines(n1, n2) let line1 = getline(a:n1) let line2 = getline(a:n2) call setline(a:n1, line2) call setline(a:n2, line1) endfunction function! s:swap_up() let n = line(''.'') if n == 1 return endif call s:swap_lines(n, n - 1) exec n - 1 endfunction function! s:swap_down() let n = line(''.'') if n == line(''$'') return endif call s:swap_lines(n, n + 1) exec n + 1 endfunction noremap <silent> <c-s-up> :call <SID>swap_up()<CR> noremap <silent> <c-s-down> :call <SID>swap_down()<CR>


Pongo lo siguiente al final de mi archivo .vimrc:

noremap H ddkkp noremap N ddp

Así que ahora ''H'' y ''N'' mueven la línea actual hacia arriba y hacia abajo respectivamente.


Si quiero intercambiar una línea con la línea de arriba, generalmente hago lo siguiente

ddkP

Explicación

  • dd eliminará la línea y la agregará al registro predeterminado.
  • k se moverá hacia arriba una línea (j se moverá hacia abajo una línea)
  • P pegará por encima de la línea actual

Solo agrega este código a .vimrc (o .gvimrc)

nnoremap <A-j> :m+<CR>== nnoremap <A-k> :m-2<CR>== inoremap <A-j> <Esc>:m+<CR>==gi inoremap <A-k> <Esc>:m-2<CR>==gi vnoremap <A-j> :m''>+<CR>gv=gv vnoremap <A-k> :m-2<CR>gv=gv


Suponiendo que el cursor está en la línea que te gusta mover.

Moviéndose arriba y abajo :m para mover

:m +1 - se mueve hacia abajo 1 línea

:m -2 - subir 1 líneas

(Tenga en cuenta que puede reemplazar +1 con cualquier número dependiendo de cuántas líneas quiera moverlo hacia arriba o hacia abajo, es decir, +2 lo movería hacia abajo 2 líneas, -3 lo movería hacia arriba 2 líneas)

Para moverse a una línea específica.

:set number : muestra las líneas numéricas (es más fácil ver a dónde se está moviendo)

:m 3 : mueve la línea después de la tercera línea (reemplaza 3 por cualquier línea que desees)

Moviendo múltiples lineas:

V (es decir, Shift - V ) y mueva el cursor hacia arriba y hacia abajo para seleccionar varias líneas en VIM

una vez seleccionado pulsa : y ejecuta los comandos anteriores, m +1 etc.


Una solución simple es poner en tu .vimrc estas líneas:

nmap <C-UP> :m-2<CR> nmap <C-DOWN> :m+1<CR>


agregue lo siguiente al archivo ~ / .vimrc (asegúrese de que no tiene asignación para n, m)

nmap n :m +1<CR> nmap m :m -2<CR>

ahora presionando la tecla n se moverá una línea hacia abajo y m moverá una línea hacia arriba.


vim plugin unimpaired.vim [e y] e


Aquí hay una solución que funciona en mi máquina : MacBook Pro ejecutando VIM 8.1

Estos comandos no eliminarán sus líneas en la parte superior o inferior de su búfer.

El uso de los símbolos reales que sacan Alt-J y Alt-K es una solución para que sus códigos clave no se asignen correctamente en mi entorno.

Tira esto en el antiguo .vimrc y ve si funciona para ti.

" Maps Alt-J and Alt-K to macros for moving lines up and down " Works for modes: Normal, Insert and Visual nnoremap ∆ :m .+1<CR>== nnoremap ˚ :m .-2<CR>== inoremap ∆ <Esc>:m .+1<CR>==gi inoremap ˚ <Esc>:m .-2<CR>==gi vnoremap ∆ :m ''>+1<CR>gv=gv vnoremap ˚ :m ''<-2<CR>gv=gv