macos - mac - Usar asignaciones CMD en la consola Vim
vim mac (1)
Es posible, pero requiere algunas acciones y tiene algunas desventajas.
El primer conjunto de problemas es que:
- aunque iTerm2 puede aceptar las teclas de Comando y pasarlas a programas de terminal, solo puede hacerlo reasignandolas como algo más, por ejemplo, la Opción Izquierda o las teclas de Control .
- solo puede reasignar cada tecla modificadora en todas partes en iTerm2; no puede hacerlo solo para ciertas ventanas, paneles o perfiles.
- para reasignar un modificador dentro del terminal, debe permitir que iTerm2 controle la computadora en el panel de preferencias de Seguridad y privacidad; cuando configura iTerm2 para hacer la reasignación, lo dirigirá allí automáticamente.
- una vez que haya reasignado el comando de la izquierda , cosas como Left Command + N para abrir una nueva ventana ya no funcionan. Afortunadamente, sin embargo, puede reasignar, por ejemplo, la Opción Izquierda al Comando Izquierdo y aún tener su clave de Comando Derecha disponible para los accesos directos de Mac; o puede cambiar sus teclas de Comando y Opción .
El problema restante es que Vim no está configurado de fábrica con las teclas de acceso Mac. Afortunadamente, MacVim incluye la mayoría de sus enlaces GUI estilo Mac en /Applications/MacVim.app/Contents/Resources/vim/runtime/macmap.vim en lugar de codificarlos en Interface Builder u Objective-C source; así que pude copiarlos y adaptarlos para la terminal. Aquí hay una configuración que funciona muy de cerca con MacVim (y otras aplicaciones de Mac):
" Keybindings for terminal vim; mostly to emulate MacVim (somewhat)
" See /Applications/MacVim.app/Contents/Resources/vim/runtime/macmap.vim (from
" which many of the following are taken); and menu.vim in the same directory.
" Since these all have native (Cmd-modified) versions in MacVim, don''t bother
" defining them there.
" A utility function to help cover our bases when mapping.
"
" Example of use:
" call NvicoMapMeta(''n'', '':new<CR>'', 1)
" is equivalent to:
" exec "set <M-n>=/<Esc>n"
" nnoremap <special> <Esc>n :new<CR>
" vnoremap <special> <Esc>n <Esc><Esc>ngv
" inoremap <special> <Esc>n <C-o><Esc>n
" cnoremap <special> <Esc>n <C-c><Esc>n
" onoremap <special> <Esc>n <Esc><Esc>n
function! NvicoMapMeta(key, cmd, add_gv)
" TODO: Make this detect whether key is something that has a Meta
" equivalent.
let l:keycode = "<M-" . a:key . ">"
let l:set_line = "set " . l:keycode . "=/<Esc>" . a:key
let l:nmap_line = ''nmap <silent> <special> '' . l:keycode . '' '' . a:cmd
let l:vnoremap_line = ''vnoremap <silent> <special> '' . l:keycode . '' <Esc>'' . l:keycode
if(a:add_gv)
let l:vnoremap_line.=''gv''
endif
let l:inoremap_line = ''inoremap <silent> <special> '' . l:keycode . '' <C-o>'' . l:keycode
let l:cnoremap_line = ''cnoremap <special> '' . l:keycode . '' <C-c>'' . l:keycode
let l:onoremap_line = ''onoremap <silent> <special> '' . l:keycode . '' <Esc>'' . l:keycode
exec l:set_line
exec l:nmap_line
exec l:vnoremap_line
exec l:inoremap_line
exec l:cnoremap_line
exec l:onoremap_line
endfunction
" I can''t think of a good function to assign to Meta+n, since in MacVim Cmd+N
" opens a whole new editing session.
" Meta+Shift+N
" No equivalent to this in standard MacVim. Here " it just opens a window on a
" new buffer.
call NvicoMapMeta(''N'', '':new<CR>'', 1)
" Meta+o
" Open netrw file browser
call NvicoMapMeta(''o'', '':split %:p:h<CR>'', 1)
" Meta+w
" Close window
call NvicoMapMeta(''w'', '':confirm close<CR>'', 1)
" Meta+s
" Save buffer
call NvicoMapMeta(''s'', '':confirm w<CR>'', 1)
" Meta+Shift+S
" Save as
" TODO: This is silent, so you can''t tell it''s waiting for input. If anyone can
" fix this, please do!
call NvicoMapMeta(''S'', '':confirm saveas '', 1)
" Meta+z
" Undo
call NvicoMapMeta(''z'', ''u'', 1)
" Meta+Shift+Z
" Redo
call NvicoMapMeta(''Z'', ''<C-r>'', 1)
" Meta+x
" Cut to system clipboard (requires register +")
exec "set <M-x>=/<Esc>x"
vnoremap <special> <M-x> "+x
" Meta+c
" Copy to system clipboard (requires register +")
exec "set <M-c>=/<Esc>c"
vnoremap <special> <M-c> "+y
" Meta+v
" Paste from system clipboard (requires register +")
exec "set <M-v>=/<Esc>v"
nnoremap <silent> <special> <M-v> "+gP
cnoremap <special> <M-v> <C-r>+
execute ''vnoremap <silent> <script> <special> <M-v>'' paste#paste_cmd[''v'']
execute ''inoremap <silent> <script> <special> <M-v>'' paste#paste_cmd[''i'']
" Meta+a
" Select all
call NvicoMapMeta(''a'', '':if &slm != ""<Bar>exe ":norm gggH<C-o>G"<Bar> else<Bar>exe ":norm ggVG"<Bar>endif<CR>'', 0)
" Meta+f
" Find regexp. NOTE: MacVim''s Cmd+f does a non-regexp search.
call NvicoMapMeta(''f'', ''/'', 0)
" Meta+g
" Find again
call NvicoMapMeta(''g'', ''n'', 0)
" Meta+Shift+G
" Find again, reverse direction
call NvicoMapMeta(''G'', ''N'', 0)
" Meta+q
" Quit Vim
" Not quite identical to MacVim default (which is actually coded in the app
" itself rather than in macmap.vim)
call NvicoMapMeta(''q'', '':confirm qa<CR>'', 0)
" Meta+Shift+{
" Switch tab left
call NvicoMapMeta(''{'', '':tabN<CR>'', 0)
" Meta+Shift+}
" Switch tab right
call NvicoMapMeta(''}'', '':tabn<CR>'', 0)
" Meta+t
" Create new tab
call NvicoMapMeta(''t'', '':tabnew<CR>'', 0)
" Meta+Shift+T
" Open netrw file browser in new tab
call NvicoMapMeta(''T'', '':tab split %:p:h<CR>'', 0)
" Meta+b
" Call :make
call NvicoMapMeta(''b'', '':make<CR>'', 1)
" Meta+l
" Open error list
call NvicoMapMeta(''l'', '':cl<CR>'', 1)
" TODO: We need to configure iTerm2 to be able to send Cmd+Ctrl+arrow keys, so
" we can duplicate the :cnext/:cprevious/:colder/:cnewer bindings to those keys
" in MacVim.
" There may be a few others I''ve missed, too.
La función NvicoMakeMeta
mapea una versión meta-clave-modificada de la clave pasada a la acción especificada; "meta-key" aquí es solo un término genérico para Command - o Option -modified. El "Nvico" en su nombre representa el hecho de que mapea en modo normal, visual, inserción, comando y operador pendiente.
Debido a la forma en que Vim funciona al interpretar el carácter ESC
(que es el comienzo de todas las secuencias de metaetiquetas, teclas de flecha, etc.), si simplemente asignamos secuencias de ESC
más otro personaje, terminaríamos con Vim esperando una cantidad notable de tiempo después de recibir la tecla Esc actual (por ejemplo, para indicar el deseo de volver al modo normal). La forma en que mi función lo evita es mediante :set
establecer un código de tecla (ver :help :set-termcap
).
Para resumir, esto es lo que debe hacer:
- Pon el código de arriba en tu .vimrc.
- Vaya a las preferencias generales iTerm2 (menú
iTerm
>Preferences…
); ve a la pestaña deKeys
; vuelva a asignarle la clave que quiera usar como modificador para que envíe la Opción izquierda o la Opción derecha . Siga los consejos para permitir que iTerm2 controle la computadora; debería abrir el panel de preferencias correcto para que lo haga. Deberá hacer clic en el candado y escribir su contraseña antes de poder marcar la casilla junto a iTerm. - Abra las preferencias para el perfil del terminal que desea usar (por ejemplo, abriéndolo en el cuadro de diálogo
Preferences
toda la aplicación en la pestañaProfiles
) y asegúrese de que+Esc
esté marcado al lado de laLeft option key acts as
(y / oRight option key acts as
, dependiendo de si ha hecho su tecla meta, envíe la opción derecha ).
¿Hay alguna forma de usar la tecla Cmd
para Vim en la terminal? Algo que hace MacVim.
He reasignado Cmd+S
en iTerm2 para enviar Esc:w!<CR>
para guardar archivos en Vim, pero esto suena un poco débil.
Con todo el poder de iTerm y Vim, debería haber alguna manera de hacer esto bien?