回 帖 发 新 帖 刷新版面

主题:[原创]技巧奉献:IVF中实现“代码自动补全”

初步调试成功,若有故障,反馈后俺再修改。
若其他网页有此技巧,则纯属巧合。

[color=FF0000]做法:[/color]

为保险起见,可在Microsoft Visual Studio 8中找到Samples.vsmacros做一个备份。

[color=800000][b](I) 修改宏命令[/b][/color]

在VS2005中选的宏资源管理器中装入Samples,选中打开DevStudio6Editor。

下面对其中的几条命令作修改:

[color=0000FF](1) Sub AutoCompleteFromFile中:
(改1) [/color]
        origLine = sel.CurrentLine
        origCol = sel.CurrentColumn
        sel.WordLeft(DsMovementOptions.dsExtend)
后添加        
[color=FF0000]        If origLine <> sel.CurrentLine Then
            sel.Cancel()
            sel.MoveToLineAndOffset(origLine, origCol)
            Exit Sub
        End If[/color]        
[color=0000FF](改2) [/color]
        FillCompletionWords(sel.Text)
        sel.MoveToLineAndOffset(origLine, origCol)
        sel.WordLeft(DsMovementOptions.dsExtend)
        SuggestNextCompletionWord()
改为
        [color=FF0000]If sel.Text <> previousSelection Or completionWords = "" Then[/color]
            FillCompletionWords(sel.Text)
            sel.MoveToLineAndOffset(origLine, origCol)
            sel.WordLeft(DsMovementOptions.dsExtend)
        [color=FF0000]End If[/color]
        SuggestNextCompletionWord()

[color=0000FF](2) Sub FillCompletionWords 中:
(改1)[/color] 
        searchString = "[^a-zA-Z0-9]" & word
改为
        [color=FF0000]searchString = "{^|[^a-zA-Z0-9_!%]}" & word[/color]

[color=0000FF](改2) [/color]
            sel.WordRight()
            sel.WordLeft(DsMovementOptions.dsExtend)
改为
            [color=FF0000]sel.WordLeft()
            sel.WordRight(DsMovementOptions.dsExtend)[/color]

[color=0000FF](3) Function SuggestNextCompletionWord中:[/color]

        selection.WordLeft(DsMovementOptions.dsExtend)
封掉
       [color=FF0000] 'selection.WordLeft(DsMovementOptions.dsExtend)[/color]


[color=800000][b](II) 添加工具钮、快捷键[/b][/color]

感谢hanronggui提供的方法:

VS2005中选:工具-自定义-命令中选择宏
在右边的面板中找到Samples.DevStudio6Editor.AutoCompleteFromFile,拖到工具栏上;
在“自定义”中点“修改选中的内容”按钮,
将名称改为:自动补码(&A);
关闭自定义

[color=FF0000]用法:[/color]
在当前的代码文件中,您键入一个字词的一两个字母,按该按钮或者快捷键Alt+a,则可启动该宏命令在你的文件中搜寻你要键入的字词,并自动补全显示;再按快捷键则显示下一个可选的字词。

例如,你当前的代码文件中有:

   implicit none
   integer :: ix,iy

则你键入i后,按快捷键,则自动将i补全为implicit,再按快捷键,则依次改换为integer=>ix=>iy=>implicit;
若你键入in后,按快捷键,则直接出现integer.


[color=FF0000][b]Enjoy![/b][/color]

回复列表 (共9个回复)

沙发

谢谢mltx老师的辛勤工作!!
发现一个问题,我用ivf自带的求积分的程序适了一下,在输入i后,用快捷键
不会出现integer,不知为什么?程序如下:
program int_sin
implicit none

! Create a value DP that is the "kind" number of a double precision value
! We will use this value in our declarations and constants.
integer, parameter :: DP = kind(0.0d0)

! Declare a named constant for pi, specifying the kind type
real(DP), parameter :: pi = 3.141592653589793238_DP 

! Declare interval begin and end
real(DP), parameter :: interval_begin = 0.0_DP
real(DP), parameter :: interval_end   = 2.0_DP * pi

real(DP) :: step, sum, x_i
integer :: N, i, j
real clock_start, clock_finish

write (*,'(A)') "  "
write (*,'(A)') "    Number of    | Computed Integral |"
write (*,'(A)') " Interior Points |                   |"
call cpu_time (clock_start)

do j=2,26
  write (*,'(A)') "--------------------------------------"
  N = 2**j
  ! Compute stepsize for N-1 internal rectangles 
  step = (interval_end - interval_begin) / real(N,DP);
  
  ! Approximate 1/2 area in first rectangle: f(x0) * (step/2) 
  sum = INTEG_FUNC(interval_begin) * (step / 2.0_DP)
 !  sum = INTEG_FUNC(interval_begin) *0.5_DP
  do i=1,N-1
    x_i = real(i,DP) * step
    ! Apply midpoint rule:
    ! Given length = f(x), compute the area of the
    ! rectangle of width step
    sum = sum + (INTEG_FUNC(x_i) * step)
!     sum = sum + abs(sin(x_i))
    end do
    
  ! Add approximate area in last rectangle for f(xN) * (step/2) 
  sum = sum + (INTEG_FUNC(interval_end) * (step / 2.0_DP))
!   sum = sum + (INTEG_FUNC(interval_end) * 0.5_DP)
!   sum=sum*step
  write (*,'(T5,I10,T18,"|",2X,1P,E14.7,T38,"|")') N, sum
  end do

call cpu_time(clock_finish)
write (*,'(A)') "--------------------------------------"
write (*,'(A)') "  "
write (*,*) "CPU Time = ",(clock_finish - clock_start), " seconds"

contains

! Function to integrate
real(DP) function INTEG_FUNC (x)
real(DP), intent(IN) :: x

INTEG_FUNC = abs(sin(x))
return
end function INTEG_FUNC

end program int_sin

板凳

谢谢mlxt的分享

1楼说的问题我也遇到了

另外在XP的任务栏图表中,执行宏命令时老是跳出单击此处停止宏命令的图标,还配有气球声音,呵呵,不知道有没有办法解决

再次表示感谢

3 楼

支持,谢谢。

4 楼

感谢楼上问题反馈。

找到了问题和解决放案。首贴中的一条改成如下即可:

(2) Sub FillCompletionWords 中:
(改1) 
        searchString = "[^a-zA-Z0-9]" & word
改为
        searchString = [color=FF0000]"{^|[^a-zA-Z0-9_!%]}" [/color]& word

首贴中已经改正了。

至于跳出气球的问题,暂时还没顾上。
应该属于环境设置问题,有了办法再来通报。
也许hanronggui可以有办法?


PS:微软应该把VS2005做这个Macro的人解雇!DevS6中好好的,都让他们转坏了!


5 楼

感谢mltx老师的修改。
2楼的问题我也不知道是为什么。
希望其它网友帮忙啊!!!

6 楼

严格安装楼主的办法改的。但新建一个.f90文件试了一下,不成功。


不知道哪里出了问题。就是没有提示和补全。请指教。

7 楼

楼主说的是对的,但是在低版本的不行

8 楼

我的是Microsoft Visual Studio 2005 Team + Intel Visual Fortran 10.1.
严格按楼主说的改的。但最终成功。不知咋回事!

9 楼

我的没有用

我来回复

您尚未登录,请登录后再回复。点此登录或注册