tutorial mac editar descargar commands comandos comando macos vim terminal keyboard-shortcuts iterm2

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 de Keys ; 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ña Profiles ) y asegúrese de que +Esc esté marcado al lado de la Left option key acts as (y / o Right 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?