2013-06-18 78 views
1

我試圖做一個鍵盤映射,將調用latexmk時.tex可用(它會更好,如果.tex是當前打開和活動緩衝區)VIM有條件的鍵盤映射,當TEX文件打開時

我試着:

:nnoremap <Leader>lw :if filereadable('*.tex')<cr>up!<cr>:!latexmk -pdf<cr>endif<cr> 

當試圖使latexmk -pdf運行,但不幸的是,它只是提示窗口中的那些行,什麼都不做,如:

~ 
:if filereadable('*.tex') 
: up! 
: :call Tex_RunLaTeX() 
: endif 
Press ENTER or type command to continue 

好心幫。

(這將是巨大的,因爲告訴了,如果可以做到這一點的時候.tex是目前開放和活躍緩衝)

注:這個問題和它的變種已經在這裏問了幾個時間在這裏例如thisthis,因此對於重複感到抱歉。我沒有解決我的問題。

回答

1

你需要做三兩件事:

  • 解決您的映射運行指揮得當
  • 使用<buffer>選項nnoremap創建本地的特定緩衝區的映射。
  • 僅加載特定文件類型的映射。

首先通過使用利用<bar>和除去:的& <cr>的執行命令作爲單一的前命令固定的映射。我們還刪除了文件可讀部分,因爲我們只是寫了文件。

nnoremap <buffer> :up!<bar>!latexmk -pdf<cr> 

或者您可以使用像FDinoff建議的表達映射。

注意映射上的<buffer>選項。這使得映射僅對當前緩衝區而不是每個緩衝區都可用。

現在我們需要確保此映射僅適用於tex文件類型。這可以通過一個自動在您的.vimrc來完成,像這樣:

autocmd FileType tex nnoremap <buffer> :up!<bar>!latexmk -pdf<cr> 

另一種方式的選擇是通過創建一個插件。(見:h ftplugin有詳細介紹)

一個簡單的例子是做創建一個名爲,~/.vim/ftplugin/text.vim文件,並放在裏面,像這樣的映射:

nnoremap <buffer> :up!<bar>!latexmk -pdf<cr> 

我個人更傾向於本插件的方法,但具有在一切你的.vimrc文件可以很好。

1

我覺得這可以用autocmd完成。

當文件是tex文件時,autocmd只加載映射。

autocmd FileType tex nnoremap <leader>lw :up! \| !latexmk -pdf<CR> 

如果你想這樣做filereadable(「*。TEX」),它只是檢查是否在目錄中的文件是一個TEX文件。你可以使用第一個鏈接的expr映射。在表達式的其他部分中,我們只需放置一個空字符串,以便映射不會執行任何操作。

nnoremap <expr> <leader>lw filereadable('*.txt') ? ':up! \| !latexmk -pdf<CR>' : '' 
+0

我對nnoremap沒有特別的偏好,所以autocmd解決方案已經足夠好了。但是這是什麼?標記?你能解釋一下嗎? – BaRud

+0

@Rudra管道'|'是vim中的命令分隔符。在它前面的斜線正在逃脫,直到你運行命令爲止。 autocmd中還有一個nnoremap。 – FDinoff