我正在尝试使用像Emacs这样的Vim缩进行(即“使当前行成为正确的缩进”而不是“插入制表符”)。 Vim可以使用 = (或 == )执行此操作。我的.vimrc中有imap <Tab> <Esc>==i
但这会使光标移动到该行的第一个非空格字符。我希望保留光标位置,这样我就可以点击标签返回打字而不必再次调整光标。这可能吗?
我现在拥有的内容(|
表示光标):
function f() {
doso|mething();
}
标签
function f() {
|dosomething();
}
我想要的是什么:
function f() {
doso|mething();
}
标签
function f() {
doso|mething();
}
另外
function f() {
| dosomething();
}
标签
function f() {
|dosomething();
}
答案 0 :(得分:3)
我不相信有一种“简单”的方法(即使用严格的内置功能)但是一个简单的功能就可以了。在.vimrc
文件中:
function! DoIndent()
" Check if we are at the *very* end of the line
if col(".") == col("$") - 1
let l:needsAppend = 1
else
let l:needsAppend = 0
endif
" Move to location where insert mode was last exited
normal `^
" Save the distance from the first nonblank column
let l:colsFromBlank = col(".")
normal ^
let l:colsFromBlank = l:colsFromBlank - col(".")
" If that distance is less than 0 (cursor is left of nonblank col) make it 0
if l:colsFromBlank < 0
let l:colsFromBlank = 0
endif
" Align line
normal ==
" Move proper number of times to the right if needed
if l:colsFromBlank > 0
execute "normal " . l:colsFromBlank . "l"
endif
" Start either insert or line append
if l:needsAppend == 0
startinsert
else
startinsert!
endif
endfunction
" Map <Tab> to call this function
inoremap <Tab> <ESC>:call DoIndent()<CR>
答案 1 :(得分:1)
始终有<C-T>
和<C-D>
(即 Ctrl T 和 Ctrl D )在插入模式下即可缩进和缩进。
这些不会改变光标位置 - 它们是内置功能。</ p>
答案 2 :(得分:0)
尝试使用上次插入模式的标记,并使用append命令将光标设置回原来的位置,例如:
:imap <Tab> <Esc>==`^a