2016-05-13 23 views
4

Ich finde die Vim Shortcuts nmap <enter> o<esc> oder nmap <enter> O<esc>, die eine Leerzeile mit der Enter-Taste einfügen, sehr nützlich. Sie verwüsten jedoch mit Plugins; zum Beispiel ag.vim, die die Quickfix-Liste mit Dateinamen füllt, zu denen gesprungen werden kann. Drücken Sie die Eingabetaste in diesem Fenster (die zu der Datei springen soll) gibt mir den Fehler E21: Cannot make changes; modifiable is off.Wie kann ich überprüfen, ob ein Vim-Puffer änderbar ist?

im quickfix Puffer Anwenden der Zuordnung zu vermeiden, kann ich dies tun:

" insert blank lines with <enter> 
function! NewlineWithEnter() 
    if &buftype ==# 'quickfix' 
    execute "normal! \<CR>" 
    else 
    execute "normal! O\<esc>" 
    endif 
endfunction 
nnoremap <CR> :call NewlineWithEnter()<CR> 

Dies funktioniert, aber was wirklich ist, ich will die Zuordnung in jedem nicht änderbar Puffer zu vermeiden, nicht nur im quickfix Fenster . Zum Beispiel macht das Mapping auch keinen Sinn in der Standortliste (und kann einige andere Plugins zerstören, die es verwenden). Wie kann ich überprüfen, ob ich in einem veränderbaren Puffer bin?

Antwort

5

Verwendung 'modifiable':

" insert blank lines with <enter> 
function! NewlineWithEnter() 
    if !&modifiable 
     execute "normal! \<CR>" 
    else 
     execute "normal! O\<esc>" 
    endif 
endfunction 
nnoremap <CR> :call NewlineWithEnter()<CR> 
6

können Sie die Option modifiable (ma) in der Zuordnung.

Sie müssen jedoch keine Funktion erstellen und in Ihrem Mapping aufrufen. Die <expr> Mapping ist für jene Anwendungsfälle konzipiert:

nnoremap <expr> <Enter> &ma?"O\<esc>":"\<cr>" 

(Die obige Linie wurde nicht geprüft, aber ich denke, es sollte gehen.)

Ausführliche Informationen zu <expr> mapping, tun :h <expr>

+0

Thanks @ Kent - Ich habe die andere Antwort akzeptiert, da sie genau meine Frage beantwortet, aber ich verwende Ihr Mapping in meiner .vimrc :) – Sasgorilla