iT邦幫忙

0

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

KLin 2016-03-04 23:14:444543 瀏覽
  • 分享至 

  • twitterImage

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

再一次感謝大大的協助及熱心的講解!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
fillano
iT邦超人 1 級 ‧ 2016-03-07 09:28:47
最佳解答

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

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

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

看更多先前的回應...收起先前的回應...
KLin iT邦新手 5 級 ‧ 2016-03-07 11:30:13 檢舉

先感謝 @fillano 大大回覆,
您假設的沒錯,我所以 .jar file 都是放在 /opt/apache-tomcat-8.0.30/lib 內,
因為是個人電腦,所以整個 /opt 目錄都是設我的一般使用者權限,
有下過指令修改過權限了… (註:chmod -R 是包含 /opt 下所有子檔案目錄)

&lt;pre class="c" name="code">
#chown user.user -Rv /opt
#chmod 755 -Rv /opt

查看結果:

&lt;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 級 ‧ 2016-03-07 20:03:31 檢舉

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

KLin iT邦新手 5 級 ‧ 2016-03-11 14:13:24 檢舉

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

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

fillano iT邦超人 1 級 ‧ 2016-03-11 14:48:19 檢舉

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

KLin iT邦新手 5 級 ‧ 2016-03-11 17:53:15 檢舉

感謝 @fillano 點中問題了!
剛剛我自行胡亂測試結果成功解決掉問題,問題剛好如大大所說的 ~/.cache 目錄下的檔案…
解決方法如下:
一、假設我原使用者為:user,新建一測試用使用者:test

&lt;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 是正常的:

&lt;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 內相同路徑檔案:

&lt;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 級 ‧ 2016-03-11 17:53:44 檢舉

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

我要發表回答

立即登入回答