【问题标题】:Trying to get some mappings to work in vim试图让一些映射在 vim 中工作
【发布时间】:2016-07-21 10:33:09
【问题描述】:

我想使用一些映射,这样我就可以像使用我发现的常规文本编辑器一样使用 VIM this answer,这似乎适用于大多数人,大多数人不包括我。

这个想法是使用 shift 加箭头键从正常模式中进行选择,但它只会导致我的光标卡住而没有其他任何作用。

我也试图让multi-cursors 在 vi​​m 中工作,但是当我使用我的键映射时,我得到了这个错误

E78: Unknown mark

这是我的key-mappings

" Buffer switching
map <leader>p :bp<CR> " \p previous buffer
map <leader>n :bn<CR> " \n next buffer
map <leader>d :bd<CR> " \d delete buffer

" Increment numbers
nnoremap <A-a> <C-a>
nnoremap <A-x> <C-x>

map <Leader>c :call vroom#RunTestFile()<CR>
map <Leader>s :call vroom#RunNearestTest()<CR>
map <leader>t :A<CR> " \t to jump to test file
map <leader>r :r<cr> " \t to jump to related file
map <leader>E :Explore .<cr> " \E to open file explorer in root
map <leader>e :Explore<cr> " \e to open file explorer in current dir

"nerd tree mapings
map <C-n> <plug>NERDTreeTabsToggle<CR>

"shit plus arrow for selectio mode
" shift+arrow selection
nmap <S-Up> v<Up>
nmap <S-Down> v<Down>
nmap <S-Left> v<Left>
nmap <S-Right> v<Right>
vmap <S-Up> <Up>
vmap <S-Down> <Down>
vmap <S-Left> <Left>
vmap <S-Right> <Right>
imap <S-Up> <Esc>v<Up>
imap <S-Down> <Esc>v<Down>
imap <S-Left> <Esc>v<Left>
imap <S-Right> <Esc>v<Right>

"copy and pasting
vmap <C-c> y<Esc>i
vmap <C-x> d<Esc>i
map <C-v> pi
imap <C-v> <Esc>pi
imap <C-z> <Esc>ui

"multi-cursor mappings"
let g:multi_cursor_next_key='<leader>d'
let g:multi_cursor_prev_key='<leader>s'
let g:multi_cursor_skip_key='<C-x>'
let g:multi_cursor_quit_key='<Esc>'

" Removing escape
ino jj <esc>
cno jj <c-c>
vno v <esc>

" Remove highlights with leader + enter
nmap <Leader><CR> :nohlsearch<cr>

" Ruby hash syntax conversion
nnoremap <F12> :%s/:\([^ ]*\)\(\s*\)=>/\1:/g<return>

我还想补充一下,除了基本的文本编辑之外,我对 vim 还是很陌生,所以我不怀疑我做错了什么,对某些方面一无所知等,所以请在回答时考虑到这一点.

shift+left 会导致D 被输出到终端。

按下shift+right 会导致C 被输出到终端。

【问题讨论】:

  • 你知道视觉模式吗?你为什么不喜欢选择文本?您可以将其与文本动作一起使用,并选择一个单词、一行或段落,甚至是其中的多个!
  • 这是在终端吗?无法保证终端可以真正看到并识别这些键码
  • @Christian Brabandt 它认识到我按下了 shift,只是做了一些不同的事情,不确定它实际上在做什么。测试它是否识别键的最佳方法是什么?
  • 就像@SibiCoder 说的,你知道视觉模式吗?在普通模式下,只需按v 开始选择然后导航(即使使用箭头键)
  • 您似乎正试图强迫 vim 像其他编辑器一样工作。此外,与 vim 开箱即用的功能相比,这个“shift+arrow”的选择非常有限

标签: vim


【解决方案1】:

我(最终)找到了答案并解决了另一个问题。

解决方案在于这个answer on an unixstack question。

首先你需要告诉 vim 你的终端使用的转义码。 我已经做到了here:

function Allmap(mapping)
  execute 'map' a:mapping
  execute 'map!' a:mapping
endfunction

call Allmap('   <ESC>[1;2       <S>')
call Allmap('   <ESC>[1;2A      <S-Up>')
call Allmap('   <ESC>[1;2B      <S-Down>')
call Allmap('   <ESC>[1;2C      <S-Right>')
call Allmap('   <ESC>[1;2D      <S-Left>')
call Allmap('   <ESC>[1;2d      <S-d>')
call Allmap('   <ESC>[1;2s      <S-s>')

然后我只需将我想要的命令附加到声明的键映射:

map <S-Up> v<Up>
nmap <S-Down> v<Down>
nmap <S-Left> v<Left>
nmap <S-Right> v<Right>
vmap <S-Up> <Up>
vmap <S-Down> <Down>
vmap <S-Left> <Left>
vmap <S-Right> <Right>
imap <S-Up> <Esc>v<Up>
imap <S-Down> <Esc>v<Down>
imap <S-Left> <Esc>v<Left>
imap <S-Right> <Esc>v<Right>


"multi-cursor mappings"
let g:multi_cursor_next_key='<S-d>'
let g:multi_cursor_prev_key='<S-s>'

【讨论】:

  • 你实际上在做的是通过视觉模式进行选择,它已经可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多