[英]Vim, swapping words with accented characters
我正在嘗試使用以下映射在Vim中交換單詞:
" Swap current word with previous one (push word to the left)
nnoremap <silent> <A-h> "_yiw?\k\+\_W\+\%#<CR>:s/\(\%#\k\+\)\(\_W\+\)\(\k\+\)/\3\2\1/<CR><c-o><cl>:noh<CR>
" Swap current word with the next one (push word to the right)
nnoremap <silent> <A-l> "_yiw:s/\(\%#\k\+\)\(\_W\+\)\(\k\+\)/\3\2\1/<CR><c-o>/\k\+\_W\+<CR><c-l>:noh<CR>
我的vimrc文件中還包含以下內容
set isk=@,48-57,_,192-255,:,#
上面的映射可以很好地用於交換(推送單詞),除非帶有重音符號的單詞開頭。 由於我經常用西班牙語寫帶重音符號的字符,因此如何更改正則表達式來解決此問題?
問題在於\\_W
“匹配非\\_W
和換行符”原子。 在Vim中,單詞僅限於ASCII字符,因此您的重音字符在此處匹配並創建錯誤的邊界。 相反,您需要“非關鍵字和換行符”。 由於\\K
不是 \\k
的否定,我們必須使用\\%(\\k\\@!\\_.\\)
“不是關鍵字的任何字符(和換行符)”。 這些是結果映射:
nnoremap <silent> <A-h> "_yiw?\k\+\%(\k\@!\_.\)\+\%#<CR>:s/\(\%#\k\+\)\(\%(\k\@!\_.\)\+\)\(\k\+\)/\3\2\1/<CR><c-o><c-l>:noh<CR>
nnoremap <silent> <A-l> "_yiw:s/\(\%#\k\+\)\(\%(\k\@!\_.\)\+\)\(\k\+\)/\3\2\1/<CR><c-o>/\k\+\%(\k\@!\_.\)\+<CR><c-l>:noh<CR>
我通常更喜歡一個宏,可以說我們有如下一行(是的,我只是用它來解釋,這沒有任何意義):
實驗性的
現在在vim中,我將轉到此行的開頭,然后按q,然后按一個記錄鍵(任何字母數字鍵),讓我們說“ l”。 然后記錄我的動作:
按'dW'剪切單詞(大寫w並假設單詞以空格結尾)
繼續以e結尾
按“ a”添加空格
按 ''
輸入“ p”進行粘貼。
我第一次知道它太麻煩了,但是一旦將其保存起來,您就可以用“ @l”對任何單詞進行調用,“ l”是我們上面的記錄鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.