为啥小写 [i] 在可视块模式下不起作用?

Posted

技术标签:

【中文标题】为啥小写 [i] 在可视块模式下不起作用?【英文标题】:Why lowercase [i] does not work in visual block mode?为什么小写 [i] 在可视块模式下不起作用? 【发布时间】:2015-04-05 03:32:17 【问题描述】:

我经常忘记如何在可视块模式下插入并再次阅读the answer Shift+i

Honghe.Wu 在他的评论中惊叹:

为什么小写i在可视模式下不起作用?

技术原因是什么?

【问题讨论】:

【参考方案1】:

ia 在所有视觉模式下的行为都不像正常模式的原因是 ia 用于将选择扩展到文本对象。正如您在:help visual-operators 中看到的:

4. Operating on the Visual area

The operators that can be used are:
    ~   switch case                 
    d   delete                      
    c   change (4)                  
    y   yank                        
    >   shift right (4)                 
    <   shift left (4)                  
    !   filter through external command (1)     
    =   filter through 'equalprg' option command (1)    
    gq  format lines to 'textwidth' length (1)      

The objects that can be used are:
    aw  a word (with white space)           
    iw  inner word                  
    aW  a WORD (with white space)           
    iW  inner WORD                  
    as  a sentence (with white space)           
    is  inner sentence                  
    ap  a paragraph (with white space)          
    ip  inner paragraph                 
    ab  a () block (with parenthesis)           
    ib  inner () block                  
    aB  a  block (with braces)            
    iB  inner  block                  
    at  a <tag> </tag> block (with tags)        
    it  inner <tag> </tag> block            
    a<  a <> block (with <>)                
    i<  inner <> block                  
    a[  a [] block (with [])                
    i[  inner [] block                  
    a"  a double quoted string (with quotes)        
    i"  inner double quoted string          
    a'  a single quoted string (with quotes)        
    i'  inner simple quoted string          
    a`  a string in backticks (with backticks)      
    i`  inner string in backticks           

Additionally the following commands can be used:
    :   start Ex command for highlighted lines (1)  
    r   change (4)                  
    s   change                      
    C   change (2)(4)                   
    S   change (2)                  
    R   change (2)                  
    x   delete                      
    D   delete (3)                  
    X   delete (2)                  
    Y   yank (2)                    
    p   put                     
    J   join (1)                    
    U   make uppercase                  
    u   make lowercase                  
    ^]  find tag                    
    I   block insert                    
    A   block append                    

所以只需在可视块模式下使用block insert 大写Iblock append 大写A 命令。

【讨论】:

【参考方案2】:

i 命令在光标位置之前插入。在可视块模式下,光标位置(通常)表示选择的右下角,光标位置包含在块中

所以,i 的语义不匹配,这就是它被排除在 Vim 实现之外的原因(添加这可能是对源代码的简单的一行更改)。 I(插入之前任何文本)和A(插入之后任何文本)的语义确实匹配,这就是它们在可视块模式下可用的原因。

【讨论】:

很好的解释。由于某种原因,我之前没有质疑过,只是习惯了可用的键。 还有一个事实是“我”在任何视觉模式下都会启动一个文本对象。

以上是关于为啥小写 [i] 在可视块模式下不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Vim:为啥 noremap 在插入模式下不起作用?

为啥 SMS Retriever API 在发布模式下不起作用?

Vim:如何在可视块模式下插入?

为啥 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);在横向模式下不起作用?

为啥这个 if 语句在这种情况下不起作用? [关闭]

为啥 selectAnnotation 在这种情况下不起作用?