iT邦幫忙

0

vim 使用 javacomplete2 自動補齊功能,只有 root 權限能完全工作問題

KLin 1 年前2245 瀏覽

各位大大好,
小弟使用 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)自動補全功能能完全正常運作。
補充說明:

  1. ROOT 與一般使用者之 .vimrc 及 .vim/ 放在各自家目錄,內容完全一樣,權限符合該使用者。
  2. Java Compile 完全正常 (有 import jar 檔)。
  3. 詳細 .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>

嘗試過的處理(但仍未決決問題):

  1. 檢查各 jar file 檔案權限(包含其上層目錄都檢查過)。
  2. 一般使用者 ~/.vim 目錄全部檔案目錄權限都重設過,
    使用指令chown user:user -Rv \*chmod 755 -Rv \*

懇請各位高手指教,非常感謝。

fillano iT邦超人 1 級 ‧ 1 年前 檢舉
其實只是簡單的推理,代碼補齊需要針對使用的Library做剖析,抓出關鍵字然後快取起來,然後這些東西可能會存放在這裡。我有裝VIM啦,但是他不是我主要使用的編輯器,只是在Console下需要時順手用一下。
KLin iT邦新手 5 級 ‧ 1 年前 檢舉
感謝 @fillano 大大的指教,
我其實是用 `find ~ -name *javacomplete*` 不小心挖到它的,
這次受教了解到 .cache 及自動補全代碼的祕密。
不過說也奇怪,我曾把 ~/.cache/javacomplete2/cache/class_packages_default.dat 直接砍了,重裝一次套件,新生出來的快取檔還是不正常,這可能又是另一個謎了…

再一次感謝大大的協助及熱心的講解!

1 個回答

2
fillano
iT邦超人 1 級 ‧ 1 年前
最佳解答

沒在用vim,所以是用猜的:

<pre class="c" name="code">let b:classpath="/opt/apache-tomcat-8.0.30/lib/*"

改一下這個目錄(lib)權限看看XD...我假設額外的.jar都放在這裡

看更多先前的回應...收起先前的回應...
KLin iT邦新手 5 級 ‧ 1 年前 檢舉

先感謝 @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/
fillano iT邦超人 1 級 ‧ 1 年前 檢舉

是不是先把javacomplete相關的東西先拿掉?理論上vim-javacomplete2是要取代javacomplete的,環境簡單一點也比較好測試。

KLin iT邦新手 5 級 ‧ 1 年前 檢舉

您好,依照大大的提示整理 .vim 及 .vimrc 內容,將舊版 javacomplete 清除,
修改成 vim-javacomplete2 用的參數設定,但仍是相同情形…
設定是參考:vim-javacomplete2
然後稍微測試一下 useradd 建一個新使用者並 cp 相同的 .vim/ 、.vimrc 及 .bashrc,
jar file 檔案目錄權限都沒動,結果…竟然功能完全正常了!

也嘗試過重裝 vim ,所以目前排除了 vim 設定問題及jar 檔案目錄權限問題,
現在唯一方向大概只剩下原使用者帳號環境設定,
還想請教各路高手大大們,有什麼環結是小弟沒注意到,可以嘗試的呢?謝謝。

fillano iT邦超人 1 級 ‧ 1 年前 檢舉

可能反而是原帳號的目錄或檔案權限有問題吧,例如~/.cache/javacomplete2...

KLin iT邦新手 5 級 ‧ 1 年前 檢舉

感謝 @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 就正常了!

KLin iT邦新手 5 級 ‧ 1 年前 檢舉

我解決問題時,純粹看到 .cache 裡面有 javacomplete2 覺得很可疑,
話說大大您說沒用 vim 卻還能快速發現可疑點,真得很厲害!
可以的話還想更進一步了解大大是怎麼知道的呢?
(小弟也算是 linux 玩家,希望精進這方面的知識)
謝謝您。

我要發表回答

立即登入回答