各位大大好,
小弟使用 Debian/Jessie 作業系統,
並以 vim 作為 Java 程式編寫工具(加入 Plugin vim-javacomplete2)。
問題:當使用一般使用者執行 vim 時,可以自動補全 java-jdk 基本內容,
但是外加的 classpath (例:mysql-connector-java-5.1.38-bin.jar),
無法自動補全到 mysql 相關內容。然而,只要切換至 ROOT 權限或 sudo vim,
則(外加的 jar file)自動補全功能能完全正常運作。
補充說明:
ROOT 與一般使用者之 .vimrc 及 .vim/ 放在各自家目錄,內容完全一樣,權限符合該使用者。
Java Compile 完全正常 (有 import jar 檔)。
詳細 .vimrc 設定如下:
" Reference
" http://wangkuiwu.github.io/2011/08/02/vim-02-setup/
" http://note.drx.tw/2008/01/vimrc-config.html
" http://linux.vbird.org/linux_basic/0310vi.php
" https://github.com/artur-shaik/vim-javacomplete2
" http://tech2insight.blogspot.tw/2012/09/vimjava.html
set nocompatible " be iMproved, required
filetype off " required
" ========== Vumdle Setting =============
set rtp+=~/.vim/bundle/Vundle.vim "Vundle START
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
" Java 自動補全套件
Plugin 'artur-shaik/vim-javacomplete2'
Plugin 'javacomplete'
" 自動語法檢查
Plugin 'scrooloose/syntastic'
call vundle#end() " Vundle END
filetype plugin indent on "→ 等同下面三行命令:
"filetype on " 檔案類型檢測,結合 autocmd 指令使用。
"filetype plugin on " 載入副合檔案類型之外掛套件 Plugin。
"filetype indent on " 允許不同類型定義各別縮排格式。
" ========== omnifunc:javacomplete 自動補全功能 =========
" 設定此行在 java 檔案中,就可按(ctrl + x) + (ctrl + o) 自動補全
setlocal omnifunc=javacomplete#Complete
" 當檔案為副檔名為 java 動作
" mode的狀態下,按"."會替換成以下指令,換言之,與ide相同當按"."會自動補全
autocmd Filetype java,jsp set omnifunc=javacomplete#Complete
autocmd Filetype java,jsp set completefunc=javacomplete#CompleteParamsInf
autocmd Filetype java,jsp inoremap <buffer> . .<C-X><C-O><C-P><DOWN>
" 設定額外 include 的 classpath
let b:classpath="/opt/apache-tomcat-8.0.30/lib/*"
" ========== omnifunc:javacomplete2 自動補全功能 =========
autocmd FileType java setlocal omnifunc=javacomplete#Complete
let g:JavaComplete_MavenRepositoryDisable = 1
let g:JavaComplete_UseFQN = 1
let g:JavaComplete_ClosingBrace = 1
let g:JavaComplete_JavaviDebug = 1
let g:JavaComplete_ImportDefault = 0
" ========== 其他自訂義參數==============
" 樣式 (文字顏色及底色)
colorscheme default " 命令模式下 :colorscheme 後按 Tab 可以看到更多樣式
" 顯示
set bg=dark " 背景與文字高對比色
set wrap " 字元過長自動換行
set ruler " 顯示右下角狀態 (行數,字數)
"set nu " 顯示行號 (關閉:set nonu)
set cursorline " 游標所在位置行高亮度 (水平)
"set cursorcolumn " 游標所在位置列高亮度 (垂直)
" 搜索
set hlsearch " 搜尋時,以高度亮顯示 (等於 set hls)
set ignorecase " 搜尋時,忽略大小寫 (等於 set ic)
set smartcase " 若搜尋目標有大寫英文時,忽略 'ignorecase' 功能
set incsearch " 輸入關鍵字同時開始搜尋結果
" 語法高亮度
syntax enable
syntax on
" Tab and Space
set tabstop=4 " Tab 寬度 = 4 個空白鍵
set shiftwidth=4 " 自動縮排 = 4 個空白鍵
" set expandtab " 將 Tab 轉成等寬空白,方便貼到別的編輯器能保有原本排版
" set softtabstop=4 " 按 Backspace 可以一次刪 4 個空白鍵
" 縮排 (手動排版:gg → shift+v → shift+g → = )
set autoindent " 自動縮排
set smartindent " 跳新一行時,智慧縮排
" 編碼
set encoding=utf-8
set termencoding=utf-8
" ============== 自定快捷鍵 ===============
" F2自动保存
map <F2> :up<CR>
" F4强制关闭窗口
"map <F4> :q<CR>
"To enable inserting class imports with F4, add:
nmap <F4> <Plug>(JavaComplete-Imports-Add)
imap <F4> <Plug>(JavaComplete-Imports-Add)
" To add all missing imports with F5:
nmap <F5> <Plug>(JavaComplete-Imports-AddMissing)
imap <F5> <Plug>(JavaComplete-Imports-AddMissing)
" To remove all missing imports with F6:
nmap <F6> <Plug>(JavaComplete-Imports-RemoveUnused)
imap <F6> <Plug>(JavaComplete-Imports-RemoveUnused)
" Paste Mode 可以避免自動縮排、Plugin 及其他設定干擾複製/貼上之格式。(開關鍵)
set pastetoggle=<F12>
嘗試過的處理(但仍未決決問題):
chown user:user -Rv \*
及 chmod 755 -Rv \*
。懇請各位高手指教,非常感謝。
沒在用vim,所以是用猜的:
<pre class="c" name="code">let b:classpath="/opt/apache-tomcat-8.0.30/lib/*"
改一下這個目錄(lib)權限看看XD...我假設額外的.jar都放在這裡
先感謝 @fillano 大大回覆,
您假設的沒錯,我所以 .jar file 都是放在 /opt/apache-tomcat-8.0.30/lib 內,
因為是個人電腦,所以整個 /opt 目錄都是設我的一般使用者權限,
有下過指令修改過權限了… (註:chmod -R 是包含 /opt 下所有子檔案目錄)
<pre class="c" name="code">
#chown user.user -Rv /opt
#chmod 755 -Rv /opt
查看結果:
<pre class="c" name="code">
$ls -ld /opt/apache-tomcat-8.0.30/lib
drwxr-xr-x 2 user user 4096 3月 2 09:25 /opt/apache-tomcat-8.0.30/lib/
是不是先把javacomplete相關的東西先拿掉?理論上vim-javacomplete2是要取代javacomplete的,環境簡單一點也比較好測試。
您好,依照大大的提示整理 .vim 及 .vimrc 內容,將舊版 javacomplete 清除,
修改成 vim-javacomplete2 用的參數設定,但仍是相同情形…
設定是參考:vim-javacomplete2
然後稍微測試一下 useradd 建一個新使用者並 cp 相同的 .vim/ 、.vimrc 及 .bashrc,
jar file 檔案目錄權限都沒動,結果…竟然功能完全正常了!
也嘗試過重裝 vim ,所以目前排除了 vim 設定問題及jar 檔案目錄權限問題,
現在唯一方向大概只剩下原使用者帳號環境設定,
還想請教各路高手大大們,有什麼環結是小弟沒注意到,可以嘗試的呢?謝謝。
可能反而是原帳號的目錄或檔案權限有問題吧,例如~/.cache/javacomplete2...
感謝 @fillano 點中問題了!
剛剛我自行胡亂測試結果成功解決掉問題,問題剛好如大大所說的 ~/.cache 目錄下的檔案…
解決方法如下:
一、假設我原使用者為:user,新建一測試用使用者:test
<pre class="c" name="code">
#useradd -m -s /bin/bash test
#cd /home/user
#rsync -av .bashrc .vimrc .vim /home/test → 幫新創的 test 建置 vim-complete2。
#chown -Rv test:test /home/test
二、確定 test 的 vim-complete2 是正常的:
<pre class="c" name="code">
#su - test
test:~$vim .vimrc → 安裝 Vumdle/Plugin(執行 :PluginInstall)。
test:~$vim test.java → 測試 vim-complete2 完全OK,此時會自動生成 .cache/javacomplete2/cache/class_packages_default.dat , 關鍵就是它…
三、將 test 生成的 class_packages_default.dat 取代掉原帳號 user 內相同路徑檔案:
<pre class="c" name="code">
test:~$sudo rm -rf /home/user/.cache/javacomplete2/cache/class_packages_default.dat
test:~$sudo rsync -av .cache/javacomplete2/cache/class_packages_default.dat /home/.cache/javacomplete2/cache
四、改一下 class_packages_default.dat 檔案所有者,原帳號這邊 vim-complete2 就正常了!
我解決問題時,純粹看到 .cache 裡面有 javacomplete2 覺得很可疑,
話說大大您說沒用 vim 卻還能快速發現可疑點,真得很厲害!
可以的話還想更進一步了解大大是怎麼知道的呢?
(小弟也算是 linux 玩家,希望精進這方面的知識)
謝謝您。